자격증/SQLD

[SQLD] SQL 활용 - 집합연산자 (SET OPERATOR)

숭코기 2023. 8. 31. 17:15
728x90

01. 집합 연산자(SET OPERATOR)

  • 두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 수 있다
  • 집합 연산자는 2개 이상의 질의 결과를 하나의 결과로 만들어 준다
  • SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 한다
집합 연산자 연산자의 의미
UNION 여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다.
UNION ALL 여러 개의 SQL문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시 된다.
즉, 단순히 결과만 합쳐 놓은 것이다.
INTERSECT 여러 개의 SQL문의 결과에 대한 교집합이다.
중복된 행은 하나의 행으로 만든다.
EXCEPT 앞의 SQL문의 결과에서 뒤에 SQL문의 결과에 대한 차집합이다.
중복된 행은 하나의 행으로 만든다.

SELECT 칼럼명1, 칼럼명2
FROM 테이블명1
[WHERE 조건식]
[[GROUP BY 칼럼이나 표현식 [HAVING 그룹조건식]]]
집합 연산자
SELECT 칼럼명1, 칼럼명2
FROM 테이블명2
[WHERE 조건식]
[[GROUP BY 칼럼이나 표현식 [HAVING 그룹조건식]]]
[ORDER BY 1, 2 [ASC or DESC]];

 

 

02. 합집합 (UNION, UNION ALL)

UNION

[질문]
K-리그 소속 선수들 중에서 소속이 삼성블루윙즈팀인 선수들과 전남드레곤즈팀인 선수들에 대한 내용을 모두 보고싶다.
k-리그 소속 선수 중 소속이 삼성블루윙즈 팀인 선수들의 집합과 K-리그 소속 선수중 
소속이 전남드레곤즈팀인 선수들의 합집합

1.
SELECT PLAYER_NAME 선수명, BACK_NO 백넘버
FROM PLAYER WHERE TEAM_ID = 'K02'
UNION
SELECT PLAYER_NAME 선수명, BACK_NO 백넘버
FROM PLAYER WHERE TEAM_ID = 'K07'
ORDER BY 1;


2.
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'K02' OR TEAM_ID = 'K07'
ORDER BY 1;

-- 1번 SQL문과 2번 SQL문은 똑같은 집합이지만 출력순서가 다르다. 
-- 순서를 같게 하려면 ORDER BY절에서 임의로 순서를 조정할 수 있다.

 

UNION ALL

SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID = 'K02'
UNION ALL
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE POSITION = 'GK'
ORDER BY 1, 2, 3, 4, 5;

-- 결과를 보면 팀 K02의 GK인 사람이 중복됨을 알 수 있다.
-- UNION만 사용해서 출력할 때 행은 88개였지만 UNION ALL을 사용하면 92건으로 늘어났다.

 

 

03. 교집합 (INTERSECT)

[질문]
K-리그 선수들 중에서 소속이 삼성블루윙즈팀이면서 포지션이 골키퍼(GK)인 선수들의 정보를 보고싶다.
K-리그 소속 선수 중 소속이 삼성블루윙즈 팀인 선수들의 집합과 K-리그 소속 선수 중 포지션이 골키퍼인
선수들의 교집합

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;

 

04. 차집합 (EXCEPT)

[질문]
K-리그 소속 선수들 주에서 소속이 삼성블루윙즈팀이면서 포지션이 미드필더(MF)가 아닌 선수들의 정보를 보고싶다.
K-리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수들의 집합과 K-리그 소속 선수 중 포지션이 미드필더인
선수들의 교집합


1.
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;

2.
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;
728x90