일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 14942
- 해결
- 핵심
- 142085
- PCCP
- 조건에 부합하는 중고거래 상태 구하기
- SQL
- 퍼즐 조각 채우기
- 프로그래머스
- 싸피
- 소프티어
- softeer
- 24955
- 등산코스 정하기
- 오블완
- 165672
- 설명
- 정기 코딩 인증평가
- java
- 수료
- 후기
- MySQL
- 카카오
- 산 모양 타일링
- SSAFY
- 숫자 이어 붙이기
- 10기
- 배열 돌리기 5
- 티스토리챌린지
- 백준
- Today
- Total
개발 쥬스
[프로그래머스/sql] 59412 입양 시각 구하기(1) 본문
🔗 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/59412
🔍 해결 과정
WHERE 절을 활용하여 9시대부터 19시대까지의 데이터를 필터링을 한 다음 GROUP BY 절을 활용하여 시간대별 입양한 동물의 수를 출력하는 방식으로 문제를 해결했습니다.
✏️ 코드
-- 코드를 입력하세요
-- 몇 시에 입양이 가장 활발하게 일어났는지 알아보기
-- 9 ~ 19(59분)까지 시간대별로 입양이 몇 건 발생했는지 조회하기
-- 시간대 순으로 정렬하기
SELECT
HOUR(DATETIME) AS HOUR,
COUNT(ANIMAL_ID) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);
❗️추가 궁금 사항
📖 HAVING 절을 활용은 안될까?
WHERE 절을 활용하여 시간대를 9시부터 19시까지로 필터링을 하였지만, WHERE 절의 내용을 HAVING 절에 적용하면 어떤 결과가 나올지 궁금했습니다. 그래서 코드를 다음과 같이 작성해봤습니다.
SELECT
HOUR(DATETIME) AS HOUR,
COUNT(ANIMAL_ID) AS 'COUNT'
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR(DATETIME) BETWEEN 9 AND 19
ORDER BY HOUR(DATETIME);
위 코드를 실행한 결과 다음과 같은 에러가 발생했습니다.
SQL 실행 중 오류가 발생하였습니다.
Unknown column 'DATETIME' in 'having clause'
HAVING 절은 GROUP BY 이후의 집합 안에서 조건이 동작하는 것이기 때문에 원본 데이터에 대한 필터링을 하지 않습니다. 원본 데이터에 대한 필터링을 시도하려고 했기 때문에 위 에러가 발생한 것입니다.
다시 말해, 원본 데이터를 필터링할 때는 WHERE 절을 활용해야 하고, 그에 따른 집계 함수를 활용하여 그에 따른 값들을 필터링(예를 들어, 개수의 제한, 평균 제한 등등) 할 때는 GROUP BY 절을 활용해야 합니다.
📖 별칭을 활용하여 필터링을 한다면?
코드에서 WHERE 구문에 별칭이 적용된 이름을 활용한다면 어떤 결과가 나올지 궁금해서 다음과 같은 코드를 작성해보았습니다.
SELECT
HOUR(DATETIME) AS HOUR,
COUNT(ANIMAL_ID) AS 'COUNT'
FROM ANIMAL_OUTS
where HOUR BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);
위 코드를 실행하면 다음과 같은 에러가 발생하게 됩니다.
SQL 실행 중 오류가 발생하였습니다.
Unknown column 'HOUR' in 'where clause'
위 에러가 발생한 이유는 MySQL의 실행 순서에 따른 칼럼 인식 오류 때문인데 기본적으로 MySQL의 쿼리 문법 실행 순서는 다음과 같습니다.
1️⃣ FROM : 조회 테이블 확인
2️⃣ WHERE: 데이터 추출 조건 확인
3️⃣ GROUP BY: 칼럼 그룹화
4️⃣ HAVING: 그룹화 조건 확인
5️⃣ SELECT: 데이터 추출
6️⃣ ORDER BY: 데이터 정렬
WHERE 절보다 SELECT의 실행 순서가 후순위이기 때문에 별칭을 인식하지 못하기 때문에 조건을 활용할 때는 별칭을 쓰지 않도록 주의해야 합니다.
'알고리즘' 카테고리의 다른 글
[프로그래머스/Java] 12973 짝지어 제거하기 (0) | 2024.11.26 |
---|---|
[프로그래머스/Java] 68935 3진법 뒤집기 (0) | 2024.11.22 |
[프로그래머스/Java] 147355 크기가 작은 부분 문자열 (0) | 2024.11.21 |
[프로그래머스/sql] 59409 중성화 여부 파악하기 (0) | 2024.11.21 |
[프로그래머스/sql] 132202 진료과별 총 예약 횟수 출력하기 (2) | 2024.11.21 |