서브 쿼리 개요

–하나의 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

참조 : https://itwiki.kr/w/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%84%9C%EB%B8%8C_%EC%BF%BC%EB%A6%AC

 

데이터베이스 서브 쿼리 - IT위키

다중행 서브쿼리 서브쿼리의 실행결과가 여러 건인 서브쿼리 다중행 비교연산자 (IN, ALL, ANY, SOME, EXISTS)와 함께 사용

itwiki.kr

 

+ Recent posts