Computer >> 컴퓨터 >  >> 프로그래밍 >> SQL

SQL HAVING 절 완벽 가이드: 집계 함수로 데이터 필터링하기

SQL은 데이터베이스에 쿼리를 요청하기 위한 다양한 연산 방식을 제공합니다. 그중 HAVING 문은 초기 쿼리 위에 서브쿼리처럼 작동하는 추가 필터 역할을 합니다. 공통된 값을 가진 방대한 양의 데이터를 더 세밀하게 걸러내고 싶을 때 특히 유용합니다. 이 글에서는 HAVING 절의 동작 원리와 실제 사용법을 예제와 함께 살펴보겠습니다.

사전 준비

이번 예제에서는 MySQL 환경의 샘플 스키마를 사용합니다. 먼저 아래 코드로 'Cars' 테이블을 생성해 보겠습니다.

create table Cars (
	id INT PRIMARY KEY,
	year VARCHAR(50),
	car_make VARCHAR(50),
	car_model VARCHAR(50)
);

이렇게 하면 각 차량의 연식(year), 제조사(car_make), 모델명(car_model) 정보를 저장하는 'Cars' 테이블이 만들어집니다. 다음 코드는 해당 컬럼에 샘플 데이터를 삽입합니다:

insert into Cars (id, year, car_make, car_model) values (1, 2011, 'Mazda', 'Miata MX-5');
insert into Cars (id, year, car_make, car_model) values (2, 1969, 'Ford', 'Mustang');
insert into Cars (id, year, car_make, car_model) values (3, 2007, 'Toyota', '4Runner');
insert into Cars (id, year, car_make, car_model) values (4, 2013, 'Porsche', '911');
insert into Cars (id, year, car_make, car_model) values (5, 1991, 'Buick', 'Coachbuilder');
insert into Cars (id, year, car_make, car_model) values (6, 2007, 'Kia', 'Sportage');
insert into Cars (id, year, car_make, car_model) values (7, 1997, 'Oldsmobile', 'Cutlass Supreme');
insert into Cars (id, year, car_make, car_model) values (8, 2003, 'BMW', '7 Series');
insert into Cars (id, year, car_make, car_model) values (9, 1996, 'Ford', 'F150');
insert into Cars (id, year, car_make, car_model) values (10, 1992, 'Suzuki', 'SJ');
insert into Cars (id, year, car_make, car_model) values (11, 2001, 'Jeep', 'Grand Cherokee');
insert into Cars (id, year, car_make, car_model) values (12, 2000, 'Ford', 'F250');
insert into Cars (id, year, car_make, car_model) values (13, 2003, 'Honda', 'Insight');
insert into Cars (id, year, car_make, car_model) values (14, 2006, 'Chevrolet', 'HHR Panel');
insert into Cars (id, year, car_make, car_model) values (15, 1987, 'Mercedes-Benz', 'S-Class');
insert into Cars (id, year, car_make, car_model) values (16, 2004, 'Chevrolet', 'SSR');
insert into Cars (id, year, car_make, car_model) values (17, 1990, 'Maserati', '228');
insert into Cars (id, year, car_make, car_model) values (18, 2005, 'Saturn', 'Ion');
insert into Cars (id, year, car_make, car_model) values (19, 1987, 'Audi', '5000CS');
insert into Cars (id, year, car_make, car_model) values (20, 1999, 'Chevrolet', 'S10');
insert into Cars (id, year, car_make, car_model) values (21, 2007, 'Jeep', 'Liberty');
insert into Cars (id, year, car_make, car_model) values (22, 2002, 'Lamborghini', 'Murciélago');
insert into Cars (id, year, car_make, car_model) values (23, 2000, 'Hyundai', 'Tiburon');
insert into Cars (id, year, car_make, car_model) values (24, 2011, 'Jeep', 'Patriot');
insert into Cars (id, year, car_make, car_model) values (25, 1985, 'Pontiac', 'Sunbird');

연습용 테스트 데이터를 직접 만들고 싶다면 mockaroo.com과 같은 목업 데이터 생성 사이트를 활용해 보세요. 이런 도구를 사용하면 복잡한 데이터베이스 스키마도 손쉽게 구성할 수 있습니다.

HAVING 절 사용 방법

SELECT COUNT(id), car_make
FROM Cars
GROUP BY car_make
HAVING COUNT(id) > 0;

HAVING은 집계 함수(aggregate function)를 조건으로 사용해야 하는 상황에서 WHERE 절 대신 쓰이는 구문입니다. 여기서 집계 함수란 여러 행에 대해 연산을 수행한 뒤 단일 값을 반환하는 함수를 의미하며, 대표적으로 COUNT, AVG, SUM 등이 있습니다. 위 코드를 실행하면 다음과 같은 결과가 출력됩니다:

COUNT(id)car_make
1Audi
1BMW
1Buick
3Chevrolet
3Ford
1Honda
1Hyundai
3Jeep
1Kia
Lamborghini
1Maserati
Mazda
1Mercedes-Benz
1Oldsmobile
1Pontiac
1Porsche
1Saturn
1Suzuki
1Toyota

위 쿼리의 동작 순서를 살펴보겠습니다. 먼저 SELECT 문으로 존재하는 car_make의 개수(COUNT)를 조회하고, GROUP BY 절이 제조사별로 결과를 그룹화합니다. 마지막으로 HAVING 절이 그룹화된 결과에 COUNT(id) > 0이라는 추가 필터를 적용하여 최종 결과를 반환합니다.

참고로, 부트캠프 참가자의 81%는 수료 후 기술 직군 취업 전망에 대해 더 큰 자신감을 느꼈다고 응답했습니다. 지금 바로 자신에게 맞는 부트캠프를 찾아 경력 전환의 첫걸음을 시작해 보세요.

또한 부트캠프 수료생은 평균적으로 부트캠프 시작부터 첫 직장 취업까지 6개월 이내의 짧은 기간 안에 경력 전환을 완료한 것으로 나타났습니다.

정리

정리하자면, SQL 쿼리에서 HAVING 절은 집계 함수를 활용해 데이터베이스에 추가적인 필터링 작업을 수행하는 서브필터입니다. WHERE 절이 개별 행(row)을 필터링한다면, HAVING 절은 GROUP BY로 묶인 그룹 단위에 조건을 적용한다는 점이 핵심 차이입니다.

AVG, SUM, MAX, MIN 등 다양한 집계 함수를 HAVING 절과 함께 실험해 보면서 이 강력한 구문에 대한 이해를 한층 넓혀보시기 바랍니다!