여러 개의 결과를 하나로 결합한다.
Union compatible 할 때 가능하다.
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 하다.
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;
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;
<>는 !=과 같다.