2장_2절. 집합 연산자(SET OPERATOR)

1.개념
->두개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법중 하나가 집합연산자를 사용하는 방법이다. 기존의 조인에서는 FROM절과 WHERE절을 통해 데이터를 조회했다면, 집합 연산자는 여러 개의 질의결과를 연결하여 하나로 결합하는 방식을 사용한다.
->SELECT 절의 칼럼수가 동일하고 SELECT절의 동일위치에 존재하는 칼럼의 데이터 타입이 상호 호환가능(반드시 동일한 데이터타입일 필요는 없다)해야한다.

(1)UNION : 합집합, 중복된 행은 하나의 행으로 출력한다.
(2)UNION ALL : 합집합, 중복된 행을 그대로 출력한다. / 여러 질의 결과가 상호 배타적일때 사용.
(3)INTERSECT : 교집합
(4)EXCEPT : 차집합, 앞의 SQL문의 결과에서 뒤의 SQL문의 결과에 대한 차집합.

2. SQL문 형태
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명1
(WHERE 조건식)
((GROUP BY 칼럼이나 표현식)
(HAVING 그룹조건식))
집합연산자
SELECT 칼럼명1, 칼럼명2, ...
FROM 테이블명1
(WHERE 조건식)
((GROUP BY 칼럼이나 표현식)
(HAVING 그룹조건식))
ORDER BY 1,2 (ASC 또는 DESC);
=> 집합연산자는 어떤형태의 SELECT문도 사용가능하다. 집합연산자는 여러개의 SELECT문을 연결하는 것에 지나지 않는다. ORDER BY는 최종결과에 대한 정렬이므로 마지막 줄에 한번만 쓴다.

3. 집합 연산자를 연습하기 위한 질문
1) K리그 소속 선수들중 소속이 삼성인 선수와 전남인 선수들에 대한 내용을 모두 보기
2) K리그 소속 선수들중 소속이 삼성인 선수와 포지션이 골키퍼인 선수들에 대한 내용을 모두 보기
3) K리그 소속 선수 정보중 포지션별 평균키와 팀별 평균키를 보기
4) K리그 소속 선수들중 소속이 삼성인 선수이면서 포지션이 미드필더가 아닌선수의 정보 보기
5) K리그 소속 선수들중 소속이 삼성인 선수이면서 포지션이 골키퍼인 선수의 정보 보기

1) K리그 소속 선수들중 소속이 삼성인 선수집합과  전남인 선수들인 집합의 합집합
2) K리그 소속 선수들중 소속이 삼성인 선수집합과 포지션이 골키퍼인 선수집합의 합집합
3) K리그 소속 선수 정보중 포지션별 평균키집합과 팀별 평균키집합의 합집합
4) K리그 소속 선수들중 소속이 삼성인 선수집합과 포지션이 미드필더인 선수집합의 차집합
5) K리그 소속 선수들중 소속이 삼성인 선수집합과 포지션이 골키퍼인 선수집합의 교집합

4.쿼리문
1) K리그 소속 선수들중 소속이 삼성인 선수집합과  전남인 선수들인 집합의 합집합
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO
  2  FROM PLAYER
  3  WHERE TEAM_ID = 'K02'
  4  UNION(합집합)
  5  SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO
  6  FROM PLAYER
  7  WHERE TEAM_ID = 'K07';
또는
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO
  2  FROM PLAYER
  3  WHERE TEAM_ID IN('K07','K02');

2) K리그 소속 선수들중 소속이 삼성인 선수집합과 포지션이 골키퍼인 선수집합의 합집합
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO
  2  FROM PLAYER
  3  WHERE TEAM_ID = 'K02'
  4  UNION(합집합)
  5  SELECT TEAM_ID, PLAYER_NAME, POSITION, BACK_NO
  6  FROM PLAYER
  7  WHERE POSITION = 'GK';

3) K리그 소속 선수 정보중 포지션별 평균키집합과 팀별 평균키집합의 합집합
​SQL> SELECT 'P' 구분코드, POSITION, AVG(HEIGHT) 평균키
  2  FROM PLAYER
  3  GROUP BY POSITION
  4  UNION(합집합)
  5  SELECT 'T' 구분코드, TEAM_ID, AVG(HEIGHT) 평균키
  6  FROM PLAYER
  7  GROUP BY TEAM_ID
  8  ORDER BY 1;


4) K리그 소속 선수들중 소속이 삼성인 선수집합과 포지션이 미드필더인 선수집합의 차집합
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION
  2  FROM PLAYER
  3  WHERE TEAM_ID = 'K02'
   MINUS(차집합)
  5  SELECT TEAM_ID, PLAYER_NAME, POSITION
  6  FROM PLAYER
  7  WHERE POSITION = 'MF'
  8  ORDER BY 1,2,3;
또는
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION
  2  FROM PLAYER
  3  WHERE POSITION <> 'MF'(차집합)
  4  AND TEAM_ID = 'K02'
  5  ORDER BY 1,2,3;
또는
SQL> select team_id, player_name, position
  2  from player x
  3  where x.team_id = 'K02'
  4  and not exists
  5     (select 1 from player y
  6     where y.player_id = x.player_id
  7     and position = 'MF')ㄴ
  8  order by 1,2,3;


5) K리그 소속 선수들중 소속이 삼성인 선수집합과 포지션이 골키퍼인 선수집합의 교집합
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION
  2  FROM PLAYER
  3  WHERE TEAM_ID = 'K02'
  4  INTERSECT​(교집합)
  5  SELECT TEAM_ID, PLAYER_NAME, POSITION
  6  FROM PLAYER
  7  WHERE POSITION = 'GK'
  8  ORDER BY 1,2,3;
또는
SQL> SELECT TEAM_ID, PLAYER_NAME, POSITION
  2  FROM PLAYER
  3  WHERE TEAM_ID = 'K02'
  4  AND PLAYER_ID IN
  5     (SELECT PLAYER_ID
  6     FROM PLAYER
  7     WHERE POSITION = 'GK')
  8  ORDER BY 1,2,3;

댓글

이 블로그의 인기 게시물

1장_1절 관계형 데이터베이스 개요

1장_2절 DDL(Data Definition Language : 데이터 정의어)

1장_5절. Where 조건절