오늘 배운 것
SQL 문법 중 서브 쿼리와 JOIN에 대해 배웠다. 서브 쿼리와 JOIN은 처음에 어려웠는데 보다 보니 조금 적응이 됐다.
서브쿼리
서브 쿼리는 말 그대로 쿼리 안에 있는 쿼리이다. 서브쿼리는 복잡한 계산식/조건식을 편하게 해 준다.
(A + B) * 2를 보자. 먼저, A+B를 계산하고 그 값에 * 2를 해주는 식이다. 서브쿼리도 마찬가지이다. 쿼리 안에 서브쿼리를 먼저 계산하고 그 위에 있는 상위 쿼리에서 계산한 값을 사용해서 연산을 하거나 조건식을 걸어주거나 한다.
서브 쿼리를 사용하는 방식은 아래와 같다.
select column1, special_culumn
from ( /* 서브 쿼리 */
select column1, column2 special_column
from table1
) a
select column1, column2
from table1
where column1 = (select col1 from table2)
주의할 점이라기 보단 만져보다가 알아낸 것은 서브쿼리에 없는 별칭이나 컬럼은 상위쿼리에서 사용할 수 없다!
select column1, special_culumn, column3 !!< 사용불가 >
from (
select column1, column2 special_column
from table1
) a
예를 들어보자.
음식 타입별 총 주문수량과 음식점 수를 연산하고, 주문 수량과 음식점수 별 수수료율을 산정해보자.
산정 기준은 다음과 같다.
- 음식점수 5개 이상, 주문수 30개 이상 -> 수수료 0.05%
- 음식점수 5개 이상, 주문수 30개 미만 -> 수수료 0.08%
- 음식점수 5개 미만, 주문수 30개 이상 -> 수수료 1%
- 음식점수 5개 미만, 주문수 30개 미만 -> 수수료 2%
생각을 해보면 음식 타입별 총 주문수량과 음식점 수를 연산하는 쿼리를 작성하고 그 상위 쿼리에서 수수료율을 산정하면될 것 같다.
음식 타입별이니 GROUP BY를 사용해서 묶어주면 되고 음식점 수를 구하는 count함수에서 음식점 중복 제거를 위해 distinct를 해주면 될 것 같다.
먼저 서브 쿼리 구현을 했다.
select cuisine_type , sum(quantity) total_quantity, count(DISTINCT restaurant_name) as total_restaurant_count
from food_orders fo
group by 1
잘 나온다. 이제 이 결과를 가지고 상위쿼리에서 수수료율을 산정해 보자!
select cuisine_type, total_quantity, total_restaurant_count, case when (total_quantity >= 30 and total_restaurant_count >= 5) then 0.0005
when (total_quantity < 30 and total_restaurant_count >= 5) then 0.0008
when (total_quantity >= 30 and total_restaurant_count < 5) then 0.01
when (total_quantity < 30 and total_restaurant_count < 5) then 0.02
END "수수료"
from (select cuisine_type , sum(quantity) total_quantity, count(DISTINCT restaurant_name) as total_restaurant_count
from food_orders fo
group by 1
) a
지금까지 한 건 from절에 쓰는 서브쿼리였는데, 찾아보니 select에서도 쓰고 where절에서도 쓰인다고 봤다. 그건 차차 공부해야겠다.
JOIN
강의를 듣기 전에도 JOIN과 서브쿼리만 보면 머리가 아팠었는데.. 같이 배우게 될 줄이야 조인은 엑셀의 VLookup테이블과 비슷하다고 한다(사실 나는 엑셀을 안 써봐서 모른다). 아래 그림으로 설명해 주셨는데 어느 정도 이해가 됐다.
LEFT JOIN, INNER JOIN 이외에도 여러 가지가 있는 걸로 안다. 지금은 여기까지만 공부하자.
LEFT JOIN은 공통 키값을 기준으로 하나의 테이블에 값이 없더라도 모두 조회되는 경우이다.
INNER JOIN은 공통 키값을 기준으로, 두 테이블 모두에 있는 값만 조회한다.
JOIN의 기본 구조는 다음과 같다.
-- LEFT JOIN
SELECT 조회 할 컬럼
FROM 테이블1 A LEFT JOIN TABLE 2 ON A.공통컬럼명 = B.공통컬럼명
--INNER JOIN
SELECT 조회 할 컬럼
FROM 테이블1 A INNER JOIN TABLE 2 ON A.공통컬럼명 = B.공통컬럼명
실습을 해보자.
한국 음식의 주문별 결제 수단과 수수료율을 조회해 보자
조건은 다음과 같다.
(조회 컬럼 : 주문 번호, 식당 이름, 주문 가격, 결제 수단, 수수료율)
*결제 정보가 없는 경우도 포함하여 조회
먼저 food_orders와 payments테이블을 left join 시켜줬다.
SELECT *
FROM food_orders a left join payments b on a.order_id = b.order_id
자 그다음 조건에 한국음식을 걸어주고 a 테이블의 주문 번호, 식당 이름, 주문 가격과 b테이블의 결제수단, 수수료율을 셀렉트하자.
SELECT a.order_id , a.restaurant_name , a.price , b.pay_type , b.vat
FROM food_orders a left join payments b on a.order_id = b.order_id
where a.cuisine_type = 'Korean'
트러블 슈팅
4주 차 과제를 하고 있는데 자꾸 sql 문법 에러가 났다.
찾아보니 서브쿼리에 별칭이 없어서 생긴 문제였다.. OTL
select column1
from(
select column1
from table1
) a <--- 이놈을 안적어줘서 문제였다..
다음부터는 주의해 가며 사용해야겠다.
'부트캠프 > DB' 카테고리의 다른 글
부트캠프 SQL 강의 6일차 (0) | 2024.07.05 |
---|---|
부트캠프 SQL 강의 4일차 (0) | 2024.07.03 |
부트캠프 SQL 강의 3일차 (0) | 2024.07.01 |
부트캠프 SQL 강의 2일차 (0) | 2024.06.28 |
부트캠프 SQL 강의 1일차 (0) | 2024.06.26 |