GROUP BY
SELECT 절과 함께 쓰이는 데이터를 원하는 그룹으로 나눌 때 사용합니다. DISTINCT "칼럼명"과 같이 결과를 하나로 묶어주는 역할을 합니다.
나눌 그룹의 칼럼명을 GROUP BY "칼럼명" 형식으로 사용하면 됩니다.
HAVING
GROUP BY에서 조건을 걸어주기 위한 절이며 WHERE 절과 다르게 집계함수와 함께 사용 가능합니다.
위의 쿼리문은 테이블에서 나이가 20 이상인 사람들의 수를 나이 별로 나타내게 됩니다.
문제
고양이와 개는 몇 마리 있을까
SELECT ANIMAL_TYPE, COUNT(*) AS count
FROM ANIMAL_INS
WHERE ANIMAL_TYPE IN('Cat', 'Dog')
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;
동명 동물 수 찾기
SELECT NAME, COUNT(*) AS COUNT
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME)>1
ORDER BY NAME;
입양 시각 구하기(1)
DATETIME 칼럼은 DATETIME 타입이며 시간을 추출하기 위해 DATE_FROMAT() 혹은 HOUR()을 사용합니다.
서브 쿼리로 DATETIME 임시 테이블을 만들고 이를 조건에 맞춰 9, 19 사이, 정렬해 출력합니다.
SELECT HOUR, COUNT(*) AS COUNT
FROM (
SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR
FROM ANIMAL_OUTS
)T
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR;
입양 시각 구하기(2)
변수를 이용해서 0부터 23까지 해당하는 시간대에서 입양된 동물의 수를 헤아려 출력합니다.
SET @T := -1;
SELECT @T:=@T+1 AS HOUR, (
SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE @T = HOUR(DATETIME)
)AS COUNT
FROM ANIMAL_OUTS
WHERE @T<23;
다른 풀이 방법으론 0~23까지 시간을 가지고 있는 임시 테이블을 만들고 이를 DATETIME 테이블과 조인하여 구하는 방법입니다. 이때 DATETIME에는 0~23까지 모든 수가 없을 수 있으므로 이를 방지하기 위해 임시 테이블을 기준으로 조인하는 LEFT JOIN을 사용하여 구합니다.
조인한 결과에는 해당 값이 없다면 NULL이 되므로 이를 0으로 채우기 위해 IFNULL 함수를 이용합니다.
SELECT T1.HOUR, IFNULL(T2.COUNT,0)
FROM (
SELECT 0 AS HOUR
UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8
UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12
UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16
UNION SELECT 17 UNION SELECT 18 UNION SELECT 19 UNION SELECT 20
UNION SELECT 21 UNION SELECT 22 UNION SELECT 23) T1
LEFT JOIN(
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR) AS T2 ON T1.HOUR = T2.HOUR
반응형
'스터디 > SQL' 카테고리의 다른 글
[SQL] String, Date 처리 (0) | 2021.03.03 |
---|---|
[SQL] Join (0) | 2021.03.02 |
[SQL] NULL 처리 (0) | 2021.02.28 |
[SQL] 집계 함수 (0) | 2021.02.26 |
[SQL] SELECT (0) | 2021.02.26 |