부속 질의 (SubQuery) 는 SQL 문 안에 다른 SQL 문이 중첩된 질의를 말합니다.
다른 테이블에서 가져온 데이터로 현재 테이블에 있는 정보를 찾거나 가공할 때 사용합니다.
예를들어서 고객 이름과 주문내역을 같이 보려면 Orders 테이블과 Customer 테이블을 연관시켜야합니다.
두 테이블의 관계를 토대로 특정 고객의 주문 내역을 확인하려면 조인 또는 부속 질의를 사용하면 됩니다.
- 조인을 사용할 경우 : Customer 테이블과 Orders 테이블의 고객번호로 조인한 후 필요한 데이터를 추출한다.
- 부속질의를 사용할 경우 : Customer 테이블에서 특정 고객의 고객 번호를 찾고, 찾은 고객번호를 바탕으로 Orders 테이블에서 확인한다.
[ 부속질의의 종류 ]
명칭 | 위치 | 영문 및 동의어 | 설명 |
중첩질의 | WHERE 절 | nested subquery, predicate subquery |
WHERE 절에 술어와 같이 사용되며 결과를 한정시키기 위해 사용된다. 상관 혹은 비상관 형태이다. |
스칼라 부속질의 | SELECT | scalar subquery | SELECT 절에서 사용되며 단일 값을 반환하기 때문에 스칼라 부속질의라고 한다. |
인라인 뷰 | FROM 절 | inline view, table subquery |
FROM 절에서 결과를 뷰(view) 형태로 반환하기 때문에 인라인 뷰라고 한다. |
1. 중첩질의 - WHERE 부속질의
중첩질의는 WHERE 절에서 사용되는 부속질의를 말합니다.
중첩질의는 주 질의에 사용된 자료 집합의 조건을 WHERE 절에 서술합니다.
주 질의의 자료 집합에서 한 행씩 가져와 부속질의를 수행하며, 연산 결과에 따라 WHERE 절의 조건이 참인지 거짓인지 확인하여 참일 경우 주 질의의 해당 행을 출력합니다.
술어 | 연산자 | 반환 행 | 반환 열 | 상관 |
비교 | = , > , < , >= , <= , <> | 단일 | 단일 | 가능 |
집합 | IN , NOT IN | 다중 | 다중 | 가능 |
한정 | ALL , SOME(ANY) | 다중 | 단일 | 가능 |
존재 | EXISTS, NOT EXISTS | 다중 | 다중 | 필수 |
비교 연산자
비교 연산자는 부속질의가 반드시 단일행, 단일열을 반환해야 하며, 아닐 경우 질의를 처리할 수 없습니다.
예시 ) 평균 주문금액 이하의 주문에 대해서 주문번호와 금액을 보이시오.
SELECT orderid, saleprice
FROM Orders
WHERE saleprice <= ( SELECT AVG(saleprice)
FROM Orders);
IN, NOT IN
IN 연산자에서 사용 가능한 부속질의는 결과로 다중행을 반환할 수 있습니다.
주 질의는 WHERE 절에 사용되는 속성값을 부속질의의 결과 집합과 비교해 하나라도 있으면 참입니다.
반면 NOT IN 연산자는 값이 존재하지 않으면 참이 됩니다.
예시 ) '대한민국'에 거주하는 고객에게 판매한 도서의 총판매액을 구하시오.
SELECT SUM(saleprice) "total"
FROM Orders
WHERE custid IN ( SELECT custid
FROM Customer
WHERE address LIKE '%대한민국%');
ALL , SOME(ANY)
ALL, SOME (ANY) 연산자는 비교 연산자와 함께 사용됩니다.
ALL 모든, SOME 은 어떠한 (최소한 하나라도) 이라는 의미를 가집니다. ANY 는 SOME 과 동일한 기능을 합니다.
예시 ) 3번 고객이 주문한 도서의 최고 금액보다 더 비싼 도서를 구입한 주문의 주문번호와 금액을 보이시오.
SELECT orderid, saleprice
FROM Orders
WHERE saleprice > ALL (SELECT saleprice
FROM Orders
WHERE custid ='3');
EXISTS, NOT EXISTS
EXISTS 와 NOT EXISTS 는 데이터의 존재 여부를 확인합니다.
주 질의에서 부속질의로 제공된 속성의 값을 가지고 부속질의의 조건을 만족하여 값이 존재하면 참이되고, 주 질의는 해당 행의 데이터를 출력합니다.
NOT EXISTS 의 경우 이와 반대로 동작합니다.
EXISTS 연산자는 다른 연산자와 달리 왼쪽에 스칼라값이나 열을 명시하지 않습니다.
때문에 반드시 부속질의에 주 질의 열이름이 제공되어야합니다.
예시 ) EXISTS 연산자를 사용하여 '대한민국'에 거주하는 고객에게 판매한 도서의 총판매액을 구하시오.
SELECT SUM(saleprice) "total"
FROM Orders od
WHERE EXISTS ( SELECT *
FROM Customer cs
WHERE address LIKE '%대한민국%' AND cs.custid = od.custid);
'Database > MS-SQL' 카테고리의 다른 글
격리수준 (ISOLATION)(1) (0) | 2024.09.24 |
---|---|
부속 질의 ( 스칼라 서브쿼리, 인라인 뷰) (0) | 2024.09.09 |
내장함수 (2) | Null 함수 (0) | 2024.08.26 |
내장 함수 (0) | 2024.08.15 |
[MS-SQL] 인덱스 (INDEX)란? (4) | 2024.08.12 |