Database/MS-SQL

부속 질의 ( 서브 쿼리 )

ㅈㅣ니 2024. 9. 2.

 

부속 질의 (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