[SQLD] 2-11. 집합연산자
2021. 11. 1. 17:23ㆍCertificate`/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
≫ 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;