by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

제2절 집합 연산자




집합 연산자

두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회하는 방법 중에 또 다른 방법이 있는데 그 방법이 바로 집합 연산자(Set Operator)를 사용하는 방법이다.
종류는 아래와 같다.

집합 연산자 연산자의 의미
UNION 여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다.
UNION ALL 여러 개의 SQL문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉, 단순히 결과만 합쳐놓은 것이다. 일반적으로 여러 개의 결과가 상호 배타적인(Exclusive)일 때 많이 사용한다. 개별 SQL문의 결과가 서로 중복되지 않는 경우, UNION과 결과가 동일한다. (결과의 정렬 순서에는 차이가 있을 수 있음)
INTERSECT 여러 개의SQL문의 결과에 대한 교집합이다. 중복된 행은 하나의 행으로 만든다.
EXCEPT 앞의 SQL문의 결과에서 뒤의 SQL문의 결과에 대한 차집합이다. 중복된 행은 하나의 행으로 만든다. (일부 데이터베이스는 MINUS를 사용함)

UNION EXAMPLE

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';

UNION ALL EXAMPLE

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

INTERSECTIN EXAMPLE

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' 
ORDER BY 1, 2, 3, 4, 5; 

MINUS EXAMPLE

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' 
ORDER BY 1, 2, 3, 4, 5; 

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.
  1. 3월 29, 2013

    이준우 says:

    이번에 일하는데 테이블이 추가되면서 union all 로 추가된 테이블을 연결한 적이 있습니다. select .. from (select * ...

    이번에 일하는데 테이블이 추가되면서 union all 로 추가된 테이블을 연결한 적이 있습니다.
    select ..
    from (select *
    from tb01
    union all
    select *
    from tb02) a
    , tbxx b
    , tbxx c
    where ...

    이런식으로 된 쿼리에서 tb02 를 추가한건데 뷰머지가 되서 조건을 잘 탈 줄 알았는데 알고봤더니
    union 등은 뷰머지가 안되더군요. 다행히 조건절 진입은 되서 성능은 어느정도 나오는거 같네요.
    set 오퍼레이션 쓰실때는 이런 것도 생각하셔서 작업하시면 좋을 것 같습니다.

    1. 3월 29, 2013

      이가혜 says:

      11g에서는 View Merge 된다고 본 듯 합니다~!! 아마 될꺼에요~~~~ 근데.. 위의 View 머지의 조인은 어떤걸 의미 하시는건지....

      11g에서는 View Merge 된다고 본 듯 합니다~!! 아마 될꺼에요~~~~

      근데.. 위의 View 머지의 조인은 어떤걸 의미 하시는건지..
      현재 보면.. View가. Merge는 안돼도.. Join은 될꺼 같은데....
      혹시 Join Push Pred를 말씀하시는건가요?

      아.. 졸려서.. 내가 이해를 못하는 건가? ㅎㅎ

      1. 4월 04, 2013

        이재현 says:

        대장?? 우선 조건절 푸쉬드 및 조인절 푸쉬드가 실패하면 머징을 시도하는 걸로 알고있는데... 11g 부터는 먼저 머징을 시도하고 실패하면 ...

        대장??

        우선 조건절 푸쉬드 및 조인절 푸쉬드가 실패하면 머징을 시도하는 걸로 알고있는데...

        11g 부터는 먼저 머징을 시도하고 실패하면 푸쉬드가 발생한다는 말씀인가요??

        아님 11g는 머징이 가능하다고 말씀하시는건가요??

  2. 3월 29, 2013

    배성환 says:

    옛날때 준우형이 말하는거처럼 쿼리욜라마니만들었는데 뷰머징된걸로기억..9i rbo 엿슴 아닌가-_-;;

    옛날때
    준우형이 말하는거처럼
    쿼리욜라마니만들었는데
    뷰머징된걸로기억..9i rbo 엿슴

    아닌가-_-;;