floatFirstTOC: right
🖥️ 시작하며
SQL의 GROUP BY문과 집계 함수에 대해 알아보자.
🔍 그 전에, 집계 함수
집계 함수는 하나의 열에 대해서만 호출할 수 있다.
SQL에는
AVG()
, COUNT()
, MIN()
, MAX()
, SUM()
와 같은 다양한 집계 함수들이 존재한다. AVG()
부동소수점으로 변환되어
ROUND()
와 같이 써야 한다는 것을 잊지 말아야 한다.SELECT AVG(replacement_cost) FROM film;
SELECT ROUND(AVG(replacement_cost), 2) FROM film; >>> 19.98
COUNT()
행의 개수만 반환한다.
MIN()
,MAX()
해당 열의 가장 최솟값, 최댓값을 반환한다.
SELECT MIN(replacement_cost) FROM film;
SUM()
SELECT SUM(replacement_cost) FROM film;
🔍 GROUP BY
SELECT customer_id FROM payment GROUP BY customer_id ORDER BY customer_id;
이는 사실
DISTINCT
를 사용하는 것과 같다.SELECT customer_id, SUM(amount) FROM payment GROUP BY customer_id ORDER BY SUM(amount);
이런 식으로, 하나의 카테고리(customer_id)와 데이터(amount)를 그룹화시켜 집계 함수를 사용할 수 있다.
여러 카테고리를 묶을 수도 있다.
SELECT customer_id, staff_id, SUM(amount) FROM payment GROUP BY staff_id, customer_id;
→ 총 사용금액을 스태프, 손님과 카테고리화 한다.
여기서 GROUP BY 뒤에 오는 테이블 순서는 중요하지 않다.
SELECT DATE(payment_date), SUM(amount) FROM payment GROUP BY DATE(payment_date);
📌 연습문제 #1
SELECT staff_id, COUNT(customer_id) FROM payment GROUP BY staff_id ORDER BY COUNT(customer_id)
📌 연습문제 #2
SELECT rating, ROUND(AVG(replacement_cost), 2) FROM film GROUP BY rating ORDER BY ROUND(AVG(replacement_cost), 2);
📌 연습문제 #3
SELECT customer_id, SUM(amount) FROM payment GROUP BY customer_id ORDER BY SUM(amount) DESC LIMIT 5
🔍 HAVING
위의
GROUP BY
문법에서, WHERE
로 카테고리는 company != 'Google'
와 같이 조건을 줄 수 있지만, 집계 함수는 가장 마지막에 실행되기 때문에 WHERE
에 넣을 수 없다. 이 때, 맨 마지막에 HAVING
을 넣음으로써 조건을 줄 수 있다.SELECT company, SUM(sales) FROM finance_table WHERE company != 'Google' GROUP BY company HAVING SUM(sales) > 1000
SELECT customer_id, SUM(amount) FROM payment WHERE customer_id NOT IN (184, 87, 477) GROUP BY customer_id HAVING SUM(amount) > 100
💡 문제
SELECT customer_id, SUM(amount) FROM payment WHERE staff_id = 2 GROUP BY customer_id HAVING SUM(amount) >= 110
SELECT COUNT(title) FROM film WHERE title LIKE 'J%';
SELECT first_name,last_name FROM customer WHERE first_name LIKE 'E%' AND address_id < 500 ORDER BY customer_id DESC
댓글