TIL/SQL

TIL (7/12) <group by, having, 서브쿼리를 사용하는 이유>

jojoon2786 2024. 7. 12. 16:41

 

select food_type, rest_id, rest_name, max(favorites) as favorites
from rest_info
group by food_type

이렇게 하면 안되는 이유는 ?

food_type으로 그룹화를 해주었으나 rest_id, rest_name은 개별 데이터이기 때문이다.

max는 그룹에 대한 통계 데이터이기 때문에 사용가능.

 

튜터님이 오류 발생 예시로 학생정보 조회 테이블에서 성별로 그룹화했을 때, 컬럼에 이름을 추가하면 어떤 이름이 뜰 것 같냐고 물어보셨다. 오류를 이 예시로 이해하면 좋을 듯 하다.

 

select food_type, rest_id, rest_name, favorites
from rest_info
where (food_type, favorites) in (select food_type, max(favorites)
from rest_info
group by food_type)
order by food_type desc

 

서브쿼리를 이용해 해결하였는데. where절에 서브쿼리를 써보는 것은 처음이었다.

서브쿼리의 DB를 기반으로 특정 조건을 더 부여하고 싶을 때, from절에 사용하고 where절에 조건을 부여한다.

조건을 더 가져오고 싶지 않을때는 where 절에 서브쿼리를 사용하여 in으로 "이 조건에 해당하는" < 이렇게 쓰인다.

 

집계함수는 where절에 넣을 수 없다. 하지만, 뒤에 서브쿼리로 where절안에 넣으면 해당 값을 추출할 수는 있다.


위에 푼 거랑 비슷한 매커니즘의 문제

 

select category, price as max_price, product_name
from food_product
where (category, price) in (select category, max(price)
from food_product
where category in ('과자','국','김치','식용유')
group by category)
order by max_price desc

 

category에 or를 사용했을 때는 category = '과자' or category = '국' 이런식으로 모든 조건에 컬럼을 명시해줘야 함.

키워드로만 빠르게 조회하고 싶을 땐 IN을 사용하자.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

집계함수 > 그룹내의 통계

where > 개별 횡단위의 통계

having은 그룹에 조건을 걸 때 사용한다. 그룹화로 묶이지 않은 개별데이터에 조건을 부여할 수 없다.