SQL - Having 절

안녕하세요, 미래의 SQL 마법사 여러분! 오늘 우리는 SQL HAVING 절의 세상으로 흥미로운 여정을 떠납니다. 여러분의 친절한 이웃 컴퓨터 교사로서, 저는 이 모험을 단계별로 안내해드리겠습니다. 그러니 가상의 메모지를 손에 들고, 함께 뛰어들어보겠습니다!

SQL - Having Clause

SQL HAVING 절

자, 친구들과 파티를 조직하는 데 있어서, 당신과 5명 이상의 공통 친구가 있는 친구들만 초대하고 싶다면 어떨까요? SQL에서 HAVING 절이 하는 일이 exactamente 그거입니다. 그것은 특정 조건에 기반하여 그룹 결과를 필터링해줍니다.

HAVING 절은 데이터 파티의 문 앞에 선 보디가드와 같습니다. 당신이 설정한 규칙에 따라 어떤 데이터 그룹이 들어올 수 있는지 결정합니다. 간단한 예제를 보겠습니다:

SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;

이 예제에서 우리는 각 부서의 평균 급여를 보고 싶지만, 평균 급여가 $50,000 이상인 부서만 보고 싶습니다. HAVING 절은 우리의 보디가드로서, 각 그룹(부서)을 검사하고 우리의 기준을 충족하는 그룹만 허용합니다.

HAVING 절과 GROUP BY 절

HAVING 절은 GROUP BY와 자주 함께 사용됩니다. 두 친구처럼 항상 함께 다니는 것처럼요. GROUP BY는 데이터를 그룹으로 정리하고, HAVING은 이 그룹을 조건에 따라 필터링합니다.

다른 예제를 보겠습니다:

SELECT product_category, COUNT(*) as product_count
FROM products
GROUP BY product_category
HAVING COUNT(*) > 10
ORDER BY product_count DESC;

여기서 무슨 일이 일어나고 있는지 보겠습니다:

  1. 우리는 제품을 카테고리별로 그룹화하고 있습니다.
  2. 각 카테고리에 있는 제품의 수를 계산하고 있습니다.
  3. HAVING 절은 10개 이상의 제품이 있는 카테고리만 허용합니다.
  4. 마지막으로, 우리는 제품 수를 내림차순으로 정렬합니다.

이는 옷장을 정리하는 것처럼, 10개 이상의 아이템이 있는 섹션만 남기고, 그것들을 많은 것부터 적은 것으로 정렬하는 것과 같습니다.

HAVING 절과 ORDER BY 절

이전 예제에서 보았듯이, HAVING은 ORDER BY와도 잘 어울립니다. 또 다른 예제를 보겠습니다:

SELECT customer_id, SUM(order_total) as total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(order_total) > 1000
ORDER BY total_spent DESC;

이 쿼리는 VIP 고객을 찾는 것과 같습니다:

  1. 우리는 주문을 고객별로 그룹화하고 있습니다.
  2. 각 고객이 지출한 총 금액을 계산하고 있습니다.
  3. HAVING 절은 $1000 이상을 지출한 고객만 허용합니다.
  4. 그런 다음, 우리는 이 VIP 고객들을 지출 금액이 높은 순서로 정렬합니다.

HAVING 절과 COUNT() 함수

COUNT() 함수는 HAVING의 충실한 동반자입니다. 예제를 보겠습니다:

SELECT author, COUNT(book_id) as book_count
FROM books
GROUP BY author
HAVING COUNT(book_id) >= 5
ORDER BY book_count DESC;

이 쿼리는 많은 책을 쓴 작가를 찾는 것입니다:

  1. 우리는 책을 작가별로 그룹화하고 있습니다.
  2. 각 작가가 쓴 책의 수를 계산하고 있습니다.
  3. HAVING 절은 5권 이상의 책을 쓴 작가만 허용합니다.
  4. 그런 다음, 우리는 가장 많은 책을 쓴 작가부터 정렬합니다.

HAVING 절과 AVG() 함수

AVG() 함수도 HAVING의 좋은 친구입니다. 그들을 활용해 보겠습니다:

SELECT department, AVG(performance_score) as avg_score
FROM employee_performance
GROUP BY department
HAVING AVG(performance_score) > 8.5
ORDER BY avg_score DESC;

이 쿼리는 스타 성과를 가진 부서를 찾는 것입니다:

  1. 우리는 성과 점수를 부서별로 그룹화하고 있습니다.
  2. 각 부서의 평균 점수를 계산하고 있습니다.
  3. HAVING 절은 평균 점수가 8.5 이상인 부서만 허용합니다.
  4. 그런 다음, 우리는 가장 높은 성과를 가진 부서부터 정렬합니다.

HAVING 절과 MAX() 함수

마지막으로, HAVING이 MAX() 함수와 어떻게 작동하는지 보겠습니다:

SELECT product_category, MAX(price) as highest_price
FROM products
GROUP BY product_category
HAVING MAX(price) > 1000
ORDER BY highest_price DESC;

이 쿼리는 럭셔리 제품 카테고리를 찾는 것입니다:

  1. 우리는 제품을 카테고리별로 그룹화하고 있습니다.
  2. 각 카테고리의 최고 가격을 찾고 있습니다.
  3. HAVING 절은 최소 하나의 제품이 $1000 이상의 가격을 가진 카테고리만 허용합니다.
  4. 그런 다음, 우리는 가장 비싼 아이템을 가진 카테고리부터 정렬합니다.

그렇게 해서, 여러분은 HAVING 절과 그의 친구들에 대해 배웠습니다! 연습이 완벽을 이루는 열쇠이니, 이 쿼리들을 실험해 보지 마세요. 얼마 지나지 않아 프로처럼 복잡한 SQL 쿼리를 작성할 수 있을 것입니다!

여기 우리가 다루었던 방법们的 빠른 참고 표입니다:

방법 설명 예제
HAVING 그룹 결과를 필터링 HAVING AVG(salary) > 50000
GROUP BY 행을 유사한 값을 기준으로 그룹화 GROUP BY department
ORDER BY 결과 집을 정렬 ORDER BY total_spent DESC
COUNT() 행의 수를 계산 HAVING COUNT(book_id) >= 5
AVG() 값들의 평균을 계산 HAVING AVG(performance_score) > 8.5
MAX() 값들의 최대값을 반환 HAVING MAX(price) > 1000

Happy querying, and may your data always be clean and your queries efficient!

Credits: Image by storyset