필요한 데이터가 다른 테이블에 있을 때 (JOIN)
LEFT JOIN : A의 테이블 전체 조회, B의 테이블 중 A의 교집합 조회/ 즉 A의 테이블과 B의 교집합만 조회됨. 값이 없더라도 가져옴.
INNER JOIN :A의 테이블과 B 테이블의 교집합만 조회 됨. 값이 없으면 가져오지 않음. 겹치는 데이터만 가져옴.
left join 예시)
select *
from food_orders = A 테이블에 해당.
left join payments = 가져올 B 테이블 지정.
on food_orders.order_id=payments.order_id = 두 테이블의 교집합
*inner join은 left join만 변경해주면 됨.
select f.order_id,
f.customer_id,
f.restaurant_name,
f.price,
c.name,
c.age,
c.gender = 불러올 때는 어떤 컬럼에 있는지 o.~ 명시해주기
from food_orders f left join customers c on f.customer_id=c.customer_id = 컬럼에 별명 붙여주면 편함.
join문 예시)
select f.order_id,
f.restaurant_name,
f.price,
p.pay_type,
p.vat =주문번호,식당 이름,가격,결제타입,수수료만 표시.
from food_orders f left join payments p on f.order_id=p.order_id = 주문내역과 결제의 공통값인 오더아이디 기준으로 조인.
where cuisine_type='Korean' = where절은 마찬가지로 from문 다음에 기재.
select f.cuisine_type,
f.price,
c.age
(c.age-50)*0.005 discount
from food_orders f left join customers c on f.customer_id=c.customer_id
where c.age>=50
테이블이 원하는 데이터를 갖고있지 않을 때
1. 없는 값 제외하기
1-1
select restaurant_name,
avg(rating) avg_rating, =셀 수 없는 문자는 0으로 간주.
avg(if(rating<>'Not given', rating, null)) avg_rating2 = 없는 값 제외해주는 구문. not given이 아닐 경우는 rating 그대로 취급. 맞을 경우는 null로 제외.
from food_orders
group by 1
1-2
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 = null인 애들은 모두 제외하는 구문. inner join과 동일
2. 다른 값을 대신 사용하기
select a.order_id,
a.customer_id,
a.restaurant_name,
a.price,
b.name,
b.age,
coalesce(b.age, 20) "null 제거", = null인 애들에게 20 값을 주는 구문.
b.gender
from food_orders a left join customers b on a.customer_id=b.customer_id
where b.age is null = b.age 값이 null인 애들만 불러오는 구문.
조회한 데이터가 상식적이지 않을 때
select name,
case when age<15 then 15
when age>=80 then 80
else age end re_age = 나이가 15세 미만일 경우 15세, 80세 이상일 경우 80세, 이외에는 나이 그대로 적용.
from customers