본문 바로가기
DATABASE/MySql 실습

[sql] group by 에서 where 사용법 having , case if문,ifnull 작성법

by 코끼리똥11 2024. 5. 14.

WHERE

WHERE 절은 SQL 쿼리에서 데이터를 그룹화하거나 집계하기 전에 개별 행에 대해 조건을 필터링하는 데 사용된다. 예를 들어, 특정 조건을 만족하는 행만 선택하고자 할 때 사용된다. WHERE 절은 집계 함수와 함께 사용할 수 없다.

HAVING

HAVING 절은 데이터를 그룹화하거나 집계한 후에 결과를 필터링하는 데 사용된다. 즉, GROUP BY 절로 그룹화된 각 그룹에 대해 조건을 적용할 수 있다. HAVING 절은 집계 함수와 함께 사용할 수 있어, 그룹화된 데이터의 집계 결과에 대해 조건을 지정할 때 유용하다.

 

 

group by로 생성된 컬럼은 where 을 사용할 수 없다. where와 비슷한 having을 사용해야한다.

 

select released_year,avg(stock_quantity) as avg_stock
from books
group by released_year
where avg_stock > 70;

group by 에서 where을 사용시

이런 오류가 난다.

select released_year,avg(stock_quantity) as avg_stock
from books
group by released_year
HAVING avg_stock > 70;

group by 다음 having을 사용하면 

정상적으로 출력 할 수 있다. where 을 사용할려면 group by 를 쓰기 전에 써야하며 group by에서 만든 컬럼을 지정하는게 아니라 기존에있던 컬럼을 지정해줘야한다.

 

select released_year,avg(stock_quantity) as avg_stock
from books
where released_year > 2000
group by released_year
HAVING avg_stock > 70;

group by 전에 where 을 사용하여 released_year 가 2000 이상인 데이터만 출력할 수 있다.

 

 

CASE

CASE 문은 조건에 따라 다른 값을 반환할 수 있는 구문이다. 이는 프로그래밍 언어에서의 if-else 문과 유사하게 작동한다. CASE 문을 사용하여 쿼리 결과를 동적으로 생성하거나 조건부 논리를 적용할 수 있다.

select *,
		CASE
           WHEN released_year >=2000 THEN '최신책'
           else '예전책'
       END AS TYPE
FROM books;

  • WHEN released_year >= 2000 THEN '최신책': 출판 연도가 2000년 이상인 경우 '최신책'을 반환한다.
  • ELSE '예전책': 그렇지 않은 경우 '예전책'을 반환한다.
  • END AS type: CASE 문에서 반환된 값을 type이라는 별칭으로 열에 추가한다.

if

기존 컬럼의 데이터를 가지고, 2가지의 조건으로만 확인하는 경우는 if() 함수 를 사용해도 된다.

즉, 2가지로 파악할 때는 if 함수가 훨씬 편하다.

select *,
		if(pages > 300 , '긴책','짧은책')
from books;

 

ifnull

ifnull은 데이터가 null 이면, 다른 값으로 채우는 방법이다.

값이 null 인 데이터가 있을떄

select *,
		ifnull(stock_quantity,0)
from books;

ifnull 함수에 컬럼명, 채워줄 숫자를 입력하면

stock_quantity 컬럼에서 null이 모두 0 으로 바뀐 컬럼이 생긴다.