서브쿼리란?
서브쿼리 ( sub query ) 란 select 문 안에 다시 select 문이 기술된 형태의 쿼리 ( query ) 이다. 서브쿼리 ( 하위 select 문 )의 결과를 메인 쿼리 ( 상위 select 문 ) 에서 받아 처리하는 구조이기 때문에 중첩된 쿼리라고도 부른다. 서브쿼리의 결과는 메인 쿼리의 조건으로 사용된다.
select 열 이름1, 열 이름2,
from 테이블 이름
where 조건식 연산자
( select 열 이름1, 열 이름2,
from 테이블 이름
where 조건식 )
서브쿼리 사용 규칙
- 서브쿼리는 괄호로 묶어서 사용. 메인쿼리는 괄호 필요 x
- 메인 쿼리와 서브쿼리를 연결하기 위해 단일 행 연산자나 다중 행 연산자를 사용
- 메인 쿼리와 서브쿼리의 연결 형태는 연산자에 따라 의미가 다름
- 메인 쿼리는 연산자의 왼쪽에 기술하고 서브쿼리는 연산자의 오른쪽에 기술.
- 서브 쿼리에서 메인 쿼리의 순서로 select 문이 실행
- 서브 쿼리에서 서브쿼리를 추가하여 계속 중첩하여 SQL문을 작성할 수 있음.
서브쿼리의 종류!
종류 |
설명 |
단일 행 서브쿼리 |
하나의 행을 검색하는 서브 쿼리 |
다중 행 서브쿼리 |
하나 이상의 행을 검색하는 서브 쿼리 |
다중 열 서브쿼리 |
하나 이상의 열을 검색하는 서브 쿼리 |
서브쿼리의 종류에 따라 사용하는 연산자의 종류
연산자 |
종류 |
사용처 |
단일 행 연산자 |
=, >, >=, <, <=, <>, != |
단일 행 서브쿼리, 다중 열 서브쿼리 |
다중 행 연산자 |
IN, NOT IN, EXISTS, ANY, ALL |
다중 행 서브쿼리, 다중 열 서브쿼리 |
예제테이블1 ( user )
index |
name |
level |
salary |
1 |
홍길동 |
3 |
600 |
2 |
고길동 |
5 |
300 |
3 |
아무개 |
3 |
200 |
4 |
루피 |
7 |
900 |
5 |
이기영 |
5 |
450 |
6 |
호빵맨 |
4 |
170 |
7 |
세균맨 |
4 |
1300 |
예제테이블2 ( user2 )
index |
name |
birth |
level |
weight |
salary |
1 |
홍길동 |
990101 |
1 |
59 |
600 |
2 |
고길동 |
960303 |
2 |
95 |
300 |
3 |
아무개 |
020507 |
1 |
66 |
200 |
4 |
루피 |
950330 |
1 |
65 |
900 |
5 |
이기영 |
870604 |
2 |
73 |
450 |
6 |
호빵맨 |
900617 |
4 |
59 |
170 |
7 |
세균맨 |
901208 |
4 |
103 |
1300 |
단일 행 서브쿼리
서브쿼리 select 문에서 얻은 한 개 행의 결과값을 메인 쿼리로 전달하는 서브쿼리.
SELECT * FROM user WHERE salary > (SELECT MIN(salary) FROM user2 WHERE LEVEL = 2)
index |
name |
level |
salary |
1 |
홍길동 |
3 |
600 |
4 |
루피 |
7 |
900 |
5 |
이기영 |
5 |
450 |
7 |
세균맨 |
4 |
1300 |
다중 행 서브쿼리
다중 행 서브쿼리의 사용법은 단일 행 서브쿼리와 같다. 다중 행 서브쿼리는 하나 이상의 결과 행을 메인 쿼리에 전달하는 경우에 사용하며 다중 행 연산자를 사용
연산자 |
설명 |
예 |
IN |
같은 값 |
IN(10, 20) => 10, 20을 포함 |
NOT IN |
다른 값 |
NOT IN(10, 20) => 10이나 20을 포함하지 않음 |
ANY |
최소한 하나라도 만족하는지 여부 ( OR ) |
ANY(10, 20) 10이나 20 포함 |
ALL |
모두 만족하는지 여부 ( AND ) |
ALL(10, 20) => 10과 20을 모두 포함 |
SELECT * FROM user WHERE salary < ALL (SELECT salary FROM user2 WHERE LEVEL = 2)
이해를 돕기위한 서브쿼리 결과
SELECT salary FROM user2 WHERE LEVEL = 2
결과
index |
name |
level |
salary |
3 |
아무개 |
3 |
200 |
6 |
호빵맨 |
4 |
170 |
서브쿼리의 결과가 다중 행이면서 값이 여러개이다. 즉 서브쿼리를 사용한 메인 쿼리를 해석해보면
user1의 salary가 300보다 작고, 450보다 작은 데이터들이다. ( AND )