조회한 데이터에 아무 값이 없을 때:
사용할 수 없는 데이터가 들어있거나, 데이터가 누락된 경우 Not given이라고 표시된다.
데이터가 없거나, 해당 데이터 항목이 특정 레코드에 적용되지 않는 경우 [NULL]이라고 표시된다.
데이터가 없을 때 예시

2번째 5 Napkin Burger 와 4번째 Alidoro의 rating 컬럼에 데이터 값이 없다.
select restaurant_name,
rating,
avg(rating) avg_rating1,
avg(if(rating = 'Not given', null, rating)) avg_rating2
from food_orders
group by restaurant_name
;
avg_rating1
: mysql에서는, 사용할 수 없는 값일 때 해당 값을 0으로 간주하고 계산한다.
→ 4, 0, 5, 0, 4, 4 다 더하고 6으로 나누는 것.
avg_rating2
:
if문: rating의 값이 Not given 이라면 null값 반환, not given이 아닌 값이라면 rating값 그대로 반환.
사용할 수 없는 값인 not given 을 null값으로 바꾼다.
→ 4, 5, 4, 4 더하고 4로 나누는 것.
상황에 따라 데이터값 전체에서 연산할지, 사용할 수 없는 값을 빼고 연산할지 선택하고 활용하면 됨!
select restaurant_name,
avg(rating) avg_rating
from food_orders
where rating <> 'Not given'
group by 1
order by restaurant_name
;
where 문에서 not given 값을 포함하지 않는 데이터로만 연산하도록 했다.

rating 값이 아예 없는 Alidoro는 제외하고 출력됐다.
select restaurant_name,
avg(rating) avg_rating
from (
select restaurant_name,
case
when rating = 'Not given' then null
else cast(rating as decimal) end rating
from food_orders
) food_orders
group by restaurant_name
having avg(rating) is not null
order by restaurant_name;
case 문을 통해 not given값을 null로 변환하고, having 절에서 null 값을 제외한다.
cast(rating as decimal)
마찬가지로 rating 값이 아예 없는 Alidoro는 제외하고 출력됐다.
평균값 혹은 중앙값 등 대표값을 이용해 대체하기도 한다.
select restaurant_name,
avg(if(rating>=1, rating, 3)) avg_rating
from food_orders
group by 1
order by restaurant_name
;
같은 데이터를 이용하여 대체값을 3으로 계산하여 출력했다.

select b.name,
b.age,
coalesce(b.age,20),
b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
order by case
when age is null then 0 else 1 end, age
-- age컬럼에서 null인 값 먼저 불러오는 case when 구문
;
coalesce 함수를 이용해 age의 null값을 20으로 대체해 출력해보았다.

기존에 null값이었던 age 컬럼이 모두 20이라는 숫자로 대체되었다.