[SQL 기본 문법 #3] Subquery

김지현·2023년 9월 26일
1

Subquery

쿼리 안의 쿼리
하위 쿼리의 결과를 상위 쿼리에서 사용

Where절

Subquery의 결과를 조건에 활용

where 필드명 in (subquery)

Select절

기존 테이블과 함께 보고싶은 통계 데이터를 쉽게 붙임

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

From절

subquery와 이미 존재하는 다른 테이블을 join할 때 활용

select * from table
join (subquery) s on ...

with

subquery를 with절로 깔끔하게 쿼리문 정리

with table1 as (subquery)
select * from table1 ...

SUBSTRING

  • 문자열 쪼개기
SUBSTRING_INDEX(문자열, 구분자, 위치)
// 1 : 구분자 기준으로 텍스트를 쪼개고 첫 번째 조각 사용
// -1 : 마지막 조각 사용
  • 문자열 일부만 출력
SUBSTRING(문자열, 시작 지점, 글자수)

CASE

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

select *
	case when (조건) then (출력)
    else (출력)
    end as (별칭)
from ...

[예시] case, with절 예시

with table1 as (
	select pu.point_user_id, pu.point,
	case 
	when pu.point >= 10000 then '1만 이상'
	when pu.point >= 5000 then '5천 이상'
	else '5천 미만'
	END as level
	from point_users pu
)
select level, count(*) as cnt from table1
group by level

[퀴즈1] course_id별 유저의 체크인 개수, 전체 인원 대비 비율 구하기
1. course_id별 유저의 체크인 개수 구하기
2. course_id별 인원 구하기
3. 2번을 subquery로 1번에 join 하기
4. 비율을 구하기 위해 cnt_chkins / cnt_total
5. course 테이블과 join 하여 강의 title 표시

select c2.title,
		count(DISTINCT user_id) as cnt_checkins,
		a.cnt_total,
		(count(DISTINCT user_id) / cnt_total) as ratio
from checkins c 
inner join (
	select course_id, count(*) as cnt_total from orders o 
	group by course_id
) as a on a.course_id = c.course_id 
inner join courses c2 on c.course_id = c2.course_id 
group by c.course_id 

[퀴즈2] 이메일 도메인별 유저수 세기

select SUBSTRING_INDEX(email,'@',-1) as domain, count(*) as cnt
from users
group by domain

0개의 댓글