[SQL] GROUP BY

Jeanine·2022년 4월 26일
0

sql

목록 보기
3/6
post-thumbnail
  • 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문 (고양이를 개보다 먼저 조회)
SELECT ANIMAL_TYPE, COUNT(ANIMAL_ID)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
--WHERE 절로 대체 가능
HAVING ANIMAL_TYPE = "Cat" OR ANIMAL_TYPE = "Dog"
ORDER BY ANIMAL_TYPE;

HAVING 절
: 집계함수를 가지고 조건 비교를 할 때 사용 (cf. WHERE 절에서는 집계함수 사용 불가)

  • 보통 GROUP BY절과 함께 사용

  • 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문 (이름이 없는 동물은 집계에서 제외, 결과는 이름 순)
SELECT NAME, COUNT(NAME) AS cnt
FROM ANIMAL_INS
GROUP BY NAME
HAVING cnt >= 2
ORDER BY NAME;

AS 절
: 필드 명이나 테이블의 이름을 다시 지을 때 사용


  • 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문 (결과는 시간대 순)
SELECT HOUR(DATETIME), COUNT(ANIMAL_ID)
FROM ANIMAL_OUTS
WHERE 9 <= HOUR(DATETIME) AND HOUR(DATETIME) <= 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);

날짜 데이터에서 일부만 추출하기
YEAR: 연도 추출
MONTH: 월 추출
DAY: 일 추출 (또는 DAYOFMONTH)
HOUR: 시 추출
MINUTE: 분 추출
SECOND: 초 추출


  • 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문 (결과는 시간대 순)
WITH RECURSIVE TEMP AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR + 1 FROM TEMP WHERE HOUR < 23
)

SELECT TEMP.HOUR, COUNT(HOUR(ANIMAL_OUTS.DATETIME)) AS COUNT
FROM TEMP LEFT JOIN ANIMAL_OUTS
ON TEMP.HOUR = HOUR(ANIMAL_OUTS.DATETIME)
GROUP BY TEMP.HOUR
ORDER BY TEMP.HOUR;

WITH RECURSIVE 문
: 메모리 상에 가상의 테이블 저장

WITH RECURSIVE 테이블명 AS(
	SELECT 초기값 AS 컬럼 별칭
    UNION ALL
    SELECT 컬럼 별칭 계산식 FROM 테이블명 WHERE 제어문
)
  • UNION ALL: 중복제거 안하는 합집합
  • UNION: 중복제거를 하는 합집합

📍 JOIN은 다른 포스팅에서 정리

profile
Grow up everyday

0개의 댓글