-
[PostgreSQL] UNION/ INTERSECT/ EXCEPTSQL 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
'SQL' 카테고리의 다른 글
[PostgreSQL] NULL 값 대체하기 - COALESCE (0) 2021.08.24 [PostgreSQL] GROUPING SETS/ CUBE/ ROLLUP (0) 2021.08.18 [SQL] SQL Query 쿼리문 (3) - CASE, SubQuery(feat. IN, EXISTS) (0) 2021.07.26 [MySQL] 프로그래머스 SQL 고득점 Kit - String, Date (0) 2021.07.11 [MySQL] 프로그래머스 SQL 고득점 Kit - JOIN (0) 2021.07.11