정리

26-2 TIL 정리 (SQL subquery)

모_아이 2022. 5. 25. 00:46

정리-1  ( https://mo-i-programmers.tistory.com/59 )

Subquery

쿼리안의 쿼리!

-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'); // 카카오페이로 결제한 주문건 유저들만

1. from 실행 : users 데이터를 가져와줌

2. Subquery 실행 : 해당되는 user_id의 명단을 뽑아줌

3. where ..in 절에서 subquery의 결과에 해당되는 'user_id의 명단' 조건으로 필터링

4. 조건에 맞는 결과 출력

 

-Select에 들어가는 Subquery

기존 테이블에 함께 보고싶은 통계 데이터를 손 쉽게 붙이는 것에 사용

select 필드명,필드명, (subquery) from..

select c.checkin_id, c.user_id, c.likes, 
	(select avg(likes) from checkins c2 // 첵킨스 user_id 좋아요수 평균
	where c2.user_id = c.user_id) as avg_like_user
from checkins c;

1. 밖의 select * from 문에서 데이터를 한줄한줄 출력하는 과정에서

2. select 안의 subquery가 매 데이터 한줄마다 실행

3. 그 데이터 한줄의 user_id를 갖는 데이터의 편균 좋아요 값을 subquery에서 계산해서

4. 출력

-From 에 들어가는 Subquery

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

1. 먼저 서브쿼리의 select가 실행

2. 이것을 테이블처럼 여기고 밖의 select가 실행

 

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 table1 a inner join table2 b on a.course_id = b.course_id
inner join courses c on a.course_id = c.course_id

with table as 를 통해 아래 쿼리에서 서브쿼리를 table로 대체

 

문자열

SUBSTRING_INDEX

select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users
// email에서 @부분으로 나누고 1번째 값을 가져와 (id값)
// SUBSTRING_INDEX(email, '@', -1)할경우 맨끝 즉 domain값

SUBSTRING

문자열에서 일부만 출력

select order_no, created_at, substring(created_at,1,10) as date from orders
// created_at 에서 1번째 부터 10번째까지의 글짜만 출력

 

case

경우에 따라 원하는 값을 새 필드에 출력

with절을 이용한 case 예문

with table1 as (
	select pu.point_user_id, pu.point,
	case 
	when pu.point > 10000 then '1만 이상' //포인트가 1만이상일시 1만이상 출력
	when pu.point > 5000 then '5천 이상' // 포인트가 5천이상일시 5천이상 출력
	else '5천 미만' //그게 아니면 5천미만 출력
	END as lv //끝내고 필드 이름은 lv로 
	from point_users pu
)

select level, count(*) as cnt from table1
group by lv

 

반응형

'정리' 카테고리의 다른 글

29TIL 정리 (서버리스 백엔드)  (0) 2022.05.27
27 TIL 정리 (서버리스 프론트엔드)  (0) 2022.05.25
26 TIL 정리 (SQL-Read)  (0) 2022.05.25
25 TIL 정리 (SQL-Read)  (0) 2022.05.24
23 TIL 정리(GCP-가상머신)  (0) 2022.05.19