ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [PostgreSQL] UNION/ INTERSECT/ EXCEPT
    SQL 2021. 8. 11. 16:55

     

     

     

     

     

    UNION, INTERSECT, EXCEPT 

     

     

     

     

    UNION, INTERSECT, EXCEPT 두 개 또는 그 이상의 쿼리 결과를 하나로 결합해서 보여주기 위해 사용합니다.

    주의할 점은 두 쿼리 결과의 칼럼 수와 순서가 동일해야 하며, 각 칼럼의 데이터 타입은 호환 가능해야 한다는 것입니다. 

     

     

     

     

     

    • UNION/ UNION ALL

     

    두 개 이상의 쿼리 결과를 단지 결합해서 하나의 결과로 보여주기 위해서 UNION을 사용합니다. 

    두 쿼리 결과를 합해서 보여주다 보면 중복되는 열(row)이 있을 수 있는데,

    중복 열을 없애고 하나로만 보여주고 싶다면 UNION을, 중복 열도 모두 결과로 받고자 한다면 UNION ALL을 사용하면 됩니다. 

    SELECT c1, c2, c3 
    FROM tableA
    UNION (ALL)
    SELECT c1, c2, c3 
    FROM tableB;

     

    • Example - staff와 customer의 이름과 성, 직원/고객 여부를 하나의 테이블로 구성 (PostgreSQL sample database 사용)
    select first_name, last_name, 'Staff' as flag
    from staff
    union
    select first_name, last_name, 'Customer' as flag
    from customer
    order by 3 desc  # 결과 정렬을 위한 order by 는 가장 마지막에 위치

     

     

     

     

     

    • INTERSECT

     

    INTERSECT는 첫 번째 쿼리 결과와 두 번째 쿼리 결과에서 공통적으로 나타나는 열(row)을 결과로 반환해 줍니다. 

    두 쿼리 결과를 집합으로 생각하면 교집합 부분을 결과로 하는 것입니다. 

    SELECT c1, c2, c3
    FROM tableA
    INTERSECT
    SELECT c1, c2, c3
    FROM tableB;

     

    • Example - 고객과 배우 중 이름이 동일한 사람이 있는지 여부 확인 (PostgreSQL sample database 사용)
    select first_name, last_name
    from actor
    intersect
    select first_name, last_name
    from customer

     

     

     

     

     

    • EXCEPT

     

    EXCEPT는 두 쿼리 결과의 차집합을 결과로 반환해 주는 것으로, 

    두 쿼리 결과를 비교해서 첫 번째 쿼리 결과에만 해당하고, 두 번째 쿼리 결과에는 해당하지 않는 열(row)을 결과로 보여줍니다. 

    SELECT c1, c2, c3
    FROM tableA
    EXCEPT
    SELECT c1, c2, c3
    FROM tableB;

     

    • Example - R 등급 영화를 찍은 적이 있지만, 출연 영화가 30편 미만인 배우의 ID (PostgreSQL sample database 사용)
    select actor_id
    from film_actor 
    where film_id in (select film_id from film where rating = 'R')
    except 
    select actor_id
    from film_actor 
    group by actor_id
    having count(film_id) >= 30

     

     

     

     

     

     

Designed by Tistory.