SQL - DISTINCT

김규린·2024년 8월 15일
0

Data Base

목록 보기
5/20

1. DISTINCT

  • DISTINCT는 중복된 값을 제거하는데 사용된다.
  • 컬럼에 있는 컬럼값들의 종류를 쉽게 파악할 수 있다.
  • null도 한 종류로 봄
  • distinct는 해당 컬럼의 종류를 보여준다
  • distinct 사용 시에는 일반 컬럼을 사용할 수 없다.(distinct가 무의미 해지기 때문에)

1. DISTINCT 활용

MySQL Ver

  • 기본
-- 메뉴가 존재하는 카테고리의 종류를 뽑을 때 Distinct를 쓸 수 있다.
SELECT
		distinct category_code
-- 		, menu_name distinct 사용 시에는 일반 컬럼을 사용할 수 없다.(distinct가 무의미 해지기 때문에)
	FROM tbl_menu;

SELECT
		DISTINCT category_code
	FROM tbl_menu
	ORDER BY category_code;
  • null 값을 포함한 컬럼의 distinct
-- null 값을 포함한 컬럼의 distinct
SELECT
		DISTINCT ref_category_code
	FROM tbl_category;
	
-- null을 나중으로 보내는 정렬을 해보자.
-- 결과가 출력 되긴 했으나 원하는 결과가 아님(결과값 ref_category_code: 3, 2, 1, null)
SELECT
		DISTINCT ref_category_code
	FROM tbl_category
	ORDER BY 1 desc;

-- 정답
SELECT
		DISTINCT ref_category_code AS 'rcc'
	FROM tbl_category
	ORDER BY -rcc DESC;

-- 기본 정렬의 개념(순번이나 별칭을 사용하지 않고는 정렬할 수 없다.)은 
-- syntax 에러(문법 에러)가 발생한다.
SELECT
		DISTINCT ref_category_code
	FROM tbl_category
	ORDER BY DISTINCT ref_category_code DESC; -- 에러발생
  • 다중열
-- ------------------------------------------------------------------------------------
-- 컬럼 두 개 이상도 distinct로 묶을 수는 있지만 좋은 형태는 아니다.
-- 컬럼 두 개 이상부터는 이후 배율 group by절을 통해 중복 제거를 하자.

SELECT
		DISTINCT category_code, orderable_status
	FROM tbl_menu;

Oracle Ver

  1. DISTINCT와 ORDER BY
-- 메뉴가 존재하는 카테고리의 종류를 뽑을 때 DISTINCT를 사용
SELECT
    DISTINCT category_code
-- DISTINCT 사용 시에는 일반 컬럼을 사용할 수 없다.(DISTINCT가 무의미해지기 때문에)
FROM tbl_menu;

-- DISTINCT 사용과 정렬
SELECT
    DISTINCT category_code
FROM tbl_menu
ORDER BY category_code;
  1. NULL 값을 포함한 컬럼의 DISTINCT
-- NULL 값을 포함한 컬럼의 DISTINCT
SELECT
    DISTINCT ref_category_code
FROM tbl_category;

-- NULL을 나중으로 보내는 정렬
-- 결과가 ref_category_code: 3, 2, 1, NULL로 출력됨
SELECT
    DISTINCT ref_category_code
FROM tbl_category
ORDER BY ref_category_code DESC NULLS LAST;

-- DISTINCT와 ORDER BY의 조합
SELECT
    DISTINCT ref_category_code
FROM tbl_category
ORDER BY -ref_category_code DESC NULLS FIRST;

-- 기본 정렬의 개념: DISTINCT는 ORDER BY와 함께 사용할 때, DISTINCT 키워드는 ORDER BY 절 안에 포함될 수 없음.
SELECT
    DISTINCT ref_category_code
FROM tbl_category
ORDER BY ref_category_code DESC; -- 이 형태로 작성해야 합니다.
  1. 다중 열에 대한 DISTINCT
-- 컬럼 두 개 이상도 DISTINCT로 묶을 수 있지만 좋은 형태는 아님.
-- 이후의 배율 GROUP BY 절을 통해 중복 제거를 권장.
SELECT
    DISTINCT category_code, orderable_status
FROM tbl_menu;

MySQL과 Oracle

  • NULL 처리에서 NULLS LAST와 NULLS FIRST의 사용: Oracle에서 NULL 값을 정렬할 때 NULLS LAST와 NULLS FIRST를 사용합니다. NULLS LAST는 내림차순 정렬에서 NULL을 마지막에 배치하고, NULLS FIRST는 내림차순에서 NULL을 처음에 배치한다.
  • DISTINCT와 ORDER BY 사용: MySQL에서 ORDER BY 절에 DISTINCT를 사용할 수 없다는 점은 Oracle에서도 동일하게 적용된다. DISTINCT는 SELECT 절에서만 사용되며, ORDER BY 절에 직접 포함할 수 없다.
  • 다중 열에 대한 DISTINCT: 다중 열을 DISTINCT로 묶을 수 있지만, Oracle에서도 이 방법보다는 GROUP BY 절을 통해 중복을 제거하는 것이 권장되고 있다.
profile
나는 할 수 있다...!

0개의 댓글