-
MySQL GROUP BY 요약공부하기/데이터베이스 2023. 2. 9. 16:38
GROUP BY :
- 특정 컬럼을 기준으로 결과 집합을 데이터를 그룹화한다..
- 결과 집합의 행 수가 줄어든다.
- HAVING 절을 사용하여 그룹화의 조건을 걸 수 있다.
- 중복을 제거할 때도 사용 가능하다.
- 자동으로 ORDER BY가 적용되지만 명시적으로 ORDER BY를 적어주는 것이 좋다.
- 집계 함수와 함께 자주 사용된다. ( SUM, AVG, MIN, COUNT )
[SELECT ~ GROUP BY] 쿼리 , [SELECT DISTINCT ~ ] 쿼리 비교 요약
- DISTINCT는 정렬 없이 그룹화한 결과를 리턴한다.
- GROUP BY는 그룹화 + 정렬 결과를 리턴한다.
- 정렬 작업이 추가되었기 때문에 GROUP BY보다 DISTINCT가 더 빠르다.
- 주로 단순 중복을 제거하는 용도로 DISTINCT, 집계함수 사용 및 정렬을 필요로 하는 경우 GROUP BY를 사용한다.
* mysql 8.0에서는 GROUP BY 절에 대한 암시적 정렬이 제거되었다. 따라서 GROUP BY 절이 포함된 쿼리의 결과 집합이 정렬되지 않는다. *
MySql GROUP BY vs sql 표준 GROUP BY
- 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