[DB] 집합 연산자: UNION, INTERSECT, EXCEPT

젠니·2023년 5월 27일
0

데이터베이스

목록 보기
14/21

7. 집합 연산자

여러 개의 결과를 하나로 결합한다.

Union compatible 할 때 가능하다.

  • SELECT 절의 컬럼 수가 동일해야한다.
  • SELECT 절의 동일 위치에 존재하는 컬럼의 데이터 타입이 상호 호환할 수 있어야한다. (동일할 필요는 x)

UNION, UNION ALL (합집합)

Format

SELECT 		[ALL|DISTINCT] {{컬럼명 [[AS] 컬럼_별칭],}⁺|*}
FROM 		테이블_리스트
[WHERE 		투플_조건식]
[GROUP BY 	컬럼명 [HAVING 그룹_조건식]]
{UNION [DISTINCT|ALL]} | INTERSECT | EXCEPT
SELECT 		[ALL|DISTINCT] {{컬럼명 [[AS] 컬럼_별칭],}⁺|*}
FROM 		테이블_리스트
[WHERE 		투플_조건식 ]
[GROUP BY 	컬럼명 [HAVING 그룹_조건식]]
[ORDER BY 	{컬럼명|컬럼_별칭|컬럼_위치 [ASC|DESC],}⁺];
[LIMIT 		[OFFSET,] row_count];

'결과테이블 + 결과테이블' 이라고 보면 된다.
SELECT는 default가 ALL이고, UNION은 default가 DISTINCT 이다.
ORDER BY 부터는 출력순서를 결정하는 것이다.

Example
K02 팀 혹은 K07 팀 선수들을 검색해라.

SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		TEAM_ID = 'K02'
UNION
SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		TEAM_ID = 'K07'
ORDER BY 	선수명;

PLAYER 테이블에서 TEAM_ID가 K02인 선수의 정보를 뽑고 + PLAYER 테이블에서 TEAM_ID가 K07인 선수의 정보를 뽑고, ORDER BY 선수명으로 정렬한다.

다음과 같이 OR/IN 연산으로 표현 가능하다.

SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		TEAM_ID = 'K02' OR TEAM_ID = 'K07'
ORDER BY 	선수명;

소속이 K02 팀 선수들 혹은 포지션이 골키퍼(GK)인 선수들을 모두 검색해라.

SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		TEAM_ID = 'K01'
UNION ALL
SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		POSITION = 'GK'
ORDER BY 	팀코드, 선수명;

UNION ALL을 사용하면 이렇게 중복제거 없이 다 보일 수 있다.

선수들의 포지션별 평균키와 팀별 평균키를 검색해라.

SELECT 		'P' 구분코드, POSITION 포지션, AVG(HEIGHT) 평균키
FROM 		PLAYER
GROUP BY 	POSITION
UNION
SELECT 		'T' 구분코드, TEAM_ID 팀명, AVG(HEIGHT) 평균키
FROM 		PLAYER
GROUP BY 	TEAM_ID
ORDER BY 	1;

구분코드는 둘다 String, 포지션(String:VARCHAR) 팀명(String:CHAR) 이므로 상호호환, 평균키는 둘다 Int 이므로 Union compatible 하다.

INTERSECT (교집합)

MySQL에서는 제공하지 않기 때문에 AND/IN+서브쿼리로 표현 가능하다.

Example
소속이 K02 팀이면서 포지션이 GK인 선수들을 검색해라.

SELECT 		TEAM_ID 팀코드, PLAYER_NAME 선수명, POSITION 포지션,
			BACK_NO 백넘버, HEIGHT 키
FROM 		PLAYER
WHERE 		TEAM_ID = 'K02' AND POSITION = 'GK'
ORDER BY 	1, 2, 3, 4, 5;

EXCEPT (차집합)

MySQL에서는 제공하지 않기 때문에 AND/NOT IN+서브쿼리로 표현 가능하다.

Example

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;

<>는 !=과 같다.

profile
젠니의 개발 라이푸우

0개의 댓글