SQL | DISTINCT 탐구_뜻밖의 여정 | Group by절과의 사용법 차이

    728x90

     

    0.  DISTINCT를 Group by절처럼 사용해도 되는 걸까?

     

     

    먼저 Group byDISTINCT가 무엇인지 간단히 살펴보자.

     

    ▶ Group by절 기본구조 및 사용법

     

    : 카테고리 별(소그룹 별) 데이터 결과값을 보고 싶을 때 Group by 사용.

    : Group by절을 사용하면, 여러 행에 나열되어 있던 중복 데이터가 제거되고 하나의 데이터가 됨. 

    SELECT 그룹화한 컬럼명            # Group by절에 적었던 컬럼명
           집계함수(그룹화한 칼럼명)   # 그룹화한 컬럼의 집계 값
    FROM 테이블명
    WHERE 조건절    # 테이블 전체 데이터를 조회할 때 적용하고 싶은 조건이 있으면 사용
    Group by 그룹화할 컬럼명    # 원하는 소그룹 별 집계 결과값을 보고 싶을 때 사용
    Having 조건절   # Group by절로 나눠진 소그룹 안의 데이터에 적용하고 싶은 조건이 있으면 사용

     

     

    [참고 게시글]

    [IT 교육/SQL] - SQL | Group By절과 집계 함수는 한 세트

     

    SQL | Group By절과 집계 함수는 한 세트 | 집계 함수 사용 시 주의 사항

    0. Group by절과 집계함수의 연관성 Group by절을 사용하는 이유는 카테고리 별로 데이터들을 모아보고 싶기 때문일 것이다. 그런데 Group by로 카테고리를 묶게되면 필연적으로 해당 카테고리에 속했

    nasena.tistory.com

     

     

    ▶ DISTINCT 사용법

    : 중복 데이터 제거. 같은 값을 가지는 여러 데이터를 한 건으로 간주함.

     COUNT(DISTINCT 컬럼명) 형식처럼 집계함수와 함께 쓰일 수 있음.

     

     

    여기서 문제!

    Group by절과 DISTINCT는 모두 중복 데이터를 제거해서 하나로 합쳐준다는 기능이 있다.

    Q. 그렇다면 Group by절로 도출한 결과값을 DISTINCT로도 똑같이 낼 수 있을까?

    이 질문을 시작으로,, DISTINCT와 Group by 사용법에 대한 뜻밖의 여정을 시작하게 됨,,

     


     DISTINCT와 Group By에 대한 뜻밖의 여정.. 

     

    1. Group By로 도출한 결과를 DISTINCT로도 똑같이 낼 수 있을까?

     

    (문제)  food_orders 테이블에서 ①음식점 명 별 / ②총 수량과 / ③총 가격 구하기

     

    1-1) Group by절 사용

    ▶ Group by절로 음식점 명을 그룹화해주고,

    집계함수 SUM으로 음식점 별 주문받은 수량의 합과 가격의 합을 구함.

    : restaurant_name(음식점 명) 별 quantity(수량)과 price(가격)의 합

    SELECT restaurant_name,
           SUM(quantity) total_quantity,
           SUM(price) total_price
    FROM food_orders fo 
    Group By 1

     

    >> 음식점 명 별 주문수량과 가격의 합계가 잘 조회된 것을 볼 수 있음.

     

    Q. 그렇다면 이런 결과를 DISTINCT로도 똑같이 만들어 낼 수 있지 않을까? 


    1-2)  DISTINCT 사용

    _  SELECT문에 [DISTINCT + 집계함수] 조합 적용

     

    ▶ DISTINCT로 음식점 명 별로 중복제거 한 뒤, 집계함수로 주문수량과 가격의 총 합을 구함

    : 먼저 DISTINCT로 음식점 명이 중복제거 되고나면,

    그 뒤에 수량과 가격에 대한 합계가 조회될 때 앞서 중복제거된 음식점 명 별로 합계가 조회될 줄 알았는데.. 

    안 됨 !

    SELECT DISTINCT restaurant_name,
           SUM(quantity) ,
           SUM(price)
    FROM food_orders fo

     

    >> 음식점이 Hangawi 외에도 많았는데 다짜고짜 하나의 값으로 집약된 결과를 보여줌.

    >> 여기에 출력된 total_quantity(총 수량 합계)의 5,673

          total_price(총 가격 합계)의 31,314,820

          테이블 전체 데이터 총 수량 합계와 총 가격 합계임.

     

    (예상 밖의 결과에.. 잠시 동공지진.. ⊙-⊙;;)

     


    2. 이런 결과가 나온 이유는??

     

    A1.

    : DISTINCT에는 중복을 제거해주는 기능은 있지만

    Group By절과 같이 카테고리 별로 묶어주는 기능은 없는 것으로 보임.

    A2. 

    : DISTINCT가 SELECT절에서 조회되면서 활성화되다보니
    일단 쿼리문 순서에 따라서 음식점 명 별로 중복제거가 되었지만,

    그 뒤에 연달아 집계함수가 조회되면서 이전의 결과값은 날아가고, 집계된 결과만 출력된 것 같음.

     

     

    혹시 이 결론이 틀렸다면 데이터베이스, SQL 고수님들,, 댓글로 가르침을 주십셔,,. 

     


    3.  그 외 DISTINCT에 대한 탐구

     

    3-1) DISTINCT 만 사용한 결과는 어떻게 나올까? 

     

    순수 DISTINCT

    : restaurant_name(음식점 명)이 중복 제거

    SELECT DISTINCT restaurant_name
    FROM food_orders fo

     

    >> 중복되는 음식점 없이 잘 조회됨.

     


     

    ▶ DISTINCT + 집계함수를 뺀 순수 컬럼

    : 이번에는 DISTINCT와 함께 집계함수를 뺀 순수 컬럼을 같이 조회해봄.

    : 너무 당연하게 DISTINCT로 음식점 명이 중복 제거..됐겠지 했는데

    안 됨!

    : 그 이유는 밑에 기술.

    SELECT DISTINCT restaurant_name,
           quantity ,
           price
    FROM food_orders fo

     

    >> DISTINCT 음식점 명에만 적용된 게 아니라 [음식점 명, 수량, 가격]의 조합에 적용되어서

     세 가지 값이 모두 같은 경우에만 중복된 값으로 인식해서 제거해줌.

    (이것도 새로 알게된 사실!! 소 뒷걸음치다 쥐 잡은 격..)

     


    [참고 사이트]

    https://kimgom2.tistory.com/241

     

    [Oracle] 중복 데이터 제거 DISTINCT , GROUP BY

    1. DISTINCT SELECT문으로 데이터조회시 중복을 제거하고 싶을 때 DISTINCT를 사용한다. DISTINCT는 SELECT절에 열 이름을 명시하기 전에 선택적으로 사용할 수 있다. SELECT DISTINCT JOB, DEPTNO FROM EMP; DISTINCT 사

    kimgom2.tistory.com

     

    728x90

    댓글