본문 바로가기

Study/SQL전문가가이드

2.2 집합 연산자(SET OPERATOR)

두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중에 또 다른 방법은 바로 집합 연산자를 사용하는 방법!

집합연산자는 여러 개의 질의의 결과를 연결하여 하나로 결합하는 방식을 사용.

 

서로 다른 테이블에서 유사한 형태의 결과를 반환하는 것을 하나의 결과로 합치고자 할 때와 동일 테이블에서 서로 다른 질의를 수행하여 결과를 합치고자 할 때 사용함, 이 외에도 튜닝관점에서 실행계획을 분리하고자 하는 목적으로도 사용 가능

 

집합연산자 제약조건>

- 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