728x90
(아래 나오는 내용들은 스파르타 코딩클럽의 엑셀보다 쉬운 SQL 강의 내용을 정리한 것이다.)
1. Subquery
1) Where에 들어가는 Subquery
#전체 유저의 포인트의 평균보다 큰 유저들의 데이터 추출하기
select * from point_users pu
where pu.point > (select avg(pu2.point) from point_users pu2)
point_users에서 평균값(avg)를 먼저 구한 뒤 where을 사용해서 평균값보다 큰 point를 구할 수 있음.
#이씨 성을 가진 유저의 포인트의 평균보다 큰 유저들의 데이터 추출하기
select * from point_users pu
WHERE pu.point >
(SELECT AVG(pu2.point) FROM point_users pu2
inner join users u on u.user_id = pu2.user_id
WHERE u.name = '이**')
subquery에서 join을 활용하여 병합도 가능.
2) Select에 들어가는 Subquery
#checkins 테이블에 course_id별 평균 likes수 필드 우측에 붙여보기
SELECT checkin_id , course_id , user_id , likes,
(SELECT round(AVG(likes),1) from checkins c2
where c.course_id = c2.course_id)
from checkins c
말 그대로 select문에 select문을 넣으면 된다. 여기서 주의해야 할 점은 where절을 잘 사용하여 필드값을 맞춰줘야 한다는 점.
3) From에 들어가는 Subquery
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
###############################################################################
SELECT course_id, count(distinct(user_id)) as cnt_checkins FROM checkins
group by course_id
SELECT course_id, count(*) from orders
group by course_id
SELECT * FROM courses c
from절은 실제 데이터를 뽑아오는 테이블이 위치하는 부분이기 때문에 #### 아래부분 처럼 필요한 데이터를 가지고 있는 테이블을 만드는 사전 작업이 필요하다. 이후 from절 자리에 미리 만들어 놓은테이블을 넣어주기만 하면 되고, 이름이 길기 때문에 예명을 붙여주기만 하면 된다. join하는 방법도 마찬가지로 미리 만들어 놓은 테이블을 형식에 맞춰서 붙여넣기만 하면 된다.
subquery는 초반 작업과 헷갈리지 않게 코드를 작성하는 방법이 가장 중요한 것 같다. 초반에 예명을 잘 설정하여 작성하고, 가독성이 좋게 들여쓰기를 하는 것이 subquery 활용에 있어서 가장 중요한 부분이라고 생각된다.
728x90
'SQL' 카테고리의 다른 글
-SQL 문법정리- (0) | 2023.01.20 |
---|---|
-SQL 3주차- (0) | 2023.01.18 |
-SQL 2주차- (0) | 2023.01.17 |
-SQL 1주차- (0) | 2023.01.16 |