부속질의 - SQL문 안의 SQL문

 

<스칼라 부속질의 / SELECT,UPDATE >

SELECT 절에서 사용되는 부속질의로, 부속질의의 결과 값을 단일 행, 단일 열의 스칼라 값으로 반환

스칼라 부속질의는 원칙적으로 스칼라 값이 들어갈 수 있는 모든 곳에 사용 가능하며, 일반적으로 SELECT 문과 UPDATE SET 절에 사용

주질의와 부속질의와의 관계는 상관/비상관 모두 가능

-- 주문테에 각 주문에 맞게 가져오는 행을 새로운 행으로 추가

UPDATE 	주문테 주
SET 	새로운 행 = ( SELECT 가져오는 행
   FROM 가져오는테 가 
   WHERE 가.아이디 = 주.아이디 );

 

<인라인 뷰 / FROM >

FROM 절에서 사용되는 부속질의

테이블 이름 대신 인라인 부속질의를 사용하면 보통의 테이블과 같은 형태로 사용

부속질의 결과 반환되는 데이터는 다중 행, 다중 열이어도 상관없음

다만 가상의 테이블인 뷰 형태로 제공되어 상관 부속질의로 사용될 수는 없음

SELECT 	고.이름, SUM(주.가격) "총합"
FROM 	(SELECT 고객아이디, 이름
	 FROM  고객테이블 
	 WHERE 고객아이디 <= 2) 고,
	 주문 주
WHERE 	고.고객아이디 = 주.고객아이디
GROUP BY 고.이름;

 

<중첩질의 / WHERE >

중첩질의(nested subquery)WHERE 절에서 사용되는 부속질의

WHERE 절은 보통 데이터를 선택하는 조건 혹은 술어(predicate)와 같이 사용. 그래서 중첩질의를 술어 부속질의(predicate subquery)

SELECT	열이름
FROM     	테이블이름1
WHERE    	공통열이름 IN (SELECT    공통열이름
                           	FROM    테이블이름2);
          
-- 문장의 해석은 우측하단에서 좌측상단으로 

 

합집합 UNION, 차집합 EXCEPT, 교집합 INTERSECT

-- 구매하지 않은 고객구하기
SELECT 	고객이름열
FROM 	고객테이블 -- 전체 고객에서
EXCEPT -- 차집합
SELECT 	고객이름열
FROM 	고객테이블
WHERE 	고객구분열 IN (SELECT 고객구분열
	              FROM  구매테이블); -- 구매한 고객

 

EXISTS는 원래 단어에서 의미하는 것과 같이 조건에 맞는 튜플이 존재하면 결과에 포함

(부속질의문의 어떤 행이 조건에 만족하면 참인 반면 NOT EXISTS는 부속질의문의 모든 행이 조건에 만족하지 않을 때만 참)

-- 주문이 있는 고객의 이름
SELECT 	이름열
FROM 	고객테이블 고
WHERE 	EXISTS (SELECT *
	           FROM  주문테이블 주
	           WHERE 고.고객아이디 = 주.고객아이디);

 

'코딩 공부 > SQL' 카테고리의 다른 글

<8> 데이터의 추가,수정, 삭제  (0) 2021.04.13
<7> 테이블 CREATE, ALTER, DROP  (0) 2021.04.13
<5> JOIN  (0) 2021.03.20
<4> GROUP BY +HAVING  (0) 2021.03.18
<3> WHERE  (0) 2021.03.12

+ Recent posts