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 뒤에 , 따옴표 찍지 않아서 계속해서 오류 났었음.
제발 까먹지 마라!!! 🤣
Author And Source
이 문제에 관하여(TIL 2021.07.28 | (SQL) Subquery 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dkswldp95/TIL-2021.07.82-SQL-Subquery저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)