-> 블로그 이전

[SQLD] 2-11. 집합연산자

2021. 11. 1. 17:23Certificate`/SQLD

집합 연산자 종류

집합 연산자 의미
UNION - 합집합
- 중복된 행을 하나의 행으로 만듦
UNION ALL - 합집합 + 중복된 행도 그대로 표시
- 단순히 결과만 합쳐놓은 것
- 여러 질의 결과가 베타적일 때 사용
- 개별 SQL문의 결과가 중복되지 않을 경우, UNION과 결과가 동일 (정렬 순서에는 차이가 있을 수도 있음)
INTERSECT - 교집합
- 중복된 행을 하나의 행으로 만듦
MINUS/EXCEPT - 차집합
- 중복된 행을 하나의 행으로 만듦

집합 연산자의 연산

≫ UNION

- SELECT ~ UNION SELECT ~ / 두 SELECT절 연결 (합집합)

- WHERE 절에 IN/OR 연산자로 변환 가능

- 중복이 존재할 경우, 중복을 제외

SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K02' AND HEIGHT >=185
UNION
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID = 'K07' AND HEIGHT >=185; 
----------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE (TEAM_ID = 'K02' OR TEAM_ID = 'K07') AND HEIGHT >=185;
----------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER
WHERE TEAM_ID IN ('K02','K07') AND HEIGHT >=185;

 

≫ UNION ALL

- 중복된 결과 제외 X

UNION (88행) / UNION ALL (92행)

≫ INTERSECT

- SELECT ~ INTERSECT SELECT ~ / 두 SELECT절 간에 공통 집합(교집합)

- EXISTS / IN서브쿼리로 변환 가능

SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE TEAM_ID = 'K02'
INTERSECT
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE POSITION = 'GK'
ORDER BY 1,2,3,4,5;
----------------------------------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER X
WHERE TEAM_ID = 'K02' 
AND EXISTS (SELECT 1 FROM PLAYER Y WHERE X.PLAYER_ID = Y.PLAYER_ID AND Y.POSITION = 'GK')
ORDER BY 1,2,3,4,5;
----------------------------------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE TEAM_ID = 'K02' 
AND PLAYER_ID IN (SELECT PLAYER_ID FROM PLAYER WHERE POSITION = 'GK')
ORDER BY 1,2,3,4,5;

 

≫ MINUS/EXCEPT

- SELECT ~ MINUS SELECT ~ / 두 SELECT절 S1-S2 (차집합)

- NOT EXISTS / NOT IN서브쿼리/논리연산자(<>)로 변환 가능

SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE TEAM_ID = 'K02'
MINUS
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE POSITION = 'MF'
ORDER BY 1,2,3,4,5;
----------------------------------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE TEAM_ID = 'K02' AND POSITION <> 'MF'
ORDER BY 1,2,3,4,5;
----------------------------------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER X
WHERE TEAM_ID = 'K02' 
AND NOT EXISTS (SELECT 1 FROM PLAYER Y WHERE Y.PLAYER_ID = X.PLAYER_ID AND POSITION = 'MF')
ORDER BY 1,2,3,4,5;
----------------------------------------------------------------------------------
SELECT TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션, BACK_NO 백넘버, HEIGHT 키
FROM PLAYER 
WHERE TEAM_ID = 'K02' 
AND PLAYER_ID NOT IN (SELECT PLAYER_ID FROM PLAYER WHERE POSITION = 'MF')
ORDER BY 1,2,3,4,5;