본 포스팅은 스파르타코딩클럽 SQL강의를 참고하여 포스팅하였습니다.
4주차 강의 목표
SQL 문에서 다른 SQL 문 내부에 중첩된 형태의 쿼리를 의미한다. 주 쿼리에 비해 보조적인 역할을 하며 서브 쿼리에서 돌아온 결과 값을 기반으로 주 쿼리의 실행 흐름이 결정된다.
간단하게 말해서, 하나의 SQL 문안에 또 다른 SQL 문이 포함되어 있는 구문이라고 생각하면되며, 하위 쿼리의 결과를 상위 쿼리에서 사용하면, SQL 쿼리가 훨씬 간단해지기 때문에 사용한다.
서브쿼리의 결과를 조건에 활용하는 방식으로 유용하게 사용한다.
where 필드명 in (subquery)
예시
select * from users u
where u.user_id in (select o.user_id from orders o
where o.payment_method = 'kakaopay');
예시쿼리의 실행순서
기존 테이블에 함께 보고싶은 통계 데이터를 손쉽게 붙이는 것에 사용한다.
select 필드명, 필드명, (subquery) from ..
예시
select c.checkin_id, c.user_id, c.likes,
(select avg(likes) from checkins c2
where c2.user_id = c.user_id) as avg_like_user
from checkins c;
예시쿼리의 실행순서
Select와 이미 있는 테이블을 Join하고 싶을 때 사용
예시
select pu.user_id, a.avg_like, pu.point from point_users pu
inner join (
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id
) a on pu.user_id = a.user_id
예시쿼리의 실행순서
select * from point_users pu2
where pu2.point > (select avg(pu.point) from point_users pu);
select * from point_users pu
where pu.point >
(select avg(pu2.point) from point_users pu2
inner join users u
on pu2.user_id = u.user_id
where u.name = "이**");
원하는 컬럼을 가진 checkins테이블을 먼저 작성
selet checkin_id, course_id, user_id, likes
from checkins c
위의 본 쿼리의 select 필드에 course_id별 평균 likes수를 구하는 서브쿼리 추가
select checkin_id, course_id, user_id, likes,
(select avg(c2.likes) from checkins c2
where c.course_id = c2.course_id)
from checkins c;
checkins테이블에 과목명을 붙이기 위한 courses 테이블과 조인 SQL작성
select checkin_id, c2.title, user_id, likes from checkins c
inner join courses c2 on c.course_id = c2.course_id
위의 본 쿼리의 select 필드에 c2.title별 평균 likes수를 구하는 서브쿼리 추가
select checkin_id, c2.title, user_id, likes,
(select avg(c3.likes)from checkins c3
where c.course_id = c3.course_id )
from checkins c
inner join courses c2
on c.course_id = c2.course_id
7-07 내용추가
*
) as cnt_total from ordersselect a.course_id, a.cnt_likes, b.cnt_user from
(
select course_id, sum(likes)as cnt_likes from checkins
group by course_id
) a
inner join
(
select course_id, count(`*`) as cnt_user from orders
group by course_id
) b
on a. course_id = b.course_id