추석맞이/ MySQL 공부 Chapter 1 - ⓷

flobeeee·2021년 9월 21일
0

강의

목록 보기
7/14
post-thumbnail

Chapter 1. SELECT 기초

🧐 5. 조건에 따라 그룹으로 묶기

- GROUP BY

  • 그룹 함수
    MAX 가장 큰 값
    MIN 가장 작은 값
    COUNT 갯수 (NULL값 제외)
    SUM 총합
    AVG 평균 값

SELECT Country FROM Customers
GROUP BY Country;

Customers테이블에는 Country 컬럼이 있고 다양한 나라가 데이터로 존재
GROUP BY 하면 어떤 나라가 있는지 중복없이 출력됨.

SELECT CategoryID FROM Products
GROUP BY CategoryID;

모든 CategoryID를 하나씩 확인할 수 있다.

SELECT
Country, City,
CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;

GROUP BY 기준 2개를 정할 수 있다.
한 나라에는 여러 도시가 있을 수 있다.

SELECT
COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;

Orders테이블에서 OrderDate기준으로 해당 날짜마다 몇 개의 데이터가 있는 지 가져오기

SELECT
ProductID,
SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;

OrderDetails테이블에서 ProductID로 그룹화하고,
Quantity를 합한 값을 QuantitySum으로 컬럼명을 정의하고,
해당 컬럼명 내림차순으로
ProductID, QuantitySum 데이터 가져오기

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;

Products테이블에서 CategoryID로 그룹화
CategoryID,
같은 CategoryID에서 Price가 가장 큰 값,
가장 작은 값,
(가장 큰 값 + 가장 작은 값) / 2 한 값 소수점 두번째 자리까지 표기,
평균값 소수점 두번째 자리까지 표기
가져오기

SELECT
CONCAT_WS(', ', City, Country) AS Location,
COUNT(CustomerID)
FROM Customers
GROUP BY Country, City;

Customers테이블에서 Country, City 로 그룹화
City, Country 형식으로 Location 컬럼을 정의하고
CustomerID별로 카운팅을 해서 데이터를 가져온다.

즉, 나라 도시별로 거주하는 고객들의 수를 알 수 있다.


- WITH ROLLUP

전체의 집계값 (단순 총계 아님)

SELECT
Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;

맨 밑에 전체 집계값이 출력된다.
집계함수 쿼리 끝마다 붙여서 사용하면 된다.
(⚠️ ORDER BY 와는 함께 사용될 수 없습니다.)

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;

순서별로 가장 큰 값, 가장 작은 값, 중간 값, 평균 값을 알 수 있다.


- HAVING

그룹화된 데이터 걸러내기

SELECT
Country, COUNT(*) AS Count
FROM Suppliers
GROUP BY Country
HAVING Count >= 3;

Suppliers테이블에서 Country로 그룹화
Country와 Count 값을 가져올건데
Count가 3 이상인 데이터만 가져오기

(💡 WHERE는 그룹하기 전 데이터, HAVING은 그룹 후 집계에 사용합니다.)

SELECT
COUNT(*) AS Count, OrderDate
FROM Orders
WHERE OrderDate > DATE('1996-12-31')
GROUP BY OrderDate
HAVING Count > 2;

Orders테이블에서 OrderDate로 그룹화
OrderDate가 1997년도 이상인 것만
OrderDate, Count를 가져오는데
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;

Products테이블에서 CategoryID가 2보다 큰 것만 CategoryID로 그룹화
CategoryID, MAX, MIN, MedianPrice, AveragePrice를 가져오는데
AveragePrice가 20~30 이고 MedianPrice가 40미만인 데이터만 가져오기


- DISTINCT

GROUP BY 와 달리 집계함수가 사용되지 않습니다.
GROUP BY 와 달리 정렬하지 않으므로 더 빠릅니다.

SELECT DISTINCT CategoryID
FROM Products;
-- 위의 GROUP BY를 사용한 쿼리와 결과 비교

Products테이블에서 CategoryID를 안겹치게 가져오기
(정렬없이 가져옴)

SELECT COUNT DISTINCT CategoryId
FROM Products;

에러.
DISTINCT는 집계함수를 함께 사용하지 않는다.

SELECT DISTINCT Country
FROM Customers
ORDER BY Country;

Customers테이블에서 Country를 겹치지 않게 Country 오름차순으로 정렬해서 가져오기

SELECT DISTINCT Country, City
FROM Customers
ORDER BY Country, City;

Customers테이블에서 Countyr, City를 정렬해서 가져오기

SELECT
Country,
COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;

GROUP BY도 함께 사용할 수 있다.
Customers테이블에서 Country로 그룹화
Country, city별로 안겹치게 몇개인지 카운팅해서 가져오기

즉, 나라별로 몇 개의 city가 있는지 알 수 있다.

profile
기록하는 백엔드 개발자

1개의 댓글

comment-user-thumbnail
2022년 2월 1일

복습완료

답글 달기