📚 출처 - 프로그래머스
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
---|---|---|---|---|---|
A373219 | Cat | 2014-07-29 11:43:00 | Normal | Ella | Spayed Female |
A377750 | Dog | 2017-10-25 17:17:00 | Normal | Lucy | Spayed Female |
A354540 | Cat | 2014-12-11 11:48:00 | Normal | Tux | Neutered Male |
출력
고양이는 2마리, 개는 1마리 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
ANIMAL_TYPE | count |
---|---|
Cat | 2 |
Dog | 1 |
SELECT ANIMAL_TYPE, count(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
GROUP BY를 사용하면 정렬도 된다고 알고 있었는데, ORDER BY를 사용하지 않으면 틀리는게 약간 의문이다.
WHERE랑 HAVING의 차이는 WHERE은 그룹화 하기 전이고, HAVING은 그룹화 후에 조건입니다.
사용법
1. 컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화 할 컬럼;
2. 조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화 할 컬럼;
3. 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식;
4. 조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화 할 컬럼 HAVING 조건식;
5. ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식] GROUP BY 그룹화 할 컬럼 [HAVING 조건식] ORDER BY 컬럼1;
예제 쿼리(Example Query)
Table name = friend
idx | type | name |
---|---|---|
1 | 1 | 오동 |
2 | 1 | 동훈 |
3 | 2 | 승현 |
4 | 2 | 민기 |
5 | 3 | 태하 |
6 | 3 | 현우 |
7 | 4 | 세영 |
ex 1. type 그룹화하여 name 개수 조회 (컬럼 그룹화)
SELECT type, COUNT(name) AS cnt
FROM friend
GROUP BY type;
결과
type | cnt |
---|---|
1 | 2 |
2 | 2 |
3 | 2 |
4 | 1 |
ex 2. type 2초과인, type을 그룹화하여 name 개수 조회 (조건 처리 후 컬럼 그룹화)
SELECT type, COUNT(name) AS cnt
FROM friend
WHERE type > 2
GROUP BY type;
결과
type | cnt |
---|---|
3 | 2 |
4 | 1 |
ex 3. type 그룹화하여 name 개수를 가져온 후, 그 중에 개수가 2개 이상인 데이터 조회 (조건 처리 후에 컬럼 그룹화 후에 조건 처리)
SELECT type, COUNT(name) AS cnt
FROM friend
GROUP BY type
HAVING cnt >= 2;
결과
type | cnt |
---|---|
1 | 2 |
2 | 2 |
3 | 2 |
ex 4. type 1 초과인, type 그룹화하여 name 개수를 가져온 후, 그 중에 개수가 2개 이상인 데이터 조회 (조건 처리 후에 컬럼 그룹화 후에 조건 처리)
SELECT type, COUNT(name) AS cnt
FROM friend
WHERE type > 1
GROUP BY type
HAVING cnt >= 2;
결과
type | cnt |
---|---|
2 | 2 |
3 | 2 |
ex 5. type 1 초과인, type 그룹화하여 name 갯수를 가져온 후, 그 중에 갯수가 2개 이상인 데이터를 type 내림차순 정렬로 조회 (내림차순 정렬)
SELECT type, COUNT(name) AS cnt
FROM hero_collection
WHERE type > 1
GROUP BY type
HAVING cnt >= 2
ORDER BY type DESC;
결과
type | cnt |
---|---|
3 | 2 |
2 | 2 |