AI SCHOOL/SQL

[SQL] WITH / 서브쿼리

moru_xz 2023. 2. 2. 21:31

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
  1. user_order_counts 라는 유사 테이블을 정의합니다. 내용은 주문테이블로 부터 유저아이디와 유저의 주문수를 조회합니다.
  2. user_event_counts 라는 유사 테이블을 정의합니다. 내용은 이벤트테이블로 부터 유저아이디와 유저의 이벤트수를 조회합니다.
  3. 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