:하나의 SQL 안에 또 다른 SQL문을 말함. 메인쿼리-서브쿼리 종속 관계
여러번의 연산을 한번에 수행 할 때, 조건문에 연산 결과를 사용해야 할 때, 조건에 query 결과를 사용하고 싶을 때 사용
select column1, column2
from table1
where column1 = (select col1 from table2)
select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
from (
select order_id, restaurant_name, food_preparation_time-25 over_time
from food_orders
) a
가장 가운데 가로 (안에 있는 가로), 특정 구문만 보고 싶으면 드래그 후 실행 누르기
: 서로 다른 테이블의 데이터를 가져와 엮기
LEFT JOIN
select 조회 할 컬럼
from 테이블1 a left join 테이블2 b on a.공통컬럼명=b.공통컬럼명
INNER JOIN
select 조회 할 컬럼
from 테이블1 a inner join 테이블2 b on a.공통컬럼명=b.공통컬럼명
우선 어떻게 할지 구성을 생각하기.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ... 우선 한 문장 문장은 잘 돌아간다. 이걸 어떻게 할 지 고민해보자.. 오늘은 너무 어려워서 거진 한 시간을 붙들고 있었고 씨름하던 중 힌트와 결과를 봐가면서 짰다.우선 너무 지저분하니 케이스 문끼리 엮어주었고,
age와 price는 각기 다른 테이블에 속해있으니까 join으로 엮어주었다.
하지만 restaurant_name
이 알 수 없는 column이라고 나온다. 그래서 과감히 날려버렸다.
우선 여기까지는 코드에 이상이 없는 것을 확인했다.
알 수 없는 컬럼이라고 뜨니까 어딘가에 선언해주면 될 거 같은데 어디인지 감을 못 잡겠다.
그리고 왜 age_group
price_group
는 정상으로 작동이 되는거지?
잠깐. age_group
와 price_group
는 정상 작동을 하는 이유는?
=>b에서 선언을 해줘서.
그럼 restaurant_name
도 b서브쿼리 안에 선언해보면?
정상 작동!
메인쿼리에선 서브쿼리의 결과만을 보는데 선언을 안 해주어 restaurant_name
은 인식도 못하던 것이었다.
select restaurant_name, case when price <=5000 then 'price_group1' when price >5000 and price <=10000 then 'price_group2' when price >10000 and price <=30000 then 'price_group3' when price >30000 then 'price_group4' end price_group, case when age <30 then 'age_group1' when age between 31 and 39 then 'age_group2' when age between 40 and 49 then 'age_group3' else 'age_group4' end age_group from ( select a.restaurant_name, avg(price) price, avg(age) age from food_orders a inner join customers b on a.customer_id=b.customer_id group by 1 ) t order by 1
글을 올리면서 발견했는데 내 정답은 restaurant_name
에 중복이 있다.
그룹으로 안 묶어준게 차이 인 거 같아 다시 묶어주고 정말 끝!
오늘은 나의 무능함을 깨닫는 하루였다...
내일은 5주차 수업 마무리하고, 부족한 부분 전체적으로 배속으로 듣자