☞ SUBQUERY의 개념 |
|
ㅇ SUBQUERY : 하나의 SELECT(SQL)문 안에 포함되어 있는 SELECT 문장 ㅇ SUBQUERY의 종류 : Nested Subquery, Correlated Subquery ㅇ SUBQUERY의 문항 : Subquery는 괄호로 묶여 있어야 합니다. : Subquery구문에서는 ORDER BY절을 포함할 수 없습니다. : Subquery는 일반적으로 연산자의 오른쪽에 위치합니다. : Subquery에서 사용할 수 있는 연산자의 종류에는 - 단일행 연산자(=, >, >=, <, <=, <>) - 복수행연산자 (IN ,ANY , ALL , NOT IN , ... )가 있습니다.
|
|
ㅇ Single Row Subquery : Subquery에서 Main Query로 전달되는 행이 단 하나인 경우 |
|
ㅇ Multi Column Subquery : Subquery구문을 작성할 때 WHERE절에서 비교하는 컬럼이 하나가 아니라 여러 개의 컬럼을 동시에 비교하는 경우를 말하며 이런 경우 Pairwise되었다라고 함. |
|
ㅇ Scalar Subquery : Subquery에 의해 하나의 행, 하나의 칼럼 값이 Return 되어지는 경우를 말함. |
|
ㅇ Correated Subquery : Main에서 자신의 데이터를 넘겨주고 Subquery가 이를 처리하여 돌려주는 방식 : Main의 각 행에 대해 마지막 행에 도달할 때까지 반복 수행되는 Subquery |
|
|
☞ Single Row Subquery |
|
예시) SQL>SELECT name, title , dept_id FROM EMPLOYEE WHERE dept_id = ( SELECT dept_id FROM EMPLOYEE WHERE name = ‘김용학’ ) ;
|
☞ Multi Row Subquery |
|
1) IN : 한번에 여러 OR로 동일(=)하기 비교하는 연산자 예시) SQL>SELECT name, dept_id FROM s_emp WHERE dept_id IN ( SELECT dept_id FROM s_dept WHERE region_id =3 ) ;
2) ANY(ALL) : 값을 Subquery에 의해 반환되는 각각의 값과 비교 예시) 직책이 사원이 아니면서 사원이 받고 있는 어떤(모든) 급여보다도 적은 급여를 받는 사원의 이름, 급여, 직책을 나타내시오. SQL> SELECT name, salary, title FROM EMPLOYEE WHERE salary < ANY ( SELECT salary FROM EMPLOYEE WHERE title = '사원' ) AND title <> '사원' ; ※ = ANY는 IN과 동일
예시)SQL> SELECT name , salary , title FROM EMPLOYEE WHERE salary < ALL ( SELECT salary FROM EMPLOYEE WHERE title = '사원' ) AND title <> '사원' ; ※ ALL는 최대값보다 큼을, < ALL는 최소값보다 적음을 나타낸다. |
☞ Multi Column Subquery |
|
예시) 각 부서별로 최소급여를 받는 사원의 이름, 부서번호, 급여를 나타내시오. SQL> SELECT name, dept_id, salary FROM EMPLOYEE WHERE (salary,dept_id) IN (SELECT MIN(salary),dept_id FROM EMPLOYEE GROUP BY dept_id ); |
☞ Scalar Subquery |
|
예시 1) SQL> SELECT name, salary , (SELECT AVG(salary) FROM EMPLOYEE ) avg_sal FROM EMPLOYEE ;
예시 2) SQL> SELECT name, salary , CASE WHEN salary > ( SELECT avg(salary) FROM EMPLOYEE) THEN salary * 1.1 ELSE salary*1.2 END bonus , title FROM EMPLOYEE ;
예시 3) SQL> SELECT id , name , dept_id FROM EMPLOYEE e WHERE salary >= 2500 ORDER BY ( SELECT name FROM T_dept d WHERE e.dept_id = d.dept_id ) ; |
☞ Correated Subquery |
|
SQL> SELECT name, salary ,dept_id FROM EMPLOYEE outer WHERE salary < (SELECT AVG(salary) FROM EMPLOYEE WHERE dept_id = outer.dept_id ) ;
※ 바로 2번째 Line의 Outer라는 테이블 Alias를 5번 Line에서 사용하게 되면 내부적으로 Correlated Subquery의 진행방식을 따르게 됨.
ㅇ 연산자 EXIST, NOT EXISTS 예시) SQL> SELECT id, name , title , dept_id FROM EMPLOYEE o WHERE EXISTS ( SELECT 'X' FROM EMPLOYEE WHERE manager_id = o.id ) ;
예시) SQL> SELECT id, name , title , dept_id FROM EMPLOYEE WHERE id IN ( SELECT manager_id FROM EMPLOYEE WHERE manager_id IS NOT NULL ) ; |
|
|
|