DATABASE(oracleDB 11g)/SQL

[SQL]서브쿼리(SUBQUERY)의 기초

SEUNGSAMI 2019. 1. 30. 16:13

서브쿼리(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