[MySQL] 1-5 GROUP BY로 조건에 따라 그룹화시키기
카테고리: MySQL
💡 유튜브 채널 ‘얄팍한 코딩사전’에서 제공하는 강좌를 보고 학습했습니다.
SQL의 기초적인 내용을 웹에서 실습해볼 수 있는 강좌입니다.
강좌에서 배운 개념을 바탕으로 직접 문제를 만들고, 이를 풀어보는 식으로 독학했습니다.
강좌 링크
실습 웹사이트 링크
1. SELECT기초 - 원하는 정보 가져오기
1-5 조건에 따라 그룹으로 묶기
GROUP BY - 조건에 따라 집계된 값 가져오기
GROUP BY
는 조건에 따라 집계된 값을 가져와준다. GROUP BY 컬럼명
을 입력하면 그 컬럼을 기준으로 집계된 값들을 보여준다.
SELECT
Country,
COUNT(*) AS COUNT
FROM Customers
GROUP BY Country;
Country를 기준으로 빈도를 count하여 집계된 값을 보여준다.
SELECT
CategoryID,
MAX(Price) AS MAX,
MIN(Price) AS MIN,
TRUNCATE(AVG(Price), 2) AS AVG
FROM Products
GROUP BY CategoryID;
❓ 문제.
Products 테이블에서 CategoryID를 기준으로 상품의 최댓값, 최솟값, 평균, 아이디별 개수를 집계해보자.
그리고 마지막 행에 전체의 집계도 나타내보자.
💡 답.
select
CategoryID,
MAX(Price) AS MAX,
MIN(Price) AS MIN,
TRUNCATE(AVG(Price), 2) AS AVG,
count(*) AS COUNT
FROM Products
GROUP BY CategoryID
WITH ROLLUP;
WITH ROLLUP
은 마지막 행에 전체의 집계값을 나타내준다.
마지막 행에 WITH ROLLUP이 실행되어 있다.
HAVING
은 그룹화된 데이터에서 조건을 걸어준다. 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 15 AND 30
AND MedianPrice < 40;
DISTINCT - 중복된 값들을 제거하기
GROUP BY
와 달리 집계함수가 사용되지 않고, 정렬되지 않기 때문에 더 빠르다.
SELECT DISTINCT CategoryID
FROM Products;
SELECT DISTINCT Country
FROM Customers
ORDER BY Country; #이렇게 정렬을 따로 해줘야 함.
#Country 기준으로 먼저 중복값 제거하고, 그 다음에 City 기준으로 중복값 제거
SELECT DISTINCT Country, City
FROM Customers
ORDER BY Country, City;
필요에 따라 GROUP BY
와 DISTINCT
를 함께 사용할 수도 있다. Country별로 City가 몇 종류씩 있는지 알고 싶은 경우를 떠올려보자.
SELECT
Country,
COUNT(CITY) #이렇게 하면 도시의 종류 수가 아니라 전체 도시 수가 나온다.
FROM Customers
GROUP BY Country;
SELECT
Country,
COUNT(DISTINCT CITY) #따라서 중복된 도시들을 제거해주고 오로지 종류 수만 count하게 바꿔준다.
FROM Customers
GROUP BY Country;