sungyup's.

PostgreSQL / SQL Basics / 1.7 Unions and Set

1.7Unions and Set

UNION과 Set Operator(집합 연산자)를 활용해 복잡한 조건 조합한 쿼리 만들기

TL;DR

추억의 쪽지 시험

UNION과 Set 연산자를 활용한 결과 조합

쿼리 하나로 원하는 결과를 다 가져오기 어려울 때, 서로 다른 여러 쿼리의 결과를 합쳐 보여주는 방법이 필요하다.

이때 사용하는 것이 Set Operators(집합 연산자)이다.

예를 들어, 다음과 같은 조건을 모두 만족하는 제품들을 보고 싶다고 하자.

  • 가장 비싼 상위 4개 제품
  • 가격 / 무게 값이 높은 상위 4개 제품
  • 두 조건에 모두 해당되는 제품은 한 번만 보여주기

이 경우는 쿼리 두 개를 합한 것으로 볼 수 있다.

1. 가격 기준 상위 4개 제품

sql
SELECT * FROM products ORDER BY price DESC LIMIT 4;

2. 가격 대비 효율(가격/무게) 기준 상위 4개 제품

sql
SELECT * FROM products ORDER BY price / weight DESC LIMIT 4;

이렇게 서로 다른 두 쿼리를 합하는 키워드UNION이다.

sql
( SELECT * FROM products ORDER BY price DESC LIMIT 4 ) UNION ( SELECT * FROM products ORDER BY price / weight DESC LIMIT 4 );
  • UNION은 두 쿼리에서 조회된 데이터들 중 같은 데이터가 있으면(중복) 한 건만 보여준다.
  • 괄호는 명확성을 위해 권장되지만 필수는 아니다.
  • UNION ALL로 조회하면 중복건도 전부 그대로 출력된다.

UNION 쿼리에서 지켜야 할 규칙

  • 두 쿼리는 같은 컬럼 수를 가져야 하고, 각 컬럼의 데이터 타입도 일치해야 한다.
  • 출력되는 컬럼 이름은 첫 번째 쿼리 기준으로 결정된다.

Set Operator(집합 연산자) 정리

UNION처럼 여러 다른 쿼리들의 결과(각각의 결과를 Set이라고 함)를 연산해 보여주는 쿼리들을 Set Operator(집합 연산자)라고 한다.UNION외에도 아래와 같은 연산자들이 존재한다.

INTERSECT: 공통된 결과만 추리기

sql
SELECT ... INTERSECT SELECT ...
  • 양쪽 쿼리 모두에 동일한 행이 존재할 때만 그 행을 출력한다.
  • 기본적으로 중복된 행은 한 번만 출력한다.

INTERSECT ALL

sql
SELECT ... INTERSECT ALL SELECT ...
  • 중복된 행도 모두 보여준다.
  • 양쪽 모두에 있는 행은 2번 출력된다. ⇒ 이걸 왜 쓰나 싶은데, 데이터 분석 시 양쪽 집합에서 얼마나 많이 겹치는지 분석할 때 유용하다.
    • 예: sales data, transaction logic이 있다고 할 때 중복 발생 횟수를 파악한다.

EXCEPT: 한쪽에만 있는 결과 보기

sql
SELECT ... EXCEPT SELECT ...
  • 첫번째 쿼리에는 있는데 두번째 쿼리에는 없는 행만 출력한다. ⇒ 다른 Set Operator(UNION, INTERSECT)와는 달리 쿼리의 순서가 결과에 영향을 미친다.
    • 예를 들어, 순서가 바뀌면 반대 결과가 나온다.