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은 그룹에 조건을 걸 때 사용한다. 그룹화로 묶이지 않은 개별데이터에 조건을 부여할 수 없다.
'TIL > SQL' 카테고리의 다른 글
TIL (7/16) <join> (0) | 2024.07.16 |
---|---|
TIL (7/15) <두 개의 컬럼으로 그룹화하기, 조건에 맞는 사용자 조회하기> (0) | 2024.07.15 |
TIL (7/11) <Round(), div> (0) | 2024.07.11 |
TIL #3 < join(SQL), NULL처리, Pivot table, Window function> (0) | 2024.06.28 |
TIL #2 <문자 포맷 가공, case, subquery> (0) | 2024.06.27 |