서브쿼리(SUBQUERY)
쿼리 내부에 하나 이상의 쿼리가 더 있는 것
다시말해 SQL명령문에 포함된 SELECT 명령문
- 메인쿼리보다 먼저 실행 될 수 있고, 서브쿼리가 위치한 곳에 결과를 리턴
아래 예시는 단일행 서브쿼리이다.
다음 두개의 구문의 결과 값은 같다.
1 2 3 4 5 6 7 | select department_name from employees e, departments d where e.department_id = d.department_id and e.last_name = 'Seo'; select department_name from departments where department_id =(select department_id from employees where last_name = 'Seo'); | cs |
1 2 3 4 5 6 7 | select last_name, salary from employees where salary >= avg(salary); select last_name, salary from employees where salary >= (select avg(salary) from employees); | cs |
위의 구문에서는 첫번째 구문은 오류가 나지만 아래의 구문은 정상적으로 작동한다.
다음 두개의 예제를 보자
1 2 3 4 5 6 7 8 9 10 11 12 | select last_name, salary , trunc((select avg(salary) from employees),2) from employees where salary <= 2500; select last_name 이름, salary 연봉 , (select max(salary) from employees where department_id = 100) 최고연봉 , (select min(salary) from employees where department_id = 100) 최저연봉 , trunc(salary-(select avg(salary) from employees where department_id = 100)) 연봉차 from employees where department_id = 100; | cs |
이처럼 서브쿼리는 어느 위치에 들어가도 상관이 없다.
다중행 서브쿼리는 서브 쿼리에서 반환되는 결과가 하나 이상일 때 사용한다.
in 결과중 하나라도 일치하면 참
any, some 결과와 하나 이상 일치하면 참
all 결과와 모든 값이 일치하면 참
exists 결과 중에서 값이 있으면 참 메인쿼리 수행 없으면 거짓으로 메인쿼리 수행 안함
아래의 예시의 경우 서브쿼리문이 두개의 값을 반환하는데 이경우 다중행 서브쿼리를 사용하여야 결과가 정상적으로 나온다.
1 2 3 | select department_name from departments where department_id in (select department_id from employees where last_name = 'King'); | cs |
다음 예시를 참고하자
1 2 3 4 5 6 7 | select last_name, salary from employees where salary > all(select salary from employees where department_id = 100); select last_name, department_id from employees where exists (select department_id from departments where department_name = 'IS'); | cs |
다중행 서브쿼리와 단일행 서브쿼리를 주의하자.
SQL을 배운지 얼마 되지 않아 잘못된 내용이 있을 수 있습니다. 틀린 내용이있다면, 댓글로 달아주세요.
'DATABASE(oracleDB 11g) > SQL' 카테고리의 다른 글
[SQL]DML(Data Manupulation Language)의 기초 (0) | 2019.01.31 |
---|---|
[SQL]DDL(Data Definition Language) 의 기초 (0) | 2019.01.31 |
[SQL]계층적 질의 (0) | 2019.01.30 |
[SQL]GROUP BY의 확장 (0) | 2019.01.30 |
[SQL]집합연산자의 기초 (0) | 2019.01.30 |