[얄코] Section 1-5. SELECT 기초 - 원하는 정보 찾기 (조건에 따라 그룹으로 묶기)

2023. 4. 17. 17:28Database/갖고노는 MySQL 데이터베이스

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

1-3 복습 - 💡 그룹 함수

 NULL값은 집계하지 않습니다.

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

 

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;

📚 그룹 함수 활용하기

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

SELECT
  ProductID,
  SUM(Quantity) AS QuantitySum
FROM OrderDetails
GROUP BY ProductID -- 원래는 ProductID에 맞게 순서대로인데
ORDER BY QuantitySum DESC; -- 이때문에 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;

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

 

💡 WITH ROLLUP - 전체의 집계값

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

```

  • 위의 각 집계함수 쿼리 끝에 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;

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;


2. 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;
더보기

DISTINCT 키워드 뒤에 2개 이상 컬럼 사용

 DISTINCT 뒤에 2개 이상의 컬럼을 사용하면,  DISTINCT 뒤에 오는 모든 컬럼에 대해 하나의 행으로 인식하여, 그 행의 중복을 제거합니다.

 
-- tCity 테이블에서 region, name 컬럼 합쳐서 중복인 행을 제거합니다.
 
SELECT DISTINCT region, name FROM tCity;

출처 : https://bio-info.tistory.com/110

 

[DB SQL] 중복제거 (DISTINCT)

DISTINCT란 중복제거 키워드입니다. SELECT로 DB에서 컬럼을 조회할 때, 중복되는 값을 제거하고 조회할 때 사용합니다. 즉, DISTINCT 키워드를 붙인 필드(컬럼)는 중복 값을 합쳐 한 번만 출력합니다. Co

bio-info.tistory.com

 

 

💡 GROUP BY DISTINCT 함께 활용하기

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

 

출처 : https://www.yalco.kr/@sql/1-5/

 

조건에 따라 그룹으로 묶기

어려운 프로그래밍 개념들을 쉽게 설명해주는 유튜브 채널 '얄팍한 코딩사전'. 영상에서 다 알려주지 못한 정보들이나 자주 묻는 질문들의 답변들, 예제 코드들을 얄코에서 확인하세요!

www.yalco.kr