서브 쿼리 개요
–하나의 SQL 명령문의 결과를 다른 SQL 명령문에 전달하기 위해 두 개 이 상의 SQL 명령문을 하나의 SQL명령문으로 연결하여 처리하는 방법
단일행 서브 쿼리
– 서브 쿼리에서 단 하나의 행만을 검색하여 메인 쿼리에 반환하는 질의문
– 메인 쿼리의 WHERE 절에서 서브 쿼리의 결과와 비교할 경우에는 반드시 단일행 비교 연산자 중 하나만 사용해야 함
– 서브 쿼리의 결과로 하나의 행만이 출력되어야 함
다중 행 서브 쿼리
–서브 쿼리에서 반환되는 결과행 이하나 이상일 때 사용하는 서브 쿼리
–메인 쿼리의 WHERE 절에서 서브 쿼리의 결과와 비교할 경우에는 다중행 비교 연산자를 사용하여 비교
다중행 비교 연산자: IN, ANY, SOM, ALL, EXISTS
다중행 비교 연산자는 단일행 비교 연산자와 결합하여 사용 가능
종류 | 의미 |
IN | 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 하나라도 일치하면 참,'='비교만 가능 |
ANY, SOME | 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 하나라도 일치하면 참, '='만 비교만 가능 |
ALL | 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 모든값이 일치하면 참 |
EXISTS | 메인 쿼리의 비교 조건이 서브쿼리의 결과중에서 만족하는 값이 하나라도 존재하면 참 |
IN 연산자를 이용한 다중행 서브 쿼리
- 메인 쿼리의 비교조건에서 서브 쿼리의 출력 결과와 하나라도 일치하면 메인 쿼리 조건절이 참이 되는 연산자
- '='연산자를 OR로 연결한 것과 같은 의미
ANY 연산자를 이용한 다중행 서브 쿼리
- 메인 쿼리의 비교조건에서 서브 쿼리의 출력 결과와 하나라도 일치하면 메인 쿼리 조건절이 참이 되는 연산자
– '>, <'등과 같은 범위 비교도 가능
- ANY 연산자를 이용한 서브 쿼리의 예
ALL 연산자를 이용한 다중 행 서브 쿼리
-메인 쿼리의 비교조건에서 서브 쿼리의 검색 결과와 모두 일치하면 메인 쿼리 조건절이 참이 되는 연산자
–ANY 연산자와 차이점
'> ANY': 서브 쿼리 결과 중에서 최솟값보다 크면 메인 쿼리의 비교조건이 참
'> ALL': 서브 쿼리의 결과 중에서 최댓값보다 크면 메인 쿼리의 비교조건이 참
EXISTS 연산자를 이용한 다중행 서브 쿼리
– 서브 쿼리에서 검색된 결과가 하나라도 존재하면 메인 쿼리 조건절이 참이 되는 연산자
– 서브 쿼리에서 검색된 결과가 존재하지 않으면 메인 쿼리의 조건절은 거짓
NOT EXISTS
- EXISTS와 상반되는 연산자
- 서브 쿼리에서 검색된 결과가 하나도 존재하지 않으면 메인 쿼리의 조건절이 참이 되는 연산자
다중 칼럼 서브 쿼리
– 서브 쿼리에서 여러 개의 칼럼 값을 검색하여 메인 쿼리의 조건절과 비교하는 서브 쿼리
– 메인 쿼리의 조건절에서도 서브 쿼리의 칼럼 수만큼 지정해야 함
PAIRWISE : 칼럼을 쌍으로 묶어서 동시에 비교하는 방식
UNPAIRWISE : 칼럼 별로 나누어서 비교한 후, AND 연산을 하는 방식
PAIRWISE 다중 칼럼 서브 쿼리
– 메인 쿼리와 서브 쿼리의 비교대상 칼럼을 쌍으로 묶어서 행별로 비교하는 방법
– 메인 쿼리와 서브 쿼리에서 비교하는 칼럼의 수는 반드시 동일해야 함
SELECT column_list
FROM table1
WHERE (column1, column2, ...) IN(SELECT column1, colun2, ...
FROM table2
WHERE condition);
UNPAIRWISE 다중 칼럼 서브 쿼리
– 메인 쿼리와 서브 쿼리의 비교대상 칼럼을 분리하여 개별적으로 비교한 후 AND 연산에 의해 최종 결과를 출력
– 각 칼럼이 동시에 만족하지 않더라도 개별적으로 만족하는 경우에는 비교조건이 참이 되어 결과를 출력 가능
SELECT column_list
FROM table1
WHERE column1 IN(SELECT column1
FROM table2
WHERE condition)
AND column2 IN(SELECT column2
FROM table2
WHERE condition);
상호 연관 서브 쿼리
–메인 쿼리 절과 서브 쿼리 간에 검색 결과를 교환하는 서브 쿼리
–메인 쿼리와 서브 쿼리 간의 결과를 교환하기 위하여 서브 쿼리의 WHERE 조건절에서 메인 쿼리의 테이블과 연결
SELECT column_list
FROM table1
WHERE [column | expression] operator
(SELECT [column | expression]
FROM table2
WHERE table2.column operator table1.column);
서브 쿼리 사용 시 주의사항
– 복수행 값을 반환하는 서브 쿼리와 단일행 비교 연산자 함께 사용하는 경우
– 반환되는 칼럼의 수와 메인 쿼리에서 비교되는 칼럼수가 일치하지 않는 경우
– 복수행을 출력하는 서브 쿼리와'='단일행 연산자로 비교하는 경우
ORDER BY절 사용
– 서브쿼리 내에서ORDER BY 절 사용하면 오류 발생
- 서브쿼리의 결과가 NULL인경우
Scalar Subquery
데이터베이스 서브 쿼리 - IT위키
다중행 서브쿼리 서브쿼리의 실행결과가 여러 건인 서브쿼리 다중행 비교연산자 (IN, ALL, ANY, SOME, EXISTS)와 함께 사용
itwiki.kr