두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중에 또 다른 방법은 바로 집합 연산자를 사용하는 방법!
집합연산자는 여러 개의 질의의 결과를 연결하여 하나로 결합하는 방식을 사용.
서로 다른 테이블에서 유사한 형태의 결과를 반환하는 것을 하나의 결과로 합치고자 할 때와 동일 테이블에서 서로 다른 질의를 수행하여 결과를 합치고자 할 때 사용함, 이 외에도 튜닝관점에서 실행계획을 분리하고자 하는 목적으로도 사용 가능
집합연산자 제약조건>
- SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능해야 함 (반드시 동일할 필요X)
▷집합연산자의 종류
- UNION
여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다
- UNION ALL
여러 개의 SQL문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉 단순히 결과만 합쳐놓은 것
- INTERSECT
여러 개의 SQL문의 결과에 대한 교집합 (중복된 행은 하나의 행으로)
- EXCEPT
앞의 SQL문의 결과에서 뒤의 SQL문의 결과에 대한 차집합 (중복된 행은 하나의 행으로)
집합연산자 SYNTAX
SELECT 촬럼명 1, 칼럼명 2 ...
FROM 테이블명 1
[WHERE 조건식 ]
[[GROUP BY 칼럼 (Column) 이나 표현식
[HAVING 그룹조건식 ]]
집합연산자
SELECT 촬렴명 1 , 칼렴명 2 ,
FROM 테이블명 2
[WHERE 조건식 ]
[[GROUP BY 칼럼 (Column) 이냐 표현식
[HAVING 그룹조건식 ]]
[ORDER BY 1, 2 [ASC또는 DESC ] ’
[집합 연산자를 연습하기 위한 질문]
1) K- 리그 소속 선수들 중에서 소속이 삼성블루윙즈팀인 선수들과 전남드레곤즈팀인 선수들에 대한 내용을 모두 보고 싶다.
2) K- 리그 소속 선수들 중에서 소속이 삼성블루윙즈팀인 선수들과 포지션이 골키퍼 (GK) 인 선수들을 모두 보고 싶다.
3) K- 리그 소속 선수들에 대한 정보 중에서 포지션별 명균키와 팀별 평균키를 알고 싶다.
4) K- 리그 소속 선수를 중에서 소속이 삼성블루윙즈팀이면서 포지션이 미드필더 (MF) 가 아닌 선수들의 정보를 보고 싶다.
5) K- 리그 소속 선수들 중에서 소속이 삼성블루윙즈팀이연서 포지션이 골키퍼 (GK) 인 선수들의 정보를 보고 싶다.
[질문을 집합 연산의 개념으로 해석한 결과]
1) K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수들의 집합과 K- 리그 소속 선수 중 소속이 전남드레곤즈팀인 선수들의 집합의 합집합
2) K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수들의 집합과 K- 리그 소속 선수 중 포지션이 골키퍼 (GK) 인 선수들의 집합의 합집합
3) K- 리그 소속 선수 중 포지션별 평균키에 대한 집합과 K- 리그 소속 선수 중 팀별 평균키에 대한 집합의 합집합
4) K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수들의 집합과 K- 리그 소속 선수 중 포지션이 미드필더 (MF) 인 선수들의 집합의 차집합
5) K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수들의 집합과 K- 리그 소속 선수 중 포지션이 콜키퍼 (GK) 인 선수들의 집합의 교집합
질문]
1) K- 리그 소속 선수들 중에서 소속이 삼성블루윙즈팀인 선수들과 전남드레곤즈팀인 선수들에 대한 내용을 모두보고 싶다
=> K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수들의 집합과 K- 리그 소속 선수 중 소속이 전남드레곤즈팀인 선수들의 집합의 합집합
쿼리]
1) 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'
질문]
2) K- 리그 소속 선수들 중에서 소속이 삼성블루윙즈팀인 선수들과 포지션이 골키퍼 (GK) 인 선수틀을 모두 보고 싶다
=> K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수틀의 집합과 K- 리그 소속 선수 중 포지션이 을키퍼 (GK) 인 선수들의 집합의 합집합
쿼리]
2) 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 POSITION='GK'
질문]
3) K- 리그 소속 선수들에 대한 정보 중에서 포지션별 명균키와 팀별 평균키를 알고싶다
=> K- 리그 소속 선수 중 포지션별 명균키에 대한 집합과 K- 리그 소속 선수 중 팀별 명균키에 대한 집합의 합집합
쿼리]
3) SELECT 'P' 구분코드, POSITION 포지션, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY POSITION
UNION
SELECT 'T' 구분코드, TEAM_ID 팀명, AVG(HEIGHT) 평균키
FROM PLAYER
GROUP BY TEAM_ID
질문]
4) K- 리그 소속 선수를 중에서 소속이 삼성블루윙즈팀이면서 포지션이 미드필더 (MF)가 아닌 선수들의 정보를 보고 싶다
=> K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수플의 집합과 K- 리그 소속선수 중 포지션이 미드필더 (MF)인 선수들의 집합의 차집합
쿼리]
4) 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'
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID='K02'
AND POSITION <> 'MF'
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER X
WHERE X.TEAM_ID='K02'
AND NOT EXISTS (SELECT 1 FROM PLAYER Y
WHERE Y.PLAYER_ID=X.PLAYER_ID AND POSITION='MF')
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER X
WHERE X.TEAM_ID='K02'
AND PLAYER_ID NOT IN (SELECT PLAYER_ID FROM PLAYER
WHERE POSITION='MF')
질문]
5) K- 리그 소속 선수를 중에서 소속이 삼성블루윙즈팀이면서 포지션이 골키퍼 (GK) 인 선수들의 정보를 보고 싶다
=> K- 리그 소속 선수 중 소속이 삼성블루윙즈팀인 선수플의 집합과 K- 리그 소속선수 중 포지션이 골키퍼 (GK)인 선수들의 집합의 교집합
쿼리]
5) 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'
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER
WHERE TEAM_ID='K02'
AND POSITION='GK'
SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO, HEIGHT
FROM PLAYER X
WHERE X.TEAM_ID='K02'
AND EXISTS (SELECT 1 FROM PLAYSER Y
WHERE Y.PLAYER_ID=X.PLAYER_ID AND Y.POSITION='GK')
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')
'Study > SQL전문가가이드' 카테고리의 다른 글
2.4 서브쿼리 (0) | 2015.11.18 |
---|---|
2.3 계층형 질의와 셀프 조인 (0) | 2015.11.18 |
2.1 표준조인(Standard Join) (0) | 2015.11.17 |
1.4 관계 (0) | 2015.08.06 |
1.3 속성 (0) | 2015.08.06 |