SQL의 COUNT와 HAVING을 결합하여 조건을 충족하는 데이터만 카운트하는 방법

SQL의 COUNT 함수와 HAVING 구문을 결합하면 특정 조건을 충족하는 데이터만 효율적으로 카운트할 수 있습니다. 이번 기사에서는 이러한 SQL 기능을 사용한 데이터 집계 방법에 대해 기본부터 응용까지 자세히 설명합니다.

목차

COUNT 함수의 기본 사용법

COUNT 함수는 지정한 열의 값을 카운트하기 위한 SQL 함수입니다. 데이터베이스 내의 행 수를 간단히 얻을 수 있으며, 특히 NULL 값을 포함할 경우 유용합니다.

COUNT 함수의 기본 구문

SELECT COUNT(column_name)
FROM table_name;

이 구문은 table_name 테이블의 column_name 열에 포함된 값의 수를 카운트합니다.

모든 행을 카운트하는 경우

모든 행을 카운트하려면 열 이름 대신 별표(*)를 사용합니다.

SELECT COUNT(*)
FROM table_name;

이 구문은 table_name 테이블의 모든 행 수를 카운트합니다.

특정 조건을 만족하는 행을 카운트하는 경우

특정 조건을 만족하는 행만 카운트하려면 WHERE 구문을 결합합니다.

SELECT COUNT(*)
FROM table_name
WHERE condition;

이 예에서는 condition을 만족하는 행만 카운트됩니다.

HAVING 구문 기본 사용법

HAVING 구문은 SQL의 집계 함수(SUM, COUNT, AVG 등)를 사용한 후 그룹화된 결과에 대해 조건을 설정하는 데 사용됩니다. WHERE 구문과 달리, HAVING 구문은 그룹별 조건을 지정하는 데 사용됩니다.

HAVING 구문의 기본 구문

SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING condition;

이 구문은 column_name으로 그룹화된 결과에서 condition을 만족하는 그룹만 반환합니다.

WHERE 구문과의 차이점

WHERE 구문은 그룹화나 집계가 이루어지기 전에 조건을 지정하는 반면, HAVING 구문은 그룹화나 집계 후에 조건을 지정합니다. 아래 예를 보겠습니다.

-- WHERE 구문 예시
SELECT column_name
FROM table_name
WHERE condition
GROUP BY column_name;

-- HAVING 구문 예시
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;

WHERE 구문은 그룹화 전에 조건을 적용하고, HAVING 구문은 그룹화 후에 조건을 적용합니다.

실제 사용 예시

다음으로 HAVING 구문의 실제 사용 예시를 보여줍니다. 예를 들어 특정 열로 그룹화한 후, 그 그룹의 카운트가 일정 이상인 경우만 추출하는 쿼리는 다음과 같습니다.

SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 10;

이 쿼리는 각 부서별로 직원 수를 카운트하고, 직원 수가 10명 이상인 부서만 반환합니다.

COUNT와 HAVING을 결합할 때의 이점

COUNT 함수와 HAVING 구문을 결합하면 특정 조건을 충족하는 데이터를 효율적으로 필터링하고 집계할 수 있습니다. 이 섹션에서는 그 구체적인 이점에 대해 설명합니다.

그룹별 조건부 집계

COUNT와 HAVING을 결합하면 특정 그룹에만 조건을 적용하고 그 결과를 집계할 수 있습니다. 예를 들어, 각 부서의 직원 수가 일정 이상인 부서만 추출하는 경우에 유용합니다.

예시

SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) > 10;

이 쿼리는 직원 수가 10명 이상인 부서만 나열합니다.

데이터의 정확성과 효율성 향상

HAVING 구문을 사용하면 불필요한 데이터를 필터링하고 필요한 데이터만 추출할 수 있어 데이터 분석의 정확성과 효율성이 향상됩니다.

예시

SELECT product_id, COUNT(order_id)
FROM orders
GROUP BY product_id
HAVING COUNT(order_id) > 50;

이 쿼리는 50번 이상 주문된 제품 ID만 추출합니다.

데이터 시각화 및 보고서 작성의 간소화

집계 결과에 조건을 설정하면 데이터 시각화와 보고서 작성이 간편해지며 중요한 경향이나 이상값을 신속하게 파악할 수 있습니다.

예시

