[SQL] 2. GROUP BY문
💽

[SQL] 2. GROUP BY문

카테고리
💽 Database
작성자
박용성박용성
작성일
2024년 08월 11일
태그
SQL
floatFirstTOC: right

🖥️ 시작하며

SQL의 GROUP BY문과 집계 함수에 대해 알아보자.

🔍 그 전에, 집계 함수

💡
집계 함수는 하나의 열에 대해서만 호출할 수 있다.
SQL에는 AVG(), COUNT() , MIN() , MAX() , SUM() 와 같은 다양한 집계 함수들이 존재한다.
  1. AVG()
    1. 부동소수점으로 변환되어 ROUND() 와 같이 써야 한다는 것을 잊지 말아야 한다.
      SELECT AVG(replacement_cost) FROM film;
      SELECT ROUND(AVG(replacement_cost), 2) FROM film; >>> 19.98
  1. COUNT()
    1. 행의 개수만 반환한다.
  1. MIN() , MAX()
    1. 해당 열의 가장 최솟값, 최댓값을 반환한다.
      SELECT MIN(replacement_cost) FROM film;
  1. SUM()
    1. 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;
→ 총 사용금액을 스태프, 손님과 카테고리화 한다.
notion image
 
여기서 GROUP BY 뒤에 오는 테이블 순서는 중요하지 않다.
 
SELECT DATE(payment_date), SUM(amount) FROM payment GROUP BY DATE(payment_date);
notion image
 

📌 연습문제 #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

댓글

guest