본문 바로가기
IT/SQL 기초강좌 (PostgreSQL)

6강 SQL이 뭐지? SELECT DISTINCT 뽀개기

by DoitSQL 2022. 12. 13.
728x90

 

안녕하세요.

6강 시작합니다.

 

이제 SQL에 어느 정도 익숙해지셨죠?

입맛에 맞는 Query Tool은 찾으셨나요?

 

이번 강의에서는

▶ SELECT DISTINCT

에 대해서 알아보겠습니다.

 

DISTINCT를 대신해 GROUP BY 절로 구현할 수도 있으나 DISTINCT가 성능 면에서

빠른 것으로 알려져 있습니다.


1. SELECT  DISTINCT

DISTINCT명령어는 결과 세트에서 중복 행을 제거하기 위해 사용됩니다.

DISTINCT절은 중복된 각 그룹에 대해 1개의 행을 유지합니다.

DISTINCT절은 컬럼중 하나 이상의 열에 적용할 수 있습니다.

 

● 기본구문 ●

SELECT

            DISTINCT column1

FROM

            table_name;

위 명령은 column 1을 중복을 제거하는 데 사용합니다.


SELECT

            DISTINCT column1, column2

FROM

            table_name;

위 명령은 column1과 column2를 중복을 제거하는데 사용합니다.


SELECT

            DISTINCT ON (column1) column_alias,

            column2

FROM

            table_name

ORDER BY

            column1,

            column2;

DISTINCT ON은 다른 DBMS에서 볼 수 없었던 PostgreSQL만의

고유한 기능인 것 같습니다. (확신 없음, 저는 처음 봅니다.)

먼저 DISTINCT ON에 지정된 column1으로 DISTINCT를 수행합니다.

이후에 column2에는 1개의 행만 가져옵니다. 이때 어떤 행을 가져올지는

ORDER BY 절에 따라 정해집니다.


dvdrental DB에는 실습할 테이블이 없어서

distinct_demo 테이블을 생성하고 데이터를 입력해 보겠습니다.

아래 SQL을 실행합니다.

 

CREATE TABLE distinct_demo (

            id serial NOT NULL PRIMARY KEY,

            bcolor VARCHAR,

            fcolor VARCHAR

);

 

INSERT INTO distinct_demo (bcolor, fcolor)

VALUES

            ('red', 'red'),

            ('red', 'red'),

            ('red', NULL),

            (NULL, 'red'),

            ('red', 'green'),

            ('red', 'blue'),

            ('green', 'red'),

            ('green', 'blue'),

            ('green', 'green'),

            ('blue', 'red'),

            ('blue', 'green'),

            ('blue', 'blue');

 

실행 후, 테이블의 데이터를 확인합니다.

SELECT

            id,

            bcolor,

            fcolor

FROM

            distinct_demo ;

생성된  distinct_demo 테이블을 가지고 실습을 진행합니다.


★ 실습1 ★  DISTINCT column1 (1개의 열만 지정한 경우)

SELECT

            DISTINCT bcolor

FROM

            distinct_demo

ORDER BY

            bcolor;

bcolor 를 대상으로 DISTINCT를 수행하고,  ORDER BY 조건을 따른다.

알파벳순으로 정렬하고 NIULL은 마지막


SELECT

            DISTINCT bcolor

FROM

            distinct_demo

ORDER BY

            bcolor DESC;

 

bcolor 를 대상으로 DISTINCT를 수행하고,  ORDER BY 조건을 따른다.

알파벳역순으로 정렬하고 NIULL은 처음


★ 실습2 ★  DISTINCT column1,  column2 (여러개의 열을 지정한 경우)

SELECT

            DISTINCT bcolor,

            fcolor
FROM

            distinct_demo

ORDER BY

            bcolor,

            fcolor;

 

2개의 열을 조합해서 DISTINCT 합니다.

ORDER BY 조건에 따라 정렬합니다.

전체 DATA에서 보면, red red 행이 2개이므로 1행이 제거되었습니다.


★ 실습3 ★  DISTINCT  ON 

SELECT

            DISTINCT ON (bcolor) bcolor,

            fcolor

FROM

            distinct_demo

ORDER BY

            bcolor,

            fcolor;

DISTINCT ON에 지정된 bcolor로 DISTINCT를 수행

bcolor를 asc으로 정렬

fcolor는 asc으로 정렬하여 1개행만 반환


SELECT

            DISTINCT ON (bcolor) bcolor,

            fcolor

FROM

            distinct_demo

ORDER BY

            bcolor,

            fcolor DESC;

 

DISTINCT ON에 지정된 bcolor로 DISTINCT를 수행

bcolor를 asc으로 정렬

fcolor는 desc으로 정렬하여 1개행만 반환


★ 요약 ★

● DISTINCT 1개의 열이면, 1개의 열로 중복 제거하고 order by 순으로 정렬

● DISTINCT 여러 개의 열이면, 여러 개의 열 조합으로 중복 제거하고 order by 순으로 정렬

● DISTINCT ON은 ON에 기술된 열 또는 열 조합으로 중복 제거하고, order by 순으로 정렬

   따라서 N개의 열로 중복 제거하고, (N+M) 개의 열을 보고자 할 때 유용

   실제 적용 예는 계속 관찰해봐야 할 것 같음.


수고하셨습니다.

다음 강의에서 만나요~~~

728x90

댓글