SELECT sales_rep, COUNT(sale_id)
FROM sales
GROUP BY sales_rep
HAVING COUNT(sale_id) < 5;

이 쿼리는 판매 건수가 5건 미만인 영업 사원을 파악하고, 개선이 필요한 영역을 명확히 합니다.

유연한 데이터 분석

HAVING 구문은 집계 후 데이터에 대해 유연하게 조건을 적용할 수 있어 복잡한 데이터 분석을 쉽게 수행할 수 있습니다.

예시

SELECT customer_id, COUNT(order_id)
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) BETWEEN 5 AND 10;

이 쿼리는 5회에서 10회 사이에 주문한 고객을 추출합니다.

COUNT와 HAVING의 결합을 적용하면 필요한 정보를 효율적으로 추출하여 데이터 분석의 정확성을 높일 수 있습니다.

실제 SQL 쿼리 예시

여기에서는 COUNT 함수와 HAVING 구문을 결합한 구체적인 SQL 쿼리 예시를 몇 가지 소개하고, 그 동작을 자세히 설명합니다.

예시1: 각 부서의 직원 수를 카운트하고, 10명 이상의 부서 추출

다음 쿼리는 직원 테이블에서 각 부서의 직원 수를 카운트하고, 그 수가 10명 이상인 부서만 추출합니다.

SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

이 쿼리는 부서별로 그룹화하고, 각 그룹의 직원 수를 카운트한 결과를 반환합니다. 이후, 직원 수가 10명 이상인 부서만 필터링합니다.

예시2: 각 상품의 주문 수를 카운트하고, 50회 이상 주문된 상품 추출

다음 쿼리는 주문 테이블에서 각 상품의 주문 수를 카운트하고, 그 수가 50회 이상인 상품만 추출합니다.

SELECT product_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY product_id
HAVING COUNT(order_id) >= 50;

이 쿼리는 상품별로 그룹화하고, 각 상품의 주문 수를 카운트한 결과를 반환합니다. 이후, 주문 수가 50회 이상인 상품만 필터링합니다.

예시3: 각 고객의 주문 수를 카운트하고, 5회에서 10회 주문한 고객 추출

다음 쿼리는 고객 테이블에서 각 고객의 주문 수를 카운트하고, 그 수가 5회에서 10회 사이인 고객만 추출합니다.

SELECT customer_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY customer_id
HAVING COUNT(order_id) BETWEEN 5 AND 10;

이 쿼리는 고객별로 그룹화하고, 각 고객의 주문 수를 카운트한 결과를 반환합니다. 이후, 주문 수가 5회에서 10회인 고객만 필터링합니다.

예시4: 각 카테고리의 총 매출을 계산하고, 매출이 $1000 이상인 카테고리 추출

다음 쿼리는 판매 테이블에서 각 카테고리의 총 매출을 계산하고, 그 합계가 $1000 이상인 카테고리만 추출합니다.

SELECT category, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY category
HAVING SUM(sales_amount) >= 1000;

이 쿼리는 카테고리별로 그룹화하고, 각 카테고리의 총 매출을 계산한 결과를 반환합니다. 이후, 매출 합계가 $1000 이상인 카테고리만 필터링합니다.

이러한 쿼리 예시를 통해 COUNT 함수와 HAVING 구문을 효과적으로 결합하여 다양한 조건을 충족하는 데이터를 추출하는 방법을 배웠습니다. 이제 응용 예를 살펴보겠습니다.

응용 예: 그룹별 조건부 카운트

여기서는 특정 조건을 충족하는 그룹별 데이터를 카운트하는 응용 예를 소개합니다. 이 기술을 사용하면 더 복잡한 데이터 분석을 수행할 수 있습니다.

예시1: 각 부서의 평균 급여를 계산하고, 평균 급여가 $50,000 이상인 부서 추출

이 쿼리는 직원 테이블에서 각 부서의 평균 급여를 계산하고, 그 평균이 $50,000 이상인 부서만 추출합니다.

SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) >= 50000;

이 쿼리는 부서별로 그룹화하고, 각 그룹의 평균 급여를 계산한 결과를 반환합니다. 이후, 평균 급여가 $50,000 이상인 부서만 필터링합니다.

예시2: 각 영업 사원의 총 매출을 계산하고, 매출이 $100,000 이상인 영업 사원 추출

