ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL GROUP BY 요약
    공부하기/데이터베이스 2023. 2. 9. 16:38

    GROUP BY :

    1. 특정 컬럼을 기준으로 결과 집합을 데이터를 그룹화한다..
    2. 결과 집합의 행 수가 줄어든다.
    3. HAVING 절을 사용하여 그룹화의 조건을 걸 수 있다.
    4. 중복을 제거할 때도 사용 가능하다.
    5. 자동으로 ORDER BY가 적용되지만 명시적으로 ORDER BY를 적어주는 것이 좋다.
    6. 집계 함수와 함께 자주 사용된다. ( SUM, AVG, MIN, COUNT )

    [SELECT ~ GROUP BY] 쿼리 ,  [SELECT DISTINCT ~ ] 쿼리 비교 요약

    1. DISTINCT는 정렬 없이 그룹화한 결과를 리턴한다.
    2. GROUP BY는 그룹화 + 정렬 결과를 리턴한다.
    3. 정렬 작업이 추가되었기 때문에 GROUP BY보다 DISTINCT가 더 빠르다.
    4. 주로 단순 중복을 제거하는 용도로 DISTINCT, 집계함수 사용 및 정렬을 필요로 하는 경우 GROUP BY를 사용한다.

    * mysql 8.0에서는 GROUP BY 절에 대한 암시적 정렬이 제거되었다. 따라서 GROUP BY 절이 포함된 쿼리의 결과 집합이 정렬되지 않는다. *

     

    MySql GROUP BY  vs sql 표준 GROUP BY

    1. sql 표준에서는 group by에 별칭 사용을 허용하지 않지만 mysql의 group by에서는 별칭을 사용할 수 있다.

     

    문법

    SELECT 
        c1, c2,..., cn, aggregate_function(ci)
    FROM
        table
    WHERE
        where_conditions
    GROUP BY c1 , c2,...,cn;

    실행순서

     

    포스팅 기준 테이블 및 데이터

    order, orderDetail 테이블 구조

    예제

     

    1. select 와 select ~ GROUP BY 비교

    ##### [ <> "shipped"은 중복 데이터가 너무 많아서 넣은 것 ] ###############
    
    [CASE_1] - SELECT
    select status from orders where status <> "shipped";
    
    [CASE_2] - SELECT ~ GROUP BY
    select status from orders where status <> "shipped" GROUP BY(status);

    결과

    --> select 문은 중복된 결과값도 출력, group by 를 사용한 select 문은 중복이 제거된 결과가 출력

     

    2. 집계 함수와 함께 사용된 group by

    SELECT 
        status, COUNT(*)
    FROM
        orders
    GROUP BY status;

    결과

    --> status 각각의 갯수를 파악할 수 있다.

     

    3. INNER JOIN 문과 함께 사용된 GROUP BY

    SELECT 
        status, 
        SUM(quantityOrdered * priceEach) AS amount
    FROM
        orders
    INNER JOIN orderdetails 
        USING (orderNumber)
    GROUP BY 
        status;

     

    결과

    --> orders 테이블의 status 컬럼을 기준으로 조인된 orderDetails의 컬럼을 계산한 amount를 출력한다.

     

    4.HAVING절과 함께 사용된 GROUP BY

    SELECT 
        YEAR(orderDate) AS year,
        SUM(quantityOrdered * priceEach) AS total
    FROM
        orders
    INNER JOIN orderdetails 
        USING (orderNumber)
    WHERE
        status = 'Shipped'
    GROUP BY 
        year
    HAVING 
        year > 2003;

     

    결과

    -> year의 값이 2003년보다 큰 그룹만 출력된다.

     

    '공부하기 > 데이터베이스' 카테고리의 다른 글

    MySQL EXISTS 요약  (0) 2023.02.10
    MySQL Subquery 요약  (0) 2023.02.10
    MySQL Join 요약  (0) 2023.02.09
    MySQL LIMIT 요약  (0) 2023.02.09
    MySQL LIKE 요약  (0) 2023.02.09
Designed by Tistory.