TIL 2021.07.28 | (SQL) Subquery 1

서브쿼리부터 너무 정리가 어렵습니다. 온전히 이해하지 못하는지 작성하는게 계속 막힙니다. 😢
점점 문장이 길어지니 이해도도 떨어지는거 같습니다.
그래서 그런지 TIL을 안 쓰게 되서 오늘 이렇게 조금이라도 작성해봅니다.
틀린 점이나 개선해야할 점을 남겨주시는 것은 언제나 환영입니다. 🙏

● 여름방학 SQL 공부하기
SQL 이론 학습을 위해 SQLD 공부 중 → 9월 中 SQLD 자격 취득이 목표
SQL 학습을 위해 온라인 강의 수강 중: 스파르타 코딩클럽

TIL 2021.07.28 start!

1. 여러 방식으로 작성 가능한 쿼리

▶카카오페이로 결제한 유저 정보 보기

1) inner join

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'

2) Subquery

select * from users u
where user_id in (
	select user_id from orders
	where payment_method = 'kakaopay'
)

❗문장이 길어질수록 탭으로 잘 정리하기

2. 서브쿼리 내용 정리

▶Subquery는 where, select, from 절에서 유용하게 사용됨.

1) Where 에 들어가는 Subquery : where 필드명 in (subquery)

#카카오페이로 결제한 주문건 유저들만, 유저 테이블에서 출력해주고 싶을 때
select * from users u
where u.user_id in (select o.user_id from orders o 
		where o.payment_method = 'kakaopay');

(a) from 실행: users 데이터를 가져와줌
(b) Subquery 실행: 해당되는 user_id의 명단을 뽑아줌
(c) where .. in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링 해줌
(d) 조건에 맞는 결과 출력

2) Select 에 들어가는 Subquery : 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;

(a) 밖의 select * from 문에서 데이터를 한줄한줄 출력하는 과정에서
(b) select 안의 subquery가 매 데이터 한줄마다 실행되는데
(c) 그 데이터 한 줄의 user_id를 갖는 데이터의 평균 좋아요 값을 subquery에서 계산해서
(d) 함께 출력해준다!

3) From 에 들어가는 Subquery

▶내가 만든 Select와 이미 있는 테이블을 Join하고 싶을 때 사용

(a) 먼저 서브쿼리의 select가 실행되고,
(b) 이것을 테이블처럼 여기고 밖의 select가 실행!

#a 유저 별 좋아요 평균
select user_id, round(avg(likes),1) as avg_like from checkins
group by user_id

#b 유저 별 포인트/ 포인트와 like의 상관정도
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

3. 서브쿼리 연습(where, select)💛

1) 퀴즈1 : 전체 유저의 포인트의 평균보다 큰 유저들의 데이터만 추출

#내가 쓴 퀴리 (정답)
select * from point_users pu
where point > (
	select round(avg(point),1) as avg_point from point_users pu
)

2) 퀴즈2 : 이씨 성을 가진 유저의 포인트의 평균보다 큰 유저들의 데이터 추출하기

#내가 쓴 쿼리 (error)
select * from point_users pu
where point > (
		select u.name, round(avg(pu.point),0) as avg_point from users u
		inner join point_users pu on u.user_id = pu.user_id
		where u.name like '이**'
)

#중간 단계에서는 에러가 나지 않고 이씨 성을 가진 유저의 평균값이 제대로 나옴
select u.name, round(avg(pu.point),0) as avg_point from users u
inner join point_users pu on u.user_id = pu.user_id
where u.name like '이**'

#정답
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 = "이**")

❗왜 서로 다른 결과를 가져오는지 의문이 듦. (질의응답에 남겨둠)

3) 퀴즈3 : 코스별 평균 like수 붙여보기

#내가 쓴 쿼리
select c.checkin_id, c.course_id, c.user_id, c.likes,
       (
       select round(avg(likes),1) from checkins
       where course_id = c.course_id
       ) as course_avg
       from checkins c

c.likes 뒤에 , 따옴표 찍지 않아서 계속해서 오류 났었음.
제발 까먹지 마라!!! 🤣

좋은 웹페이지 즐겨찾기