다음 쿼리는 판매 테이블에서 각 영업 사원의 총 매출을 계산하고, 그 합계가 $100,000 이상인 영업 사원만 추출합니다.

SELECT sales_rep, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY sales_rep
HAVING SUM(sales_amount) >= 100000;

이 쿼리는 영업 사원별로 그룹화하고, 각 그룹의 총 매출을 계산한 결과를 반환합니다. 이후, 매출 합계가 $100,000 이상인 영업 사원만 필터링합니다.

예시3: 각 상품의 평균 평가를 계산하고, 평균 평가가 4.5 이상인 상품만 추출

다음 쿼리는 리뷰 테이블에서 각 상품의 평균 평가를 계산하고, 그 평균이 4.5 이상인 상품만 추출합니다.

SELECT product_id, AVG(rating) AS average_rating
FROM reviews
GROUP BY product_id
HAVING AVG(rating) >= 4.5;

이 쿼리는 상품별로 그룹화하고, 각 그룹의 평균 평가를 계산한 결과를 반환합니다. 이후, 평균 평가가 4.5 이상인 상품만 필터링합니다.

예시4: 각 프로젝트의 총 작업 시간을 계산하고, 총 작업 시간이 100시간 이상인 프로젝트 추출

다음 쿼리는 프로젝트 테이블에서 각 프로젝트의 총 작업 시간을 계산하고, 그 합계가 100시간 이상인 프로젝트만 추출합니다.

SELECT project_id, SUM(hours_worked) AS total_hours
FROM project_hours
GROUP BY project_id
HAVING SUM(hours_worked) >= 100;

이 쿼리는 프로젝트별로 그룹화하고, 각 그룹의 총 작업 시간을 계산한 결과를 반환합니다. 이후, 총 작업 시간이 100시간 이상인 프로젝트만 필터링합니다.

정리

COUNT 함수와 HAVING 구문을 결합하여 특정 조건을 만족하는 데이터를 효율적으로 집계 및 필터링할 수 있습니다. 이를 통해 데이터 분석의 정확도와 효율성이 크게 향상되어 중요한 인사이트를 신속하게 얻을 수 있습니다. 다음으로 연습 문제에 도전하여 이해를 심화해 봅시다.

연습 문제

COUNT 함수와 HAVING 구문을 사용한 SQL 쿼리의 연습 문제를 통해 실용적인 기술을 습득합시다. 아래 문제를 풀며 이해를 깊이게 하세요.

문제1: 특정 조건을 만족하는 부서의 직원 수를 카운트

직원 테이블(employees)에서 각 부서(department)의 직원 수를 카운트하고, 그 수가 15명 이상인 부서만 추출하는 쿼리를 작성하세요.

-- 답안 란
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 15;

문제2: 주문 수가 많은 상품 추출

주문 테이블(orders)에서 각 상품의 주문 수를 카운트하고, 그 수가 30회 이상인 상품만 추출하는 쿼리를 작성하세요.

-- 답안 란
SELECT product_id, COUNT(order_id) AS order_count
FROM orders
GROUP BY product_id
HAVING COUNT(order_id) >= 30;

문제3: 고평가 상품 추출

리뷰(reviews) 테이블에서 각 상품의 평균 평가를 계산하고, 그 평균이 4.0 이상인 상품만 추출하는 쿼리를 작성하세요.

-- 답안 란
SELECT product_id, AVG(rating) AS average_rating
FROM reviews
GROUP BY product_id
HAVING AVG(rating) >= 4.0;

문제4: 매출이 많은 영업 사원 추출

판매(sales) 테이블에서 각 영업 사원(sales_rep)의 총 매출을 계산하고, 그 합계가 $200,000 이상인 영업 사원만 추출하는 쿼리를 작성하세요.

-- 답안 란
SELECT sales_rep, SUM(sales_amount) AS total_sales
FROM sales
GROUP BY sales_rep
HAVING SUM(sales_amount) >= 200000;

문제5: 프로젝트 총 작업 시간을 계산

프로젝트 시간(project_hours) 테이블에서 각 프로젝트(project_id)의 총 작업 시간을 계산하고, 그 합계가 50시간 이상인 프로젝트만 추출하는 쿼리를 작성하세요.



-- 답안 란
SELECT project_id, SUM(hours_worked) AS total_hours
FROM project_hours
GROUP BY project_id
HAVING SUM(hours_worked) >= 50;

정리

연습 문제를 통해 COUNT 함수와 HAVING 구문을 사용한 SQL 쿼리 작성 방법을 배웠습니다. 이러한 기술을 응용하여 실제 데이터베이스에 대한 집계 및 분석을 수행함으로써 데이터에서 유익한 인사이트를 얻을 수 있습니다. 다음으로 자주 발생하는 오류와 그 대처 방법을 배워서 이해를 더욱 심화합시다.

자주 발생하는 오류와 그 대처 방법

COUNT 함수와 HAVING 구문을 사용할 때 자주 겪는 오류와 그 대처 방법에 대해 설명합니다. 이러한 지식을 습득하면 SQL 쿼리의 디버그 및 수정이 쉬워집니다.

오류1: 열 ‘column_name’이 ‘GROUP BY’ 구문에 포함되지 않음

이 오류는 SELECT 구문에 포함된 열이 GROUP BY 구문에 포함되지 않은 경우 발생합니다.

-- 오류 예시
SELECT department, employee_name, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

이 쿼리는 employee_name 열이 GROUP BY 구문에 포함되지 않아 오류가 발생합니다.

대처 방법

SELECT 구문에 포함된 모든 열을 GROUP BY 구문에 추가합니다.

-- 수정 예시
SELECT department, employee_name, COUNT(employee_id)
FROM employees
GROUP BY department, employee_name
HAVING COUNT(employee_id) >= 10;

오류2: 비집계 열이 SELECT 구문에 포함됨

이 오류는 집계 함수를 사용하지 않은 열이 SELECT 구문에 포함된 경우 발생합니다.

-- 오류 예시
SELECT department, salary, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

이 쿼리는 salary 열이 집계되지 않아 오류가 발생합니다.

대처 방법

집계 함수를 사용하거나 GROUP BY 구문에 추가합니다.

-- 수정 예시1: 집계 함수 사용
SELECT department, AVG(salary) AS average_salary, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;
-- 수정 예시2: GROUP BY 구문에 추가
SELECT department, salary, COUNT(employee_id)
FROM employees
GROUP BY department, salary
HAVING COUNT(employee_id) >= 10;

오류3: HAVING 구문에서 사용된 집계 함수가 SELECT 구문에 없음

HAVING 구문에서 사용된 집계 함수가 SELECT 구문에 포함되지 않은 경우 발생합니다.

-- 오류 예시
SELECT department
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

이 쿼리는 COUNT 함수가 SELECT 구문에 없기 때문에 오류가 발생합니다.

대처 방법

HAVING 구문에서 사용된 집계 함수를 SELECT 구문에 추가합니다.

-- 수정 예시
SELECT department, COUNT(employee_id) AS employee_count
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

오류4: 유효하지 않은 HAVING 구문 조건

HAVING 구문의 조건이 유효하지 않은 경우 발생합니다. 예를 들어 문자열을 숫자로 비교하려는 경우입니다.

-- 오류 예시
SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) = 'ten';

이 쿼리는 문자열 'ten'을 숫자로 비교하려 하여 오류가 발생합니다.

대처 방법

HAVING 구문의 조건이 올바른 데이터 유형인지 확인합니다.

-- 수정 예시
SELECT department, COUNT(employee_id)
FROM employees
GROUP BY department
HAVING COUNT(employee_id) >= 10;

정리

COUNT 함수와 HAVING 구문을 사용할 때 자주 발생하는 오류와 그 대처 방법에 대해 배웠습니다. 이러한 지식을 활용하여 효율적이고 정확한 데이터 집계를 수행합시다. 이제 이번 기사 내용을 정리하겠습니다.

정리

COUNT 함수와 HAVING 구문을 결합하여 특정 조건을 충족하는 데이터를 효율적으로 카운트하고, 그룹별로 세부적인 분석을 할 수 있습니다. 기본 사용법부터 응용 예시, 자주 발생하는 오류와 그 대처 방법까지 포괄적으로 설명했습니다. 이러한 지식을 실무에 활용하여 데이터베이스에서 유익한 인사이트를 얻는 기술을 연마하세요. SQL의 집계 기능을 최대한 활용하여 데이터 분석의 정확도와 효율성을 높일 수 있습니다.

목차