SQL 데이터 조회와 필터링 : SELECT DISTINCT 문
SELECT DISTINCT 문
이 학습은 패스트캠퍼스의 올인원 패키지 : 모두를 위한 SQL/DB 강의를 듣고 복습하는 내용입니다.
SELECT DISTINCT 문법
>> COLUMN_1의 값이 중복 값 존재 시 중복 값 제거
>> COLUMN_1 + COLUUMN_2의 값이 중복 값 존재 시 중복 값을 제거
>> COLUMN_1 + COLUUMN_2의 값이 중복 값 존재 시 중복 값을 제거
>> 결과를 명확하게 하기 위해 ORDER BY 절 사용
SELECT DISTINCT 실습
● 테이블 생성 & INSERT
- 쿼리문
CREATE TABLE T1 ( ID SERIAL NOT NULL PRIMARY KEY, BCOLOR VARCHAR, FCOLOR VARCHAR );
INSERT
INTO T1 (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')
;
COMMIT;
>> COMMIT 은 나중에 배울 것인데, 이 테이블에 이 데이터를 집어넣을 거라는 의미!(INSERT문 한다음에 필요)
-> 하지만 위의 CREATE TABLE 에는 필요없는 이유는 테이블생성은 DDL로 치는 순간에 바로 적용되기 때문
## 테이블을 날리고 싶으면 DROP TABLE T1; 하면 된다
- SELECT * FROM T1 의 결과
● DISTINCT 사용 + 컬럼 1개
- 쿼리문
SELECT
DISTINCT BCOLOR
FROM
T1
ORDER BY
BCOLOR
- 실행결과
>> 중복이 제거된 BCOLOR 컬럼의 값이 출력되었다.
>> ORDER BY BCOLOR 로 인해 BCOLOR값 기준으로 알파벳 순으로 정렬된 결과 (A가 가장먼저, NULL값은 가장 뒤)
● DISTINCT 사용 + 컬럼 2개
- 쿼리문
SELECT
DISTINCT BCOLOR, FCOLOR
FROM
T1
ORDER BY
BCOLOR, FCOLOR;
- 실행 결과
>> [RED | RED] 만 사라졌다. |
● DISTINCT 사용 + 컬럼 2개 + ON 사용
- 쿼리문
SELECT
DISTINCT ON (BCOLOR) BCOLOR
, FCOLOR
FROM
T1
ORDER BY
BCOLOR, FCOLOR;
- 실행 결과
>> DISTINCT ON (BCOLOR) 는 BCOLOR 기준으로 중복 제거되게 하겠다는 뜻이다.
-> 따라서, BCOLOR NULL값 하나, red값 중 하나, green값 중 하나, blue값 중 하나가 나온것이다.
>> FCOLOR의 값이 NULL값 제외하고 blue인 이유는 ORDER BY로 오름차순 정렬했기 때문이다.
-> 아래 그림처럼 bcolor의 red/green/blue 값중 blue가 가장 앞쪽의 알파벳이다.
NULL은 FCOLOR가 red 밖에 없기 때문에 그대로 나온 것
●DISTINCT 사용 + 컬럼 2개 + ON 사용 + DESC 정렬
- 쿼리문
SELECT
DISTINCT ON (BCOLOR) BCOLOR
, FCOLOR
FROM
T1
ORDER BY
BCOLOR, FCOLOR DESC;
- 실행 결과
>> 마찬가지로 DISTINCT ON (BCOLOR)로 BCOLOR 기준으로 중복제거 되었다.
>> 다른 점은 내림차순이기 때문에 FCOLOR값이 RED아니면 NULL이 나옴
-> 내림차순이면 NULL이 젤 먼저인데 NULL을 가진 BCOLOR는 red밖에 없음.
● DISTINCT 사용 + 컬럼 2개 + ON 사용 + 두 컬럼 모두 DESC 정렬
DISTINCT ON 사용한 두 실습은 전부 ORDER BY BCOLOR, FCOLOR desc; 라서 BCOLOR는 오름차순이다.
하지만 아래처럼 바꾸면 둘 다 내림차순 가능.
- 쿼리문
SELECT
DISTINCT ON (BCOLOR) BCOLOR
, FCOLOR
FROM
T1
ORDER BY
BCOLOR DESC, FCOLOR DESC;
- 실행 결과