내일배움캠프/SQL

[SQL]데이터에서 예상하지 못한 값이 나왔을 때 (이상한 값, 값이 없음 등)

dydatablog 2024. 11. 18. 16:47
728x90

1) 데이터가 없을 때의 연산 결과 변화 케이스

[방법1] 없는 값을 제외해주기

  • 없는 값을 0으로 계산하거나, 없는 데이터로 간주하기
SELECT restaurant_name,
	AVG(rating) avg_rating,
	AVG(IF(rating<>'Not given', rating, NULL)) -- <>는'아니다', NULL'없는 값으로 간주'
FROM food_orders
GROUP BY 1
/* 그냥 AVG(rating)로 계산했을 때는Not given값을 0으로 계산하는 반면, NULL로 지정했을 경우 제외시킴.
  • 데이터를 불러올 때 애초에 null값은 불러오지 않기
select a.order_id,
       a.customer_id,
       a.restaurant_name,
       a.price,
       b.name,
       b.age,
       b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
where b.customer_id is not null -- customer_id가 아니라 이름과 나이가 null값인데 왜 id로 지정하지?

 

[방법2] 다른 값을 대신 사용하기

  • 없는 값을 다른 값으로 대체하는 구문을 사용

coalesce(컬럼의 이름, 대체할 값)

select a.order_id,
       a.customer_id,
       a.restaurant_name,
       a.price,
       b.name,
       b.age,
       coalesce(b.age, 20) "null 제거",-- b.age에 값이 없을 때 20으로 대체
       b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
where b.age is null

 

  • 상식적이지 않은 데이터를 다른 값으로 바꾸기

주문 고객의 나이가 15세 이하인 경우 모두 15세로 표시, 80세 이상인 경우 80세로 표시

select name,
	   age,
	   CASE WHEN age < 15 THEN 15
	   	    WHEN age >= 80 THEN 80
	   	    ELSE age END re_age
FROM customers

 

728x90