TIL DAY 21 || [Programmers SQL Problems] SQL GROUP BY

TK·2021년 3월 13일
0

TIL

목록 보기
30/55
post-thumbnail

출처: 프로그래머스 고득점 SQL kit 입양시각구하기(1)
https://programmers.co.kr/learn/courses/30/lessons/59412?language=mysql

2.입양시각구하기(1) BY USING WHERE CLAUSE

-- 코드를 입력하세요
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE 9 <= HOUR(DATETIME) AND HOUR(DATETIME) < 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME) ASC;
  • SELECT 로 가져올 열을 선택하는데 먼저 HOUR 함수를 사용해서 DATETIME 을 HOUR 로 바꾼다
  • ALIAS 로 HOUR(DATETIME) 을 'HOUR' 으로 설정해준다.
  • WHERE 절로 HOUR(DATETIME) 을 9시이상부터 20시 미만 으로 범위설정을 해준다.

실수한 점 : 이 때 9 <= HOUR(DATETIME) < 20 으로 했더니 원하는 결과가 나오지 않았다. 범위마다 각각 따로 처리해야 한다.

  • GROUP BY 절으로 HOUR(DATETIME) 을 기준으로 그룹을 나눈다.

주의할 점: 내부 처리 순서는
WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 순서이기 때문에 SELECT 에서 'HOUR' 라고 ALIAS 를 붙여도 GROUP BY 절에서 사용할 수 없다.
하지만 MySQL 같이 융통성있게 별명을 사용할 수 있게 지원해주는 DB 도 있다. Oracle 에서는 저러면 에러가 난다.

  • MySQL DB 외에도 모든 DB 에서 작동할 수 있는 쿼리를 짜려고 했기 때문에 GROUP BY 에서 'HOUR' alias 를 일부러 쓰지 않았다.

  • 마지막으로 ORDER BY 로 HOUR(DATETIME) 컬럼을 오름차순으로 정렬했다.

2. 입양시각구하기(1) BY USING HAVING CLAUSE

SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR ASC;
  • 첫 번째 풀이와 마찬가지로 HOUR(DATETIME), COUNT 컬럼을 선택하고
  • GROUP BY 로 SELECT 에서 지정해준 alias 'HOUR' 를 사용하여 그룹을 지정했다. 아까도 언급했듯 MySQL 에서는 GROUP BY 에 별명(alias)사용이 가능하다.
  • WHERE 대신 HAVING 구문을 사용하여 HOUR 의 범위를 나누었다. BETWEEN 을 쓰면 두개의 범위 사이에 있다는 의미로 AND 를 사용할 필요 없이 더욱 간편하게 사용할 수 있다.

실수한 점: HAVING 구문 안에 HOUR(DATETIME) 을 넣었더니 다음과 같은 오류가 발생했다. Unknown column 'DATETIME' in 'having clause'

SQL 에서는 기본적으로 GROUP BY 절에 사용 된 컬럼이나 HAVING 구문 뒤에는 집계함수(Aggregate function)가 사용된 컬럼만이 올 수 있다. HOUR 은 산술함수(Arithmetic function)가 사용된 컬럼이라서 오류가 난 것이다.

  • 마지막으로 ORDER BY 로 정렬했다.

!! Key Points of GROUP BY Clause !!

  • GROUP BY 의 HAVING 조건절에서는 집계함수를 사용할 수 있지만, WHERE 구에서는 집계함수를 사용할 수 없다.

  • 왜냐면 HAVING 조건절은 같은 그룹 내 여러개의 rows 를 대상으로 '집계' 를 할 수 있지만, WHERE 에는 그룹 자체가 없기 때문에 여러개의 rows 를 집계할 수 없다.

  • GROUP BY 에서 지정한 열 이외의 열은 집계함수를 사용하지 않은 채 SELECT 구에 지정할 수 없다.

profile
Backend Developer

0개의 댓글