GROUP BY
지정한 열의 데이터 값을 기준으로 그룹화하여 집계 함수 적용
GROUP BY 동작 순서
- 테이블에서 WHERE 조건식에 맞는 데이터 값만 구분
- 지정한 열 기준으로 같은 데이터 값으로 그룹화
- 지정한 열들의 그룹화된 집계 결과 출력
GROUP BY 절 특징
- WHERE 절은 그룹화 되기 전에 조건식 적용
- GROUP BY 절 사용시 SELECT 절에 지정된 기준 열을 지정
- SELECT 절에 그룹함수 없어도 GROUP BY 절 사용 가능
# GROUP BY절 예제
SELECT first_name, COUNT(*)
FROM customer
GROUP BY first_name
# 다중 GROUP BY절 예제
SELECT rating, special_features, rental_duration, COUNT(*)
FROM customer
GROUP BY rating, special_features, rental_duration
# WITH ROLLUP 예제
# 소계 및 합계를 보여줌
SELECT staff_id, customer_id, MIN(amount), MAX(amount), SUM(amount), AVG(amount)
FROM payment
GROUP BY staff_id, customer_id WITH ROLLUP
# GROUP BY ~ WHERE 절 예제
SELECT staff_id, customer_id, SUM(amount)
FROM payment
WHERE payment_data < '2005-06-01'
GROUP BY staff_id, customer_id
HAVING
WHERE 절에서는 집계 함수를 사용할 수 없음
WHERE 절은 GROUP BY 하기 전에 미리 필터링 하는 조건으로 사용되는데,
HAVING 절은 GROUP BY 할 때, HAVING 절의 기준에 따라서 필터링 함
그룹화된 집계 결과에 조건식을 적용할 때 HAVING 절 사용
# 예제1
SELECT rating, special_features, SUM(replacement_cost)
FROM film
GROUP BY rating, special_features
HAVING SUM(replacement_cost) < 300
# 예제2
SELECT staff_id, customer_id, COUNT(*)
FROM rental
GROUP BY staff_id, customer_id
HAVING COUNT(*) > 20
집합 연산자
※ SELECT에 있는 컬럼의 수와, 컬럼의 도메인이 같아야 한다
# UNION (중복 제외)
SELECT rating, special_features, title
FROM film
WHERE special_features = 'Trailers'
UNION
SELECT rating, special_features, title
FROM film
WHERE rating = 'G'
# UNION ALL (중복 포함)
SELECT rating, special_features, title
FROM film
WHERE special_features = 'Trailers'
UNION ALL
SELECT rating, special_features, title
FROM film
WHERE rating = 'G'
# INTERSECT
SELECT rating, special_features, title
FROM film
WHERE special_features = 'Trailers'
INTERSECT
SELECT rating, special_features, title
FROM film
WHERE rating = 'G'
# EXCEPT
SELECT rating, special_features, title
FROM film
WHERE special_features = 'Trailers'
EXCEPT
SELECT rating, special_features, title
FROM film
WHERE rating = 'G'
출처
- 이수안 컴퓨터 연구소