AI SCHOOL/SQL

[SQL] WITH / 서브쿼리 연습문제 - 1

moru_xz 2023. 2. 2. 22:34

SQL 연습문제 10-1

thelook_ecommerce 데이터 세트, events 테이블에는 유저의 웹 사이트 접속기록 데이터가 기록되어있습니다.

이벤트 기록에서 이벤트 타입이 purchase인 이벤트가 10번 이상 등록된 사람을 "실 고객"라고 부릅니다.

실고객에 해당하는 회원의 **이벤트 정보(events)**들을 유저 아이디 순으로 조회하세요.

실고객에 해당하는 user_id들을 먼저 구한뒤에 해당 user_id들을 이용해서 이벤트 정보를 조회하세요.

  • 조회 항목 : 이벤트id(id), 유저ID(user_id), 도시(city), 주(state), 우편번호(postal_code), 브라우저 종류(browser), 유입경로(traffic_source), 이벤트 타입(event_type)
  • 정렬 : 유저ID 오름차순
select id, user_id, city, state, postal_code, browser, traffic_source, event_type
from `thelook_ecommerce.events`
where user_id in (
  select user_id
  from `thelook_ecommerce.events`
  where event_type = 'purchase'
  group by user_id
  having count(user_id) >= 10
)
order by user_id

처음에는 그냥 

select *
from `thelook_ecommerce.events`
where event_type = 'purchase'
group by user_id
having count(user_id) >= 10
 
까지만 생각함 -> 근데 이렇게 하면 실고객의 정보만 얻는 것에서 끝나고 실고객에 해당하는 사람들의 문제에서 원하는 조회항목을 볼 수 없음 그래서 서브쿼리를 해야 하는거임 이 조건에 해당하는 정보를 찾기 위해 
1. 실고객 user_id 찾기
2. 1을 가지고 해당 조건에 맞는 사람의 id, user_id, city, state, postal_code, browser, traffic_source, event_type 찾기
 

SQL 연습문제 10-2

thelook_ecommerce 데이터 세트 - 회원(users) 테이블과 주문(orders) 테이블에서 연령대별(user_count) 회원수와 주문횟수합계(order_count)를 조회하세요.

조회 항목

  • 연령대 (age_group)
    • 예 : 10대, 20대, 30대, 40대 ~~ 70대
    • 참고 함수 trunc : 소수점 버리기
      • select trunc(78, -1) || '대' --> 70대
      • select trunc(32, -1) || '대' --> 30대
  • 회원수(user_count)
  • 주문횟수합계 (order_count)

정렬순서

  • 연령대 오름차순

얘 잘 모르겠음 

 

 

SQL 연습문제 10-3

thelook_ecommerce 데이터 세트, 회원(users) 테이블에서

  1. 가장 많은 회원 나이를 구하고
  2. 그 나이의 회원들의 정보를 조회하세요.

조회 항목

  • 이름(first_name, last_name)
  • 주소 정보(state, street_address, city, country)
  • 우편 번호(postal_code)
select 
  first_name, 
  last_name, 
  state, 
  street_address, 
  city, 
  country, 
  postal_code
from `thelook_ecommerce.users`
where age = (
  select max(age)
  from `thelook_ecommerce.users`
)

age = 이라고 쓸 생각을 못했음 -> in 만 되는 줄 

 

SQL 연습문제 10-4

weniv 데이터 세트에서 모니터를 구입한 회원(user)의 이름(name)과 우편번호(postal_code)를 서브쿼리만 이용하여 조회하시오. (join을 사용하지 않습니다.)

select name, postal_code
from `weniv.weniv_user`
where id in (
  select user_id
  from `weniv.weniv_order_details`
  where PRODUCT_NAME = 'monitor'
)

이건 그냥… details 테이블 써도 되는 줄 알고 푼 

select name, postal_code
from `weniv.weniv_user`
where id in (
  select user_id
  from `weniv.weniv_order`
  where product_id in (
    select id
    from `weniv.weniv_product`
    where name = 'monitor'
  )
)

 

 

SQL 연습문제 10-5

weniv 데이터 세트에서 소울곰(Soulgom)이라는 이름의 회원이 구입한 상품의 데이터를 모두 조회하세요. JOIN을 이용하지 않고 서브쿼리만 써서 해보세요.

select *
from `weniv.weniv_product`
where id in (
  select product_id
  from `weniv.weniv_order`
  where user_id = (
    select id
    from `weniv.weniv_user`
    where name = 'Soulgom'
  ) 
)

user_id = () 랑 in 의 차이는 뭐지? 

 

 

 

 

 

 

 

'AI SCHOOL > SQL' 카테고리의 다른 글

[SQL] 실무 데이터 분석  (0) 2023.02.10
[SQL] WITH / 서브쿼리  (0) 2023.02.02
[SQL] 집합 연습문제  (0) 2023.01.27
[SQL] 집합  (0) 2023.01.27
[SQL] JOIN 연습문제  (0) 2023.01.26