ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • COUNT와 그룹핑 - DISTINCT & GROUP BY
    데이터베이스/SQL 2022. 4. 1. 00:31

    < SQL 실행 순서 >

    FROM -> CONNECT BY -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

     

    이 순서를 알아야 하는 이유 중의 하나가 별칭을 사용하게 되면 해당 별칭을 재사용할 경우

    재사용하는 절이 기존의 절보다 이후에 실행되는 것이어야 에러가 안 생기기 때문입니다.

    우선은 참고만 하고 나중에 별칭을 직접 써보면서 다뤄보겠습니다.

     

     

    이번 문제 정말 흥미로웠고 재밌었습니다!

    https://programmers.co.kr/learn/courses/30/lessons/59408

    "중복 제거하기" 문제 풀어보시는 것을 추천드립니다!

     

    < 프로그래머스 SQL 중복 제거하기 >

    < 문제 설명 >

    ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

     

    동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요.

    이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.


    보자마자 COUNT를 쓴다는 것은 누구나 쉽게 예상할 수 있다고 생각했는데 어떻게 중복되는 것들을 제외할까 고민했습니다.

    우선 COUNT에 대해 간단히 보고 가겠습니다.

     

    COUNT

    기본 구조는 아래와 같다.
    SELECT COUNT(컬럼명) FROM 테이블명;
    
    1. 테이블의 모든 레코드 수를 확인하려면
    SELECT COUNT(*) FROM 테이블명;
    
    2. NULL인 경우 제외하려면
    SELECT COUNT(컬럼명) FROM 테이블명 WHERE 컬럼명 IS NOT NULL;

     

    중복을 제거하는 것은 DISTINCTGROUP BY 가 있습니다.

    DISTINCT를 검색하다 보니 GROUP BY도 많이 나오는 것을 알 수 있었습니다.

    두 가지의 공통점과 차이점에 대해 간단히 정리하고 어떤 경우에 어떤 기능을 사용하면 좋을지 알아보겠습니다.

     

    DISTINCT

    정렬되지 않은 유니크한 데이터 (중복 제거) 조회 : 단순 그룹핑 작업만 수행

    DISTINCT를 사용하면 기본적으로 NULL 값은 제외한다!

    기본 구조는 아래와 같다.
    SELECT DISTINCT 컬럼명 FROM 테이블명;
    
    
    SELECT DISTINCT 컬렴명1, 컬럼명2 FROM 테이블명;
    여러 컬럼을 동시에 나열하면
    나열한 컬럼을 한 묶음으로 보고 레코드 중복 제거를 한다.
    그래서 컬럼명1에 중복되는 레코드들이 있더라도 컬럼명2가 동시에 중복되지 않는다면
    별개의 컬럼으로 인식되서 유니크한 레코드로 인식하고 이 경우에는 중복 제거를 하지 않는다.

     

    GROUP BY

    정렬된 유니크한 데이터 (중복 제거) 조회 : 그룹핑 + 정렬

    GROUP BY 뒤에 지정한 열의 값이 같은 행이 하나의 그룹으로 묶인다.

     

    GROUP BY 작성 시에 가장 상단의 SQL 실행 순서를 유념하면서 작성해야 합니다!

     

    지금 이렇게 글로만 GROUP BY를 접하면 어려우실 텐데

    아래의 문제에서 이런 예시에 적합한 SQL 구문을 직접 작성해보면 좋을 것 같습니다.

     

    ANIMAL_TYPE에 따른 타입별 개수를 조회하는 SQL 문을 작성해주세요.

    즉, ANIMAL_TYPE이 Dog와 Cat이 있다면 각 타입이 몇 개 있는지를 조회하는 SQL 문을 작성하시면 됩니다.

     

    직접 생각해보셨나요? 아래의 사이트에서 직접 작성하고 코드를 실행해보실 수도 있습니다!

    https://programmers.co.kr/learn/courses/30/lessons/59408

    프로그래머스 문제 예시

     

    제가 작성한 것은 아래와 같습니다.

    ANIMAL_TYPE 별 갯수 조회하는 SQL 문

    이런 식으로 직접 문제를 만들고 SQL 문을 작성하고 코드를 실행해보면서 익힐 수 있습니다.

     

     

    < 차이점 >

    단순하게 생각하면 정렬이 필요 없고 중복만 제거하면 된다면 DISTINCT를 사용하는 것이 성능면에서 좋습니다.

     

    그러나 그룹별로 집계 함수를 사용하여 데이터를 뽑아내야 하는 경우에는 GROUP BY를 사용하는 것이 좋습니다!

     

     

     

    < 문제 정답 >

    그래서 위의 프로그래머스 문제는 COUNT DISTINCT를 함께 쓰면 풀 수 있는 문제입니다.

    SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS;
    
    
    처음에는 아래처럼 썼는데
    
    SELECT COUNT(DISTINCT NAME)
    FROM ANIMAL_INS
    WHERE NAME IS NOT NULL;
    
    DISTINCT를 사용하면 자동으로 NULL 값은 제외하기에 쓸 필요가 없습니다.
    그리고 SQL 구문이 길어지면 구절별로 이렇게 나눠서 쓰면 가독성도 높일 수 있습니다.

     

     

    < 참고 자료 >

    SQL 구문 많아서 편하게 검색해서 기본 형태와 간략한 설명은 아래 링크 참고 

    http://www.w3big.com/ko/sql/sql-func-count.html

     

    DISTINCT와 GROUP BY 차이점 설명 및 DISTINCT + 여러 컬럼 나열하는 경우의 결괏값 설명 

    https://intomysql.blogspot.com/2011/01/distinct-group-by.html?showComment=1648725563850#c9175870733950096276

     

    DISTINCT 사용 시 NULL 값 제외 설명 및 SQL 실행 순서 설명 아래 영상 참고

    https://youtu.be/zf4XyeifrqI

     

    GROUP BY를 사용하는 경우들을 기본식과 예시들을 함께 나열하여 설명

    https://extbrain.tistory.com/56

    '데이터베이스 > SQL' 카테고리의 다른 글

    JOIN - Left Outer Join  (0) 2022.05.30
    프로그래머스 SQL SELECT 정리  (0) 2022.03.24
    스케일업(Scale-up)과 스케일아웃(Scale-out)  (0) 2022.03.01

    댓글

Designed by Tistory.