35일차 SELECT문/ 제네릭과 람다

쿠우·2022년 5월 13일
0

1.SELECT문의 사용

(1)SELECT문 모든 행을 선택해서 생성!
(2)SELECT문 일부 행을 선택해서 생성! (스키마 미리 확인해서 선택)
(3)SELECT문의 산술연산 활용
(4)SELECT문의 더미테이블

-- ******************************************************
-- SELECT 문의 기본구조와 각 절의 실행순서
-- ******************************************************
--  - Clauses -                 - 실행순서 -
--
-- SELECT clause                    (5)  생량 불가능 Oracle 안에서 (ORDER가 나오면 항상 마지막에서 2번째로 수행)
-- FROM clause                      (1)  생략 불가능 Oracle 안에서
-- [WHERE clause]                   (2)  생략가능
-- [GROUP BY clause]                (3)  생략가능
-- [HAVING clause]                  (4)  생략가능
-- [ORDER BY clause]                (6)  생략가능 항상 마지막 수행
-- ******************************************************

-- ------------------------------------------------------
--        *** SELECT 문의 기본문법 구조 ***
-- ------------------------------------------------------
-- SELECT [DISTINCT] { *, column [AS] [alias], ... }      
-- ->[] 안에오면 생략가능 {}안에오면 설명 /SELECT 보여줄 컬럼을 정해서 보여준다 /*= 모든것을 선택하겠다.

-- FROM <테이블명>  
-- -> <>안에 오면 필수 / FROM은 테이블의 행을 하나씩 추출해서 SELECT절에 줌 
-- ------------------------------------------------------

-- ------------------------------------------------------
-- 1. To project all columns of the table
-- ------------------------------------------------------
-- SELECT *
-- FROM table;
-- ------------------------------------------------------

DESC EMPLOYEES --무슨 속성을 가지고 있는지 테이블 속성 등 테이블 스키마 확인 방법

SELECT 
    EMPLOYEE_ID,
    LAST_NAME,
    HIRE_DATE,
    SALARY
FROM EMPLOYEES;

-- ------------------------------------------------------
-- 3. 산술연산자의 활용 ( +, - , *, / )
-- ------------------------------------------------------
-- SELECT column1 + column2 FROM table;
-- SELECT column1 - column2 FROM table;
-- SELECT column1 * column2 FROM table;
-- SELECT column1 / column2 FROM table;
-- ------------------------------------------------------

SELECT
    SALARY,
    SALARY + 100 
FROM EMPLOYEES;


SELECT
    SALARY,
    SALARY - 100
FROM EMPLOYEES;

SELECT
    SALARY,
    SALARY * 100
FROM EMPLOYEES;

SELECT
    SALARY,
    SALARY / 100
FROM EMPLOYEES;

SELECT
    last_name,
    salary,   --봉급 속성
    salary * 12  --연봉 속성
FROM
    employees; --직원테이블 


-- ------------------------------------------------------
-- 4. About SYS.DUAL table -- Dummy table.
-- ------------------------------------------------------
-- SYS account owns this DUAL table.
-- If you don't need a table, the DUAL table needed.
-- ------------------------------------------------------
DESC sys.dual; -- 객체참조 연산자를 사용 dual의 소속을 적는다.  
DESC dual; --생략은 나중에 배운다.
--Name	Null?	Type
--DUMMY		VARCHAR2(1)



SELECT
    245 * 567 -- 테이블이 필요없는 연산
FROM 
    dual;   -- 더미 테이블/SELECT절에서 테이블이 필요없을때 FROM을 생략불가하니 추가하는 무의미한 테이블


    
SELECT
    *
FROM
    dual;

SELECT
    * 
FROM
    sys.dual;

2. SELECT문 별칭, NULL값

(1)SELECT문 AS 별칭
(2)SELECT문 AS 별칭의 규칙
(3)SELECT문 속성 데이터의 NULL값
(4)SELECT문 속성 NULL값의 기본값


-- ------------------------------------------------------
-- 1. 특정 컬럼에 alias(별칭) 만들기
-- ------------------------------------------------------
-- SELECT column1 [[as] alias]
-- FROM table;
-- ------------------------------------------------------


SELECT
    last_name ,
    salary ,
    salary * 12 
FROM
    employees;
    
    -- 테이블에 속성에 이름부여 알리아스(별칭) AS 키워드여서 대문자로 해줘야함 
    SELECT 
    last_name AS 이름,
    salary 월급,
    salary * 12 AS 연봉
FROM
    employees;


-- ------------------------------------------------------
-- 2. To test alias including special characters or whitespaces
-- ------------------------------------------------------
-- (Whitespace: 공백문자, 탭문자 등)
-- Caution) In this case, you should use double quotation mark("")
-- ------------------------------------------------------

SELECT
    last_name AS 이름, --사원 이름 이렇게하면 오류남 /공백이나 특수문자,대소영문 구분 등 있을때는 > / "사원 이름" 오류안남 
    salary 월급, -- '사원 월급'싱글은 오류남 "사원 월급" 더블로 해야함. 이미 목적이 정해져 있다. 자바와 같지 않음.
    salary * 12 AS 연봉 
FROM
    employees;


-- ------------------------------------------------------
-- 3. NULL 값 이해하기
-- ------------------------------------------------------
--    분석입장에서는, "결측치(Missing Value)"라고 함.
--    이러한 결측치가 발생하는 경우는,
--       (1) 실험측정시, 측정이 안되는 경우
--       (2) 실험측정장치의 오동작
--       (3) 관찰로 얻어지는 경우라면, 관찰이 안된 경우
--       (4) 관찰자(사람)의 실수 등 다양함
-- ------------------------------------------------------
-- * Caution: To test NULL
-- ------------------------------------------------------

SELECT 
    EMPLOYEE_ID 직원코드, -- AS 키워드 생략
    LAST_NAME 이름,
    JOB_ID  직업코드,
    COMMISSION_PCT 수수료
FROM
    EMPLOYEES;


SELECT
    last_name 이름,
    salary 월급,
    commission_pct 수수료, 
    salary * 12 + commission_pct AS 연봉 --수술료가 NULL이어서 연봉이 NULL 
FROM
    employees;


-- ------------------------------------------------------
-- 4. NULL 값의 기본값 처리: NVL() 함수 사용하기
--    결측치의 처리: 분석에서는, 결측치 처리가 매우 다양하고
--                  사용방법에 따라, 통계량이 변경되기 때문에
--                  매우 주의해서 처리함
--
--    결측치 처리예: 대표값(= 특성값) - 평균/중위수/최빈값/
--                         합계/제거!/보간(interpolation)
-- ------------------------------------------------------
-- * Caution: To use NVL(column, defaultValue) built-in function
-- ------------------------------------------------------
SELECT
    last_name 이름,
    salary 월급,
    commission_pct 수수료,
    (salary*12) * (1+NVL(commission_pct,0)) AS 연봉 --NVL(속성명,기본값)
FROM
    employees;

3.SELECT문 || 연산자와 WHERE절

(1)SELECT문 문자열속성과 || 연산자를 통한 날짜,숫자속성결합
(2)SELECT문 문자열속성과 리터럴속성의 || 통한 결합
(3)SELECT문 || 연산자와 WHERE절을 이용한 체크조건통한 조회

-- ------------------------------------------------------
-- 1. Concatenation Operator: ||
-- ------------------------------------------------------
-- SELECT column1 || column2 2개의 컬럼의 값을 연결해버림
-- FROM table;
-- ------------------------------------------------------
-- (1) 문자열 + 숫자
SELECT 
    last_name || salary AS "이름 월급"
FROM
    employees;
    
- (2) 문자열 + 날짜
SELECT
    last_name || hire_date AS "이름 월급"
FROM
    employees;

-- (2) 문자열 + 날짜
SELECT
    last_name || hire_date || salary AS "이름 월급" -- 문자열 날짜 숫자 해놓으면 전부 문자열로 먹힌다. 
FROM
    employees;

--(1) 숫자 
--(2) 문자열 
--(3) 날짜

--Oracle 자동형변환(promotion 발생) 
-- <날짜> <--형변환가능--> <문자열> <--형변환가능--><숫자> / <날짜> --형변환불가--<숫자>


-- ------------------------------------------------------
-- 2. Concatenation Operator: ||
-- ------------------------------------------------------
-- SELECT column || literal
-- FROM table;
-- ------------------------------------------------------
-- (3) 문자열 + 리터럴(문자열)
SELECT
    last_name || '사원'
FROM
    employees;



-- ------------------------------------------------------
-- 3. Concatenation Operator: ||
-- ------------------------------------------------------
-- SELECT column1 || literal || column2 || literal || column3
-- FROM table;
-- ------------------------------------------------------

SELECT
    last_name || '의 직업은 ' || job_id || ' 입니다.' AS "사원별 직급"
FROM 
    employees;


SELECT
    last_name || ' 의 직업은 ' || job_id
FROM
    employees
WHERE --1차 필터링 : 행을 필터링 
    last_name = 'Smith';    -- << check 조건이라고 부름   // sql에서는 == 이 아닌 = 동등비교연산자

4.SELECT문 DISTINCT명령어

SELECT문 DISTINCT명령어를 통한 컬럼의 중복제거


-- ------------------------------------------------------
-- 1. To remove duplicated data (중복제거)
-- ------------------------------------------------------
-- SELECT DISTINCT column1[, column2, ..., columnN]
-- FROM table;
-- ------------------------------------------------------
SELECT
    job_id
FROM
    employees;


SELECT
    DISTINCT job_id -- SELECT절에 나열된 ~~ 컬럼에 대하여 중복을 제거
FROM
    employees;


SELECT
    DISTINCT last_name, first_name --나열된 컬럼에 대해서 중복을 판단한다. 두개의 컬럼을 합친 조건이 해당되어야함 따라서 107개 나옴
-- SELECT DISTINCT * -- 107개나옴 
FROM
    employees;

5. SELECT문 where절에서 비교연산자와 BETWEEN통한 조건체크

(1)SELECT문 where절에서 비교연산자를 통한 체크조건을 거쳐 조회
(2)SELECT문 where절에서 BETWEEN a AND b > a와 b 사이를 조회

-- ------------------------------------------------------
-- 1. Comparison Operators (비교연산자)
-- ------------------------------------------------------
-- 1. operand1  =   operand2
-- 2. operand1  !=  operand2, 
--    operand1  <>  operand2, 
--    operand1  ^=  operand2
-- 3. operand1  >   operand2
-- 4. operand1  <   operand2
-- 5. operand1  >=  operand2
-- 6. operand1  <=  operand2
-- ------------------------------------------------------
SELECT
    employee_id,
    last_name,
    job_id,
    salary
FROM
    employees
WHERE
    salary >= 10000;


SELECT
    employee_id,
    last_name,
    job_id,
    salary
FROM
    employees
WHERE
   last_name = 'King';
-- WHERE
--     last_name = 'KING';


-- Date output format: RR/MM/DD only in the oracle SQL*Developer
SELECT
    employee_id,
    last_name,
    salary,
    hire_date
FROM
    employees

-- <NUMBER> <-> <CHARACTER> <-> <DATE> 간에는,
-- 자동형변환이 됨!!! (*****)

-- 따라서, 아래의 조건식은 <DATE> > <CHARACTER> 의 비교식으로
-- 자동형변환에 의해, 당연히 비교가 가능해짐!
WHERE 
   hire_date > '07/12/31';     

-- 자동형변환을 포기하고, 강제형변환 함수인 to_date()로 직접
-- DATE 타입으로 형변환시켜서, 비교하는 이유는: 가독성 확보
-- WHERE
--     hire_date > to_date('07/12/31', 'RR/MM/DD');


-- ------------------------------------------------------
-- 2. BETWEEN operator: 
-- ------------------------------------------------------
-- WHERE column BETWEEN start AND end ( start <= X <= end )
-- ------------------------------------------------------
SELECT
    employee_id,
    last_name,
    salary,
    hire_date
FROM
    employees
WHERE
    salary BETWEEN 7000 AND 8000;


SELECT 
    employee_id, 
    last_name, 
    salary, 
    hire_date
FROM 
    employees
--      OK only on the Oracle SQL*Developer       
WHERE 
    hire_date BETWEEN '07/01/01' AND '08/12/31';          
    
-- WHERE 
--     hire_date 
--         BETWEEN to_date('07/12/31', 'RR/MM/DD') 
--         AND to_date('08/12/31', 'RR/MM/DD');

제네릭 람다!!

제네릭 다형성과 와일드카드


public class WildCardExample2 {
	
	//잊지맙시다!: 제네릭타입이 매개변수의 타입으로 지정되면 ==>"사용"이다!!
//	public static void rehisterCourse(Course<?> course) {
	// 와일드 카드 타입 (구체타입으로 그 어떤 참조타입이든 수용하겠다는 의미)
	
//	public static void rehisterCourse(Course<? extends Student> course) {
	// 와일트카드의 제약1 학생을 상속받는 객체만 등록가능

	public static void rehisterCourse(Course<? super Student> course) {
	//와일드 카드의 제약2 학생의 부모 객체만 등록가능
	
	// 와일드카드를 사용하면서 깨달은 것 제네릭자체가 자손이 되는건 허용이 안되기 때문에 범위를 정해줌	
		
		System.out.println(course.getName() + "수강생: " + Arrays.toString(course.getStudents()));
	} // registerCourse
	

	
	public static void main(String[] args) {
		
		
		// Generic Class : Course<T>
		Course<Person> personCourse = new Course<Person>("일반인과정", 5); 
		
//		 다형성-1: 부모타입의 참조변수에는, 모든 자식객체가 대입가능하다!!
//		 add(T t) => add (Person t)
		personCourse.add(new Person("일반인"));
		personCourse.add(new Worker("직장인"));
		personCourse.add(new Student("학생"));
		personCourse.add(new HighStudent("고등학생"));
		
		System.out.println(personCourse);
		
//		------
		
		Course<Worker> workerCourse = new Course<>("직장인과정",5);
		
		workerCourse.add(new Worker("직장인"));
		
//		workerCourse.add(new Person("일반인"));
//		workerCourse.add(new Student("학생"));
//		workerCourse.add(new HighStudent("고등학생"));
		
		System.out.println(workerCourse);
		

//		------
		
		Course<Student> studentCourse = new Course<>("학생과정",5);
		
		studentCourse.add(new HighStudent("고등학생"));
		studentCourse.add(new Student("학생"));
		
		System.out.println(studentCourse);
		

//		------

		Course<HighStudent> highStudentCourse = new Course<>("고등학생과정",5);
		
		highStudentCourse.add(new HighStudent("고등학생"));
		
		System.out.println(highStudentCourse);
		
	
//		---------
		
		
//		rehisterCourse(highStudentCourse);
		rehisterCourse(studentCourse);
//		rehisterCourse(workerCourse); >> 와일드카드에 제약을 줘서 오류 
		rehisterCourse(personCourse); 
	}// main 

}//end class

중요포인트 와일드카드의 이유 제네릭메소드타입을 통해 제네릭타입 클래스의 매개변수를 받을 때 제네릭끼리의 다형성은 적용이 안된다.

익명구현객체와 람다기본!

---------------------------------<익명구현객체>-------------------------------
	public static void main(String[] args) {
		
//		Runnable task  = new Runnable() {
//			
//			@Override
//			public void run() {
//				;;		
//			}// run
//		}; //익명구현객체 코딩기법
	
 ---------------------------------<람다식>---------------------------
		
		
		Runnable task = () -> {System.out.println("람다요!");};
		// Lamda Expression 
		
		System.out.println(task);
		task.run();
		
	} // main
	

public class tttt {

	public static void main(String[] args) {
		//람다식의 구현대상 ===> 함수적 인터페이스이다!!
		
		//람다식의 구현대상이 되는, 함수적 인터페이스를 해당 람닥식의 "Target Type"이라 부른다.
		
		
	}// main

}// end class


<함수형 인터페이스>
@FunctionalInterface
interface OurInterface{
	
	public static final double PI =3.14159; // 상수와는 무관하다.
	
	public default void defaultMethod() {;;} // default메소드와는 무관하다.   
	public static void staticMethod() {;;} //  static 메소드와도 무관하다. 
	
	
	public abstract void abstractMethod();
//	public abstract void abstractMethod2(); -> 오류 펑셔널 인터페이스 선언해서 추상메소드 1개만 가질 수있음
}// end interface

다음주에 이어서 한다 하심!
중요한점! 람다는 스트림을 통한 객체구조를 위해 반드시 알고 가야한다 !.

profile
일단 흐자

0개의 댓글