SQL

join

content0474 2024. 8. 31. 17:48

필요한 데이터가 서로 다른 테이블에 있을 때 공통컬럼을 바탕으로 두 테이블을 합하고, 거기서 필요한 정보를 가져오거나 연산할 수 있음

 

join문의 기본

 

select a.컬럼1, b.컬럼2

from table1 a left/inner join table2 b on a.공통컬럼=b.공통컬럼

 

table1 a, table2 b에서 a와 b는 두 테이블의 별명

left join: 하나의 테이블에만 있는 값이라도 모두 조회

inner join: 두 테이블에서 공통된 값만 조회

 

예시

select fo.price, c.age

from food_orders fo left join customers c on fo.customer_id=c.customer_id

:food_orders와 customers 테이블을 합치고 그 중 price와 age 정보를 가져와

 

join하고 연산, subquery로 사용하는것도 물론 가능하다

 

join문을 활용한 연산

SELECT fo.price*p.vat final_price

FROM payments p inner join food_orders fo on p.order_id =fo.order_id

:food_orders 테이블의 price와 payments 테이블의 vat를 곱해줘

tip

SELECT fo.price*p.vat final_price

FROM payments p inner join food_orders fo on p.order_id =fo.order_id

ORDER BY 1

: food_orders 테이블의 price와 payments 테이블의 vat를 곱해서 식당 이름 순으로 정렬해줘

 

이 때 중복값을 제거하고 싶다면? select 바로 뒤에 distinct를 붙이면 된다.

SELECT DISTINCT fo.price*p.vat final_price

FROM payments p inner join food_orders fo on p.order_id =fo.order_id

ORDER BY 1

 

join문과 subquery

SELECT fo.cuisine_type , fo.price , c.age, (c.age-50)*0.005 discount_rate

FROM food_orders fo left join customers c on fo.customer_id =c.customer_id

where c.age>=50

: 할인율=(나이-50)0.005라고 할 때 음식종류, 가격, 나이, 할인율 정보를 가져와 그리고 나이가 50세 이상인 경우만 보여줘

 

위에서 구한 할인율로 할인된 가격을 구하고,  음식종류, 음식가격의 합, 할인된 가격의 합을 보여줘 이 때 음식종류별로 보여주고 할인가의 합이 큰 순서로 보여줘 

SELECT a.cuisine_type, SUM(price)price, SUM(price*discount_rate) discounted_price

FROM

(

SELECT fo.cuisine_type , fo.price , c.age, (c.age-50)*0.005 discount_rate

FROM food_orders fo left join customers c on fo.customer_id =c.customer_id

where c.age>=50

) a

group by 1

order by 3 desc

subquery문을 a라고 별명지었기 때문에, cuisine_type은 이제 fo.cuisine_type이 아닌 a.cuisine_type이고 a를 생략해도 무방하다.

원래 순서에 맞게 group by, order by는 select, from, where 다음에 적어주면 된다.

'SQL' 카테고리의 다른 글

pivot 테이블 만들기  (1) 2024.09.02
null, coalesce  (1) 2024.09.01
subquery  (0) 2024.08.30
if, case  (0) 2024.08.29
replace, substring, concat  (1) 2024.08.28