포스트

distinct 정리

Distinct란?

  • PostgreSQL에서 DISTINCT를 사용하면 결과 집합에서 중복된 값을 제거할 수 있다.
  • 이를 통해 데이터를 정리하고 고유한 값만을 포함하는 결과를 얻을 수 있다.

사용방법

SELECT DISTINCT job_title
  FROM employee; 

장점:

  • 중복된 결과를 제거하여 데이터의 정확성을 유지한다.
  • 간단하고 직관적인 방법으로 중복을 처리할 수 있다.
  • 데이터의 품질을 향상시키고 분석의 정확성을 높인다.

단점:

  • 대량의 데이터에 대해 DISTINCT를 사용하면 성능이 저하될 수 있다.
    • 데이터베이스는 모든 결과를 비교하여 중복을 제거해야 하므로 처리 시간이 증가할 수 있다.
  • 중복된 행을 제거하고 남은 결과가 예상과 다를 수 있다.
    • 이는 DISTINCT가 결과를 단순히 중복을 제거하는 것으로 처리하기 때문에 발생할 수 있다.

주의사항

  • DISTINCT는 결과 집합에서 중복된 행을 제거한다.
    • 따라서 결과가 더 적을 수 있다.
  • DISTINCT는 여러 열에 적용할 수 있다.
    • 그러나 이 경우 각 조합의 고유성을 기준으로 중복을 제거한다.


UNION

  • UNION 연산자는 두 개 이상의 SELECT 문의 결과를 결합하고 중복된 행을 제거한다.
    • 이 때 중복된 행을 제거하기 위해 각 SELECT 문에서 DISTINCT를 사용할 수도 있습니다.

문법

select_statement UNION [ ALL | DISTINCT ] select_statement

사용방법

  SELECT column1 FROM table1
   UNION
  SELECT column1 FROM table2;
  • 위의 쿼리는 table1과 table2에서 중복된 값을 제거하고 column1의 값을 결합한다.

INTERSECT

  • INTERSECT 연산자는 두 개 이상의 SELECT 문의 결과에서 교차되는 행을 반환한다.
    • 중복된 값을 자동으로 제거한다.

문법

select_statement EXCEPT [ ALL | DISTINCT ] select_statement

사용방법

  SELECT column1 FROM table1
         INTERSECT
  SELECT column1 FROM table2;
  • 위의 쿼리는 table1과 table2에서 중복된 값을 제거하고 교차되는 column1의 값을 반환한다.

EXCEPT

  • EXCEPT 연산자는 첫 번째 SELECT 문의 결과에서 두 번째 SELECT 문의 결과를 제거한다.
    • 중복된 값을 자동으로 제거한다.

문법

select_statement UNION [ ALL | DISTINCT ] select_statement

사용방법

  SELECT column1 FROM table1
  EXCEPT
  SELECT column1 FROM table2;
  • 위의 쿼리는 table1에서 table2의 결과를 제거하고 남은 column1의 값을 반환한다.

글을 쓰게 된 이유

  • 문제 개요
    • 문제 현상 : 특정 컬럼의 값이 분리가 되어야 하는 상황
  • 이미 시도한 해결 방법
    • group by 와 서브쿼리로 합쳐진 기존 쿼리를 살린 상태에서 추가적으로
      • 내가 원하는 컬럼을 group by에 추가하고 결과 서브쿼리 쪽을
      • 다시 한번 더 서브쿼리로 감싸서 해결했다.

해결한 방법

  • group by 와 서브쿼리로 합쳐진 기존 쿼리를 살린 상태에서 내가 원하는 컬럼을 group by에 추가하고
  • DISTINCT를 제거해서 해결했다.

느낀점

  • DISTINCT를 살려야한다는 생각을 왜 했는지 2~3시간 동안 고민을 하다가 너무 복잡하게 쿼리를 짠 것
    • 같아서 다시 고민을 해보니 DISTINCT만 없애면 되는 상황이어서 제거하여 해결했다.
    • 그리고 DISTINCT에 대해 잘 모르는 것 같아서 글을 작성하기로 생각했고, 오늘 작성했다..

출처

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.