스파르타 코딩클럽 SQL 문법 총 정리 기록

박찬웅·2022년 12월 22일
0

SQL

목록 보기
1/1
post-thumbnail

여기 적혀 있는 모든 코드는 스파르타 강의에 있는 강의 노트를 참고했으며, 모든 코드는 예시 입니다.

1주차

1. SHOW 사용법

스파르타 데이터베이스의 테이블 보기

show tables;

2. SELECT 사용법

(1) orders 테이블의 데이터 가져와보기

select * from orders;

(2) orders 테이블의 특정 필드만 가져와보기

select created_at, course_title, payment_method, email from orders;

3. WHERE 사용법

(1) 기본적인 where 사용하기

select * from orders
where payment_method = "kakaopay";

(2) 다중 조건 사용하기

select * from orders
where course_title = "앱개발 종합반" and payment_method = "kakaopay";

(3) '같지 않음' 조건 걸어보기

select * from orders
where course_title != "웹개발 종합반";

(4) '범위' 조건 걸어보기

select * from orders
where created_at between "2020-07-13" and "2020-07-15";

(5) '포함' 조건 걸어보기

select * from checkins 
where week in (1, 3);

(6) '패턴' (문자열 규칙) 조건 걸어보기

select * from users 
where email like '%daum.net';

4. 특수 쿼리 사용법

(1) 일부 데이터만 가져오기

select * from orders 
where payment_method = "kakaopay"
limit 5;

(2) 중복 데이터는 제외하고 가져오기

select distinct(payment_method) from orders;

(3) 몇 개인지 숫자 세보기

select count(*) from orders;

(4) DISTINCT와 COUNT 함께 사용하기

select count(distinct(name)) from users;

2주차

1. GROUP BY 사용법

(1) 동일한 범주의 개수 구하기

select week, count(*) from checkins
group by week;

(2) 동일한 범주에서의 최솟값 구하기

select week, min(likes) from checkins
group by week;

(3) 동일한 범주에서의 최댓값 구하기

select week, max(likes) from checkins
group by week;

(4) 동일한 범주의 평균 구하기

select week, avg(likes) from checkins
group by week;

(5) 동일한 범주의 합계 구하기

select week, sum(likes) from checkins
group by week;

2. ORDER BY 사용법

(1) 오름차순 정렬하기

select * from checkins
order by likes asc;

asc는 생략 가능

select * from checkins
order by likes;

(2) 내림차순 정렬하기

select * from checkins
order by likes desc;

3. 응용

(1) GROUP BY와 ORDER BY 같이 사용하기

select name, count(*) from users
group by name
order by count(*);

(2) WHERE, GROUP BY, ORDER BY 같이 사용하기

select payment_method, count(*) from orders
where course_title = "웹개발 종합반"
group by payment_method
order by payment_method;

(3) 별칭 기능 사용하기

select payment_method, count(*) as cnt from orders o
where o.course_title = '앱개발 종합반'
group by payment_method;

3주차

1. JOIN 사용법

(1) LEFT JOIN 사용하기

select * from users u
left join point_users p
on u.user_id = p.user_id;

(2) INNER JOIN 사용하기

select * from orders o
inner join users u
on o.user_id = u.user_id;

2. 응용

JOIN, GROUP BY, ORDER BY 모두 다중으로 사용하기

select c1.title, c2.week, count(*) as cnt from courses c1
inner join checkins c2 on c1.course_id = c2.course_id
inner join orders o on c2.user_id = o.user_id
where o.created_at >= '2020-08-01'
group by c1.title, c2.week
order by c1.title, c2.week;

3. UNION ALL 사용법

두 결과물을 하나로 합치기

(
	select '7월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at < '2020-08-01'
	group by c2.course_id, c2.week
    order by c2.course_id, c2.week
)
union all
(
	select '8월' as month, c.title, c2.week, count(*) as cnt from checkins c2
	inner join courses c on c2.course_id = c.course_id
	inner join orders o on o.user_id = c2.user_id
	where o.created_at > '2020-08-01'
	group by c2.course_id, c2.week
    order by c2.course_id, c2.week
);

4주차

1. SUBQUERY 사용법

(1) WHERE에 들어가는 SUBQUERY 사용하기

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

(2) SELECT에 들어가는 SUBQUERY 사용하기

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;

(3) 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;

(4) INNER JOIN에 들어가는 SUBQUERY 사용하기

select a.course_id, b.cnt_checkins, a.cnt_total from
(
	select course_id, count(*) as cnt_total from orders
	group by course_id
) a
inner join (
	select course_id, count(distinct(user_id)) as cnt_checkins from checkins
	group by course_id
) b
on a.course_id = b.course_id;

(5) WITH절을 이용한 SUBQUERY 사용하기

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;

2. 문자열 사용법

(1) 문자열 쪼개보기

1) 이메일에서 아이디만 가져와보기

select user_id, email, SUBSTRING_INDEX(email, '@', 1) from users;

2) 이메일에서 이메일 도메인만 가져와보기

select user_id, email, SUBSTRING_INDEX(email, '@', -1) from users;

(2) 문자열 일부만 출력하기

1) order 테이블에서 날짜까지 출력하게 해보기

select order_no, created_at, substring(created_at,1,10) as date from orders;

2) 일별로 몇 개씩 주문이 일어났는지 살펴보기

select substring(created_at,1,10) as date, count(*) as cnt_date from orders
group by date;

3. CASE 사용법

(1) 경우에 따라 원하는 값을 새 필드에 출력해보기

select pu.point_user_id, pu.point,
case 
when pu.point > 10000 then '잘 하고 있어요!'
else '조금 더 달려주세요!'
END as '구분'
from point_users pu;

(2) CASE 다중 사용하기

select pu.point_user_id, pu.point,
case 
when pu.point > 10000 then '1만 이상'
when pu.point > 5000 then '5천 이상'
else '5천 미만'
END as lv
from point_users pu;

(3) SUBQUERY 활용하기

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

(4) 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 lv
	from point_users pu
)
select level, count(*) as cnt from table1
group by lv;
profile
향해 13기 node.js 백앤드

0개의 댓글