1. 문제 목적
GROUP BY, COUNT, HAVING 절을 활용하여 데이터베이스에서 중복된 데이터를 그룹화하고 특정 조건에 맞는 데이터를 필터링하는 방법을 학습하는 것이다.
WHERE와 HAVING 절의 차이점을 이해하고 GROUP BY로 그룹화된 데이터에 집계 조건을 추가하는 방법을 배운다.
2. 핵심 개념
GROUP BY
- 정의: 특정 열의 값을 기준으로 데이터를 그룹화하여 각 그룹별 요약 결과를 반환한다.
SELECT 열1, COUNT(*)
FROM 테이블명
GROUP BY 열1;
- 주요 특징:묶인 그룹별로 집계 함수(COUNT, SUM 등)를 사용할 수 있다.
- 그룹화는 특정 열을 기준으로 데이터를 묶어준다.
COUNT 함수
- 정의: 특정 열 또는 레코드의 개수를 계산하는 함수.
SELECT COUNT(*)
FROM 테이블명;
- 주요 특징:COUNT(열 이름): NULL이 아닌 값만 카운트.
- COUNT(*): 모든 레코드를 계산.
HAVING 절
- 정의: GROUP BY로 그룹화된 데이터에 조건을 적용하는 필터링 절.
SELECT 열1, COUNT(*)
FROM 테이블명
GROUP BY 열1
HAVING COUNT(*) >= 2;
- 주요 특징:WHERE와는 달리, GROUP BY 이후에 집계된 데이터에 조건을 적용한다.
- HAVING은 집계 함수의 결과를 기준으로 조건을 설정할 때 사용된다.
ORDER BY
- 정의: 데이터를 특정 열을 기준으로 정렬한다.
- 사용 방법:
- SELECT 열1, COUNT(*) FROM 테이블명 GROUP BY 열1 ORDER BY 열1 ASC;
- ASC(오름차순)가 기본이며, 내림차순은 DESC를 사용한다.
3. 문제 해결 절차
- 데이터 분석:
- ANIMAL_INS 테이블의 NAME 열을 기준으로 데이터 그룹화가 필요하다.
- 각 이름별 등장 횟수를 계산하고, 2번 이상 등장한 이름만 출력해야 한다.
- 조건 설정:
- NULL 이름은 제외한다.
- HAVING 절을 사용해 등장 횟수가 2번 이상인 데이터를 필터링한다.
- 그룹화 및 집계:
- GROUP BY로 NAME을 기준으로 그룹화하고, COUNT 함수로 각 그룹의 크기를 계산한다.
- 결과 정렬:
- 이름을 기준으로 오름차순 정렬하여 결과를 출력한다.
- SQL 작성 및 실행:
- 위의 요구 조건을 반영한 SQL 작성 및 테스트.
4. 코드 작성
-- 동물 보호소의 동명 동물 수를 찾는 SQL
SELECT
NAME, -- 동물 이름
COUNT(NAME) AS '횟수' -- 각 이름별 등장 횟수 집계
FROM
ANIMAL_INS -- 동물 보호소 데이터 테이블
WHERE
NAME IS NOT NULL -- NULL인 이름 제외
GROUP BY
NAME -- 이름별로 데이터 그룹화
HAVING
COUNT(NAME) >= 2 -- 등장 횟수가 2번 이상인 이름만 필터링
ORDER BY
NAME ASC; -- 이름을 기준으로 오름차순 정렬
5. 코드 분석
SELECT 절
- NAME:
- 동물 이름 열을 선택해 결과에 포함.
- COUNT(NAME) AS '횟수':
- 각 동물 이름별 등장 횟수를 계산하고, 출력 열의 이름을 '횟수'로 지정.
FROM 절
- ANIMAL_INS:
- 동물 보호소의 동물 데이터를 포함하는 테이블.
WHERE 절
- NAME IS NOT NULL:
- 이름이 없는(NULL) 데이터를 제외하고, 이름이 존재하는 레코드만 포함.
GROUP BY 절
- NAME:그룹화된 각 이름별로 COUNT 함수가 적용된다.
- 동물 이름을 기준으로 데이터를 그룹화한다.
HAVING 절
- COUNT(NAME) >= 2:
- 그룹화된 결과 중 등장 횟수가 2번 이상인 데이터만 필터링한다.
ORDER BY 절
- NAME ASC:
- 결과를 동물 이름 기준으로 오름차순 정렬.
'SQL Kit > GROUP BY' 카테고리의 다른 글
입양 시각 구하기(1) [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.09 |
---|---|
고양이와 개는 몇 마리 있을까 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.09 |
진료과별 총 예약 횟수 출력하기 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.04 |
성분으로 구분한 아이스크림 총 주문량 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.04 |
자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 [ 프로그래머스 | SQL Kit | Level 2 ] (0) | 2025.03.04 |