본문 바로가기

프로그래밍 강의 메모/갖고노는 MySQL 데이터베이스 by 얄코

SELECT 기초 > 조건에 따라 그룹으로 묶기

https://inf.run/JvXX

 

갖고노는 MySQL 데이터베이스 by 얄코 - 인프런 | 강의

비전공자도 이해할 수 있는 MySQL! 빠른 설명으로 필수개념만 훑은 뒤 사이트의 예제들과 함께 MySQL을 ‘갖고 놀면서’ 손으로 익힐 수 있도록 만든 강좌입니다., - 강의 소개 | 인프런...

www.inflearn.com

 

1. GROUP BY - 조건에 따라 집계된 값을 가져온다.

-- Country에 무슨 값이 있는지 확인
SELECT Country FROM Customers
GROUP BY Country;

-- CategoryID에 무슨 값이 있는지 확인
SELECT CategoryID FROM Products
GROUP BY CategoryID;

 

여러 컬럼을 기준으로 그룹화할 수도 있다.

-- Country와 City의 조합이 겹치지 않는 것들을 보여준다.
SELECT 
  Country, City,
  CONCAT_WS(', ', City, Country)
FROM Customers
GROUP BY Country, City;

 

그룹 함수 활용하기

-- OrderDate마다 몇 개의 값이 있는지 확인 가능하다.
SELECT
  COUNT(*), OrderDate
FROM Orders
GROUP BY OrderDate;
-- 각 PorductID마다 개수의 합이 몇 개인지 확인 가능하고 내림차순으로 정렬
SELECT
  ProductID,
  SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID
ORDER BY QuantitySum DESC;

 

WITH ROLLUP - 전체의 집계값

-- COUNT로 추출되는 각 값들의 총합이 마지막 행에 표출된다.
SELECT
  Country, COUNT(*)
FROM Suppliers
GROUP BY Country
WITH ROLLUP;

⚠️ ORDER BY 와는 함께 사용될 수 없다.

 

 

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;

 

 

2. DISTINCT - 중복된 값들을 제거한다.

GROUP BY와 달리 집계함수가 사용되지 않는다.

GROUP BY와 달리 정렬하지 않으므로 더 빠르다.

-- 위의 GROUP BY를 사용한 쿼리와 결과 비교하였을 때
-- 중복이 안는 것은 같지만 출현 순서대로 표출되어 정렬되어 있지 않다.
SELECT DISTINCT CategoryID
FROM Products;

-- 오류 발생, 집계함수가 사용되지 않는다.
SELECT COUNT DISTINCT CategoryID
FROM Products;

 

 

GROUP BY와 DISTICT 함꼐 활용

-- Country마다 그룹핑하여 겹치지 않는 CITY가 몇 개가 있는지 추출
SELECT
  Country,
  COUNT(DISTINCT CITY)
FROM Customers
GROUP BY Country;