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