1. 서브쿼리(Sub Query)
- 서브쿼리는 다른 SQL문 안에 중첩된 SELECT문
국가가 ‘Brasil’인 유저의 주문정보(orders)를 조회 하는 쿼리
- orders를 조회하는 select문의 where절 안에서 user의 국가가 ‘Brasil’인 id를 조회하는 쿼리를 하위로 넣어서 실행
select *
from `thelook_ecommerce.orders`
where user_id in (
select id
from `thelook_ecommerce.users`
where country = 'Brasil'
)
FROM절에서 사용되는 서브쿼리
select id,
a.first_name,
a.last_name,
b.order_count as order_count
from `thelook_ecommerce.users`as a
left join(
select user_id, count(order_id) as order_count
from `thelook_ecommerce.orders`
group by user_id
) as b on a.id = b.user_id
order by a.id
limit 10 ;
유저 id와 이름, 주문수 조회
users 테이블의 정보와 user별 주문수 조회하는 서브쿼리를 left join을 이용하여 연결 -> 유저의 주문수를 조회
(join 전에 먼저 조건을 주고 그 다음에 조인을 할 때 서브쿼리 사용하는 것 같음 -> join 연습문제 봄면 join에 별다른 조건 걸어주지 못함)
WHERE절에 사용되는 서브쿼리
select id, first_name, last_name
from `thelook_ecommerce.users`
where id in (
select user_id
from `thelook_ecommerce.orders`
group by user_id
having count(order_id) >= 3
)
SELECT절에 사용되는 서브쿼리
select id,
first_name,
last_name,
(select count(order_id) from `thelook_ecommerce.orders` where user_id = a.id) as order_count
from `thelook_ecommerce.users` a
order by a.id
limit 10;
2. WITH (Common Table Expressions)
- with 절은 쿼리 내에서 임시 결과를 정의하고 사용
- 주요 사용 목적은 복잡한 추출 과정을 분할하여 단계적으로 처리하면서 전체 데이터 추출 과정을 단순화
WITH`CTE명` AS (쿼리 표현식)
with user_data as (select id from `thelook_ecommerce.users`)
select *
from user_data
1) user_data CTE정의 : users의 id값을 조회하는 서브쿼리
2) user_data로 부터 데이터 조회
유저 아이디별 주문수 조회
with user_order_counts as (
select user_id, count(order_id) as order_count
from `thelook_ecommerce.orders`
group by user_id
)
select * from user_order_counts
order by order_count DESC
유저별 이름과 주문수, 이벤트수 정보 조회
WITH user_order_counts AS (
select user_id, count(order_id) as order_count
from `thelook_ecommerce.orders`
group by user_id
), user_event_counts AS (
select user_id, count(id) as event_count
from `thelook_ecommerce.events`
group by user_id
)
select
a.id,
a.first_name,
a.last_name,
b.order_count,
c.event_count
from `thelook_ecommerce.users` a
left join user_order_counts b on a.id = b.user_id
left join user_event_counts c on a.id = c.user_id
order by b.order_count DESC, c.event_count DESC
- user_order_counts 라는 유사 테이블을 정의합니다. 내용은 주문테이블로 부터 유저아이디와 유저의 주문수를 조회합니다.
- user_event_counts 라는 유사 테이블을 정의합니다. 내용은 이벤트테이블로 부터 유저아이디와 유저의 이벤트수를 조회합니다.
- users 테이블, user_order_counts 유사 테이블, user_event_counts 유사 테이블을 이용하여 유저의 이름, 주문수, 이벤트수를 조회합니다.
정말 이 부분들 모르겠음 …
'AI SCHOOL > SQL' 카테고리의 다른 글
[SQL] 실무 데이터 분석 (0) | 2023.02.10 |
---|---|
[SQL] WITH / 서브쿼리 연습문제 - 1 (0) | 2023.02.02 |
[SQL] 집합 연습문제 (0) | 2023.01.27 |
[SQL] 집합 (0) | 2023.01.27 |
[SQL] JOIN 연습문제 (0) | 2023.01.26 |