박지홍·2023년 2월 24일
0

#Subquery 사용법
하나의 커리안에 또다른 SQL 쿼리문이 잇는것을 의미함.

~#Where 에서의 서브쿼리

결제수단이 kakaopay인 사람 목록 보기.
select u.user_id, u.name, u.email from users u
inner join orders o on u.user_id = o.user_id
where o.payment_method = 'kakaopay'

서브쿼리를 사용하면 이렇게 사용 할 수 있다.
select u.user_id, u.name, u.email from users u
WHERE user_id in (
select user_id from orders o
where payment_method = 'kakaopay'
)

~#Select 에서의 서브쿼리

유저 id별로 평균 like 구하기
select user_id,round(avg(likes),1) from checkins c
group by user_id

SELECT c.checkin_id,
c.user_id,
c.likes,
(
select avg(likes) from checkins
where user_id = c.user_id
)as avg_likes
FROM checkins c

~#Join 에서의 서브쿼리.
위구문에서 point의 양을 포함시켜 확인하고 싶을때.
SELECT pu.user_id, pu.point, a.avg_likes from point_users pu
inner join (
select user_id, round(avg(likes),1) as avg_likes from checkins c
group by user_id
) a on pu.user_id = a.user_id

~퀴즈1. 전체 유저의 포인트 평균보다 큰 유저들의 데이터 추출
SELECT user_id, point from point_users pu
where point > (
select avg(point) as point_avg from point_users pu2
)

~퀴즈2. 이씨 성을 가진 유저의 포인트의 평균보다 큰 유저들의 데이터 추출
SELECT user_id, point from point_users pu
where point > (
select avg(point) as point_avg from point_users pu2
inner join users u on pu2.user_id = u.user_id
where u.name = '이**'
)

~퀴즈3checkins 테이블에 course_id별 평균 like수
SELECT course_id,
checkin_id ,
user_id ,
likes,
(
select round(avg(likes),1) from checkins c2
where c.course_id = c2.course_id
)as avg_likes
from checkins c

~퀴즈4. checkins 테이블에 과목명별 평균 like수
SELECT c3.title,
c.checkin_id ,
c.user_id ,
c.likes,
(
select round(avg(likes),1) from checkins c2
where c.course_id = c2.course_id
)as avg_likes
from checkins c
inner join courses c3 on c.course_id = c3.course_id

~# From 에서 사용되는 서브쿼리

~연습1.course_id별 유저의 체크인 개수를 구한다.
~연습2.course_id별 유저의 인원을 구한다.
~연습3.course_id별 like개수에 전체인원을 붙인다.
~연습4.비율을 나타내준다.
~연습5.course_id를 강의제목으로 바꿔준다.

select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total)as ratio
FROM
(
select course_id, COUNT(DISTINCT(user_id)) as cnt_checkins from checkins
group by course_id
) a
inner join (
select course_id, count(*) as cnt_total from orders
group by course_id
)b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

~# with 에서 사용되는 서브쿼리

함수처럼 사용되는 쿼리문

with table1 as (
select course_id, COUNT(DISTINCT(user_id)) as cnt_checkins from checkins
group by course_id
), table2 as(
select course_id, count(*) as cnt_total from orders
group by course_id
)
select c.title, a.cnt_checkins, b.cnt_total, (a.cnt_checkins/b.cnt_total)as ratio
FROM tab1e1 a
inner join table2 b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

0개의 댓글