Subquery
join
Point to check
Subquery
연산이 한번에 끝나는 단순한 형태의 쿼리도 있지만, 문자 변경, 숫자 연산, 그 결과로 또 연산을 해야할 때도 있다. 그럴때는 하나의 쿼리문보다는 서브쿼리를 이용하는 것이 효율적이다. 서브쿼리가 자주 사용되는 상황은 다음과 같다.
여러번의 연산을 수행해야 할 때
조건문에 연산 결과를 사용해야 할 때
조건에 Query 결과를 사용하고 싶을 때
기본구조
서브쿼리는 말 그대로 쿼리에 sub로 들어가는 구문이다.
select column1, special_column
# 서브쿼리에서 설정한 별명을 다시 사용할 수 있다.
from
(
select column1, column2 special_column
from table1
) a
/* a라는 subquery를 설정한 후 쿼리문안에서 사용하였다. */
다른 테이블에서 일부의 칼럼을 가져와 사용할 수 있다.
select column1, column2
from table1
where column1 = (select col1 from table2)
# 서브쿼리(table2 의 col1)을 가져온 후
# table 1 과 같을 때(조건)
# column1, column2를 가져온다.
[실습]
select restaurant_name,
case when sum_of_quantity<=5 then 0.1
when sum_of_quantity>15 and sum_of_price>=300000 then 0.005
else 0.01 end ratio_of_add
# 각각의 값들을 기준으로 수수료를 설정하는 조건문 완성
from
(
select restaurant_name,
sum(quantity) sum_of_quantity,
sum(price) sum_of_price
from food_orders
group by 1
) a
# food_orders에서 restaurant_name별로 quantity,price의 합계를 가져오는 서브쿼리 설정
[결과]

join
필요한 데이터들이 각기 다른 테이블에 있을 때, 테이블을 합칠 수 있다. left join과 inner join의 차이점은 사진으로 확인할 수 있다.

left join
공통 컬럼 (키값) 을 기준으로, 하나의 테이블에 값이 없 더라도 모두 조회할 수 있다.
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
[실습]
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
[결과]

inner join
공통 컬럼 (키값) 을 기준으로, 두 테이블 모두에 있는 값만 조회한다.
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
[실습]
select cuisine_type,
sum(price) "원래 가격",
sum(price)-sum(discount_price) "할인 적용 가격",
sum(discount_price) "할인 가격"
from
(
select a.cuisine_type,
price,
price*((b.age-50)*0.005) discount_price
from food_orders a inner join customers b on a.customer_id=b.customer_id
where b.age>=50
)t
# 서브쿼리에서 나이가 50세 이상일 때, 가격과, 할인 가격을 설정한다
# 이후 본 쿼리에서 원래 가격, 할인 적용가격, 할인 가격을 가져온다.
group by 1 #cuisine_type별로 그룹화
order by 4 desc
[결과]

Point to check
서브 쿼리문에서 만약 별명을 한글로 작성한다면 그 값들을 외부에서 사용하려고 하면 어떻게 해야하는가?
-> 만약 특수문자가 포함되어 큰 따옴표로 묶었다면 큰 따옴표까지 적어서 사용하면 되고 만약 한글과 언더바로만 이루어져있다면 그냥 영문 별명과 동일하게 사용해도 된다.
join을 사용할 때, 값이 완전히 같다면 컬럼명이 달라도 된다.