충분히 쌓여가는
08 다중 행 서브 쿼리 본문
다중 행 서브 쿼리
서브 쿼리에서 반환되는 결과가 2행 이상인 경우
IN 문
WHERE 절에 있는 IN 문의 소괄호가 서브 쿼리를 안고 있다.
WHERE 문에 사용하는 다중 행 서브 쿼리의 기본 형식
SELECt [열 이름]
FROM [테이블]
WHERE [열] IN (SELECT [열] FROM [테이블])
단일 행 서브 쿼리와 다중 행 서브 쿼리 비교
SELECT * FROM nasdaq_company
WHERE symbol IN ('MSFT', 'AMD', 'AMZN');
SELECT * FROM nasdaq_company
WHERE symbol IN (SELECT symbol FROM nasdaq_company WHERE symbol IN ('MSFT', 'AMD', 'AMZN'));
서브 쿼리에서 검색된 3개의 행이 메인 쿼리의 조건으로 사용된 것을 알 수 있다.
3개의 테이블을 사용해 조인하는 쿼리를 IN 문 서브 쿼리를 사용해 변경한 것(IN 사용)
WHERE 문에 사용한 서브 쿼리 안에서 2개의 테이블을 조인한 결과 행을 IN 문에 적용
-- 3개 테이블 조인
SELECT
a.industry,
c.symbol,
c.company_name,
c.ipo_year,
c.sector
FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
INNER JOIN nasdaq_company AS c ON b.symbol = c.symbol
WHERE a.industry = N'자동차'
ORDER BY symbol;
-- IN 문 서브 쿼리
SELECT
*
FROM nasdaq_company
WHERE symbol IN (
SELECT symbol FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
WHERE a.industry = N'자동차');
WHERE 문에 사용한 IN 문에 NOT 연산자를 추가해 다른 테이블의 값과 일치하지 않는 행을 찾을 수도 있다.
NOT IN 문으로 industry 그룹이 '자동차'가 아닌 행을 검색
-- NOT IN 문 서브 쿼리
SELECT
*
FROM nasdaq_company
WHERE symbol NOT IN (
SELECT symbol FROM industry_group AS a
INNER JOIN industry_group_symbol AS b ON a.num = b.num
WHERE a.industry = N'자동차');
ANY 문
서브 쿼리 결과에서 값이 하나라도 만족하는 조건을 검색한다.
비교 연산자가 잘못 쓰인 듯 보일 수도 있지만, ANY 문을 함께 사용했으므로 서브 쿼리의 결괏값이 여러 개여도 일치하는 모든 행을 주 쿼리에서 검색해 반환할 수 있다.
= ANY의 형태로 서브 쿼리 결괏값과 비교해 값은 값을 반환
SELECT * FROM nasdaq_company
WHERE symbol = ANY (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT', 'AMD', 'AMZN')
);
< ANY 형태로 서브 쿼리 결과와 비교해 최솟값을 반환
SELECT * FROM nasdaq_company
WHERE symbol < ANY (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT', 'LTCH', 'ZY')
);
> ANY 형태로 서브 쿼리 결과와 비교해 최댓값을 반환
SELECT * FROM nasdaq_company
WHERE symbol > ANY (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT', 'LTCH', 'ZY')
);
EXIST 문
조건의 결과값이 있는지 없는지를 확인해 1행이라도 있으면 TRUE, 없으면 FALSE를 반환한다.
WHERE 문에 EXISTS 문을 사용해 서브 쿼리의 결괏값이 1행이라도 있으면 TRUE가 되어 메인 쿼리를 실행하고, 메인 쿼리가 작성된 전체 데이터를 검색하는 쿼리
SELECT * FROM nasdaq_company
WHERE EXISTS (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT', 'AMD', 'AMZN')
);
서브 쿼리의 결괏값이 0건 반환되면 FALSE이므로 메인 쿼리가 실행되지 않고 아무것도 나타나지 않을 것
SELECT * FROM nasdaq_company
WHERE EXISTS (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('123', '456', '789')
);
NOT EXISTS
EXISTS와 반대로 작동한다.
다중 행 서브 쿼리: NOT EXISTS 문의 결괏값이 TRUE 일 때
SELECT * FROM nasdaq_company
WHERE NOT EXISTS (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('123', '456', '789')
);
ALL 문
서브 쿼리 결괏값에 있는 모든 값을 만족하는 조건을 주 쿼리에서 검색해 결과를 반환.
다중 행 서브 쿼리: ALL 문 사용
서브 쿼리의 결괏값 모두를 만족하는 결과가 주 쿼리의 결괏값에 없으므로 아무것도 나오지 않는다.
SELECT * FROM nasdaq_company
WHERE symbol = ALL (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT', 'AMD', 'AMZN')
);
다중 행 서브 쿼리: ALL 문 사용
서브쿼리에 만족하는 결과 출력됨
SELECT * FROM nasdaq_company
WHERE symbol = ALL (
SELECT symbol FROM nasdaq_company
WHERE symbol IN ('MSFT')
);
'MSSQL > 테이블을 서로 통합하는 조인' 카테고리의 다른 글
10 SELECT 문에 서브 쿼리 사용하기 (2) | 2024.10.14 |
---|---|
09 FROM 문에 서브 쿼리 사용 (0) | 2024.10.14 |
07 단일 행 서브 쿼리 (1) | 2024.10.09 |
06 서브 쿼리 (1) | 2024.10.09 |
05 셀프 조인 (7) | 2024.10.09 |