카테고리 없음

[TIL10] SQL GROUP BY HAVING

LHJ_ 2024. 11. 28. 21:39

코드카타 오답노트

SELECT animal_id, name, date_format(datetime, '%Y-%m-%d') #date_format의 %뒤에 오는 값은 대소문자를 비교함
FROM animal_ins
%Y = yyyy / %y=__yy
%M = 숫자가 아닌 달이름(1월, 2월) / %m = mm
%D = 숫자가 아닌 첫째, 둘째와 같이 출력(1st, 2nd) / %d = dd
SELECT product_id, product_name, product_cd, category,price
FROM food_product
WHERE price=(SELECT max(price) FROM food_product)   
#f테이블에서 가장 높은 price 컬럼을 선택하고, WHERE절로 price는 가장 높은 값만 필터
SELECT COUNT(*)
FROM user_info
WHERE (joined >= '2021-01-01' and joined<'2022-01-01') and (age between 20 and 29)

더 효율적임
SELECT COUNT(*)
FROM user_info
where joined Like '2021%'
SELECT animal_id, name,
case when (SEX_UPON_INTAKE LIKE 'Neutered%' or sex_upon_intake LIKE 'spayed%') then 'O'
else 'X' end `중성화` # =말고 LIKE 쓰기
FROM animal_ins

 

GROUP BY HAVING 정리

SELECT *
FROM books;
 
books 테이블에서 전체 컬럼을 조회.

 

SELECT *
FROM books
GROUP BY genre;
 
books 테이블에서 전체 컬럼을 조회.
genre 컬럼을 중심으로 group.

(사진에서 total이 아니라 qty)

 

SELECT genre, SUM(qty) as total
FROM books
GROUP BY genre;

books 테이블에서 genre로 컬럼을 묶어 준 다음(위의 테이블 처럼)
각 그룹간의 qty을 더한 후 genre 값과 total값 출력

 

만약 여기서 HAVING을 추가하게 된다면

SELECT genre, SUM(qty) total
FROM books
GROUP BY genre
HAVING SUM(qty) >=7;

각 그룹별에서 합산된 total 값을 살펴보고 HAVING의 조건인 7, 8의 값을 갖는 fantasy와 adventure을 출력

 

 

그 외의 HAVING 조건을 걸었을 때의 결과값

 

3

SELECT genre, count(*) as total
FROM books
GROUP BY genre
HAVING count(*) >=2;

각 그룹마다 2 이상이기 때문에 모든 그룹이 출력
만약 HAVING count(*) >2이었다면 빈컬럼 출력(Null X)

 

SELECT genre, SUM(qty)
FROM books
WHERE qty > 1
GROUP BY genre
HAVING SUM(qty) >=5;

FROM : books 테이블에서 
WHERE : qty가 1보다 큰 수를 먼저 찾음(romance에 있는 1값은 탈락)
GROUP BY : genre로 값이 묶음
HAVING : 각 genre의 qty의 합을 구하고
( adventure = 7, fantasy = 8, romance = 2)

/ 그 구한 값이 5 이상이면 선택 ( adventure = 7, fantasy = 8 )
SELECT : genre과 having에서 필터링된 값만 출력

 

WHERE와 HAVING 차이점

WHERE 
그룹화 이전에 데이터를 필터링
행 마다 WHERE의 조건을 필터

HAVING
그룹화 이후에 데이터를 필터링 
그룹화 된!! 행끼리의 값을 SUM, AVG 한 뒤 그 값을 필터링

FROM - ON - JOIN - WHERE - GROUP BY - HAVING - SELECT - ORDER BY - LIMIT


*GROUP BY의 결과값 = DISTINCT의 결과값*

 

ORDER BY RAND()
RAND()는 행의 랜던한 값을 생성 (매 실행할 때마다 랜덤으로 바뀜)
LIMIT 마지막 행에 사용하여 상위 값만 추출