일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- puppeteer
- Deep Dive
- 인접행렬
- Interceptor
- dfs
- nestjs
- java
- winston
- html
- bean
- LifeCycle
- JWT
- 알고리즘
- Linux
- Kubernetes
- node.js
- MySQL
- 프로그래머스
- REST API
- Spring
- typescript
- 탐욕법
- javascript
- 코딩테스트
- TIL
- OOP
- 인접리스트
- GraphQL
- 자료구조
- css
- Today
- Total
처음부터 차근차근
MySQL 조건에 따라 그룹으로 묶기 본문
1. Group BY - 조건에 따라 집계된 값을 가져옵니다.
동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것을 의미한다.
SELECT Country FROM Customers
GROUP BY Country;
SELECT CategoryID FROM Products
GROUP BY CategoryID;
※ 여러 컬럼을 기준으로 그룹화할 수도 있다.
SELECT
Country, City,
CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;
Group by - 그룹 함수 활용하기!
주로 COUNT() 함수와 같이 사용된다.
SELECT
COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;
SELECT
ProductID,
SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;
SELECT
CategoryID,
MAX(Price) AS MaxPrice,
MIN(Price) AS MinPrice,
TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
GROUP BY CategoryID;
SELECT
CONCAT_WS(', ', City, Country) AS Location,
COUNT(CustomerID)
FROM Customers
GROUP BY Country, City;
WITH ROLLUP - 전체의 집계값
※ ORDER BY와 함께 쓸 수 없다.
SELECT
Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;
NULL로 집계가 보인다.
SELECT
CategoryID,
MAX(Price) AS MaxPrice,
MIN(Price) AS MinPrice,
TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
GROUP BY CategoryID
with rollup;
MAX, MIN, Median, avg가 나온다.
HAVING - 그룹화된 데이터 걸러내기
SELECT
Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;
※ WHERE는 그룹하기 전 데이터, HAVING은 그룹 후 집계에 사용!
SELECT
COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;
SELECT
CategoryID,
MAX(Price) AS MaxPrice,
MIN(Price) AS MinPrice,
TRUNCATE((MAX(Price) + MIN(Price)) / 2, 2) AS MedianPrice,
TRUNCATE(AVG(Price), 2) AS AveragePrice
FROM Products
WHERE CategoryID > 2
GROUP BY CategoryID
HAVING
AveragePrice BETWEEN 20 AND 30
AND MedianPrice < 40;
DISTINCT - 중복된 값들을 제거합니다.
- GROUP BY 와 달리 집계함수가 사용되지 않습니다.
- GROUP BY 와 달리 정렬하지 않으므로 더 빠릅니다.
SELECT DISTINCT CategoryID
FROM Products;
-- 위의 GROUP BY를 사용한 쿼리와 결과 비교 (기본적으로 정렬되어있지 않다)
SELECT COUNT DISTINCT CategoryID
FROM Products;
-- 오류 발생 (집계함수 사용)
SELECT DISTINCT Country
FROM Customers
ORDER BY Country;
SELECT DISTINCT Country, City
FROM Customers
ORDER BY Country, City;
Group BY와 DISTINCT 함께 활용하기
SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;
https://www.yalco.kr/@sql/1-5/
조건에 따라 그룹으로 묶기
어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주 묻는 질문들의 답변들, 예제 코드들을 얄코에서 확인하세요!
www.yalco.kr
'DB > MySQL' 카테고리의 다른 글
MySQL Join (0) | 2023.06.02 |
---|---|
MySQL 쿼리 안에 서브쿼리 (0) | 2023.06.01 |
MySQL 시간/날짜 관련 및 기타 함수들 (1) | 2023.06.01 |
숫자와 문자열을 다루는 함수들 (0) | 2023.05.29 |
각종 연산자들 (0) | 2023.05.29 |