집계함수란 여러 조건을 입력해 하나의 결과를 반환하는 함수를 말한다.
💡 이때 주의할 점은 집계 함수는 SELECT절이나 HAVING절에서만 호출된다.
전달된 값들의 평균 값을 반환하는데, 이때 주의할 점은 부동 소수점 값을 반환한다는 것이다.
ROUND()
함수를 이용해 특정한 소수점 값으로 반환할 수 있다.
💡
ROUND()
함수첫 번째 인자로는 반올림할 값을 받고, 두 번째 인자로는 반올림할 자리수를 받는다.
SELECT ROUND(AVG(replacement_cost), 2)
FROM film;
SELECT count(*)
FROM film;
SELECT MAX(replacement_cost), MIN(replacement_cost)
FROM film;
SELECT SUM(replacement_cost)
FROM film;
GROUP BY는 일정 카테고리별로 열을 집계한다.
SELECT category_col, 집계함수(data_col)
FROM table
WHERE category_col != 'A'
GROUP BY category_col;
👉 GROUP BY문은 FROM문 바로 뒤 또는 WHERE문 바로 뒤에 위치해야 한다.
단 집계함수의 인자로 전달된 열은 예외이다.
WHERE문이 실행된 후에 집계함수가 실행되기 때문이다.
👉 이 경우 결과를 필터링하는 HAVING문을 이용해 해결할 수 있다
SELECT customer_id, SUM(amount)
FROM payment
GROUP BY customer_id
ORDER BY SUM(amount) DESC;
SELECT customer_id, staff_id, SUM(amount)
FROM payment
GROUP BY staff_id, customer_id
ORDER BY customer_id;
이때 GROUP BY에서 열의 순서는 중요하지 않다. 하지만 보통 SELECT문과 순서를 맞춘다.
❇︎ DATE 함수
DATE 함수는 타임스탬프 정보 중 날짜 부분만 추출하는 함수이다.
SELECT DATE(payment_date), SUM(amount)
FROM payment
GROUP BY DATE(payment_date)
ORDER BY SUM(amount) DESC;
HAVING절은 집계가 이미 수행된 결과를 필터링하는 역할로, GROUP BY 호출 뒤에 위치한다.
💡실행 순서
• WHERE문 필터링 → GROUP BY 실행 → 집계 함수 실행 → HAVING절을 통해 집계된 결과를 필터링
• 따라서 집계 함수 결과에 대해선 WHERE문으로 필터링 할 수 없기 떄문에 → 이때 HAVING절을 사용한다.
SELECT company, SUM(sales)
FROM finance_table
WHERE company != "Google"
GROUP BY company
HAVING SUM(sales) > 1000;
SELECT store_id, COUNT(*)
FROM customer
WHERE store_id NOT IN(2)
GROUP BY store_id
HAVING COUNT(*) > 300;
SELECT staff_id, COUNT(*)
FROM payment
GROUP BY staff_id
ORDER BY COUNT(*) DESC;
SELECT rating, ROUND(AVG(replacement_cost), 2)
FROM film
GROUP BY rating;
SELECT customer_id, SUM(amount)
FROM payment
GROUP BY customer_id
ORDER BY SUM(amount) DESC
LIMIT 5;
SELECT customer_id, COUNT(*)
FROM payment
GROUP BY customer_id
HAVING COUNT(*) >= 40;
SELECT customer_id, SUM(amount)
FROM payment
WHERE staff_id = 2
GROUP BY customer_id
HAVING SUM(amount) > 100
SELECT COUNT(*)
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
LIMIT 1;