주차별로 간단하게 정리하며, 예를 하나 쓰려고함
[1주차]
Select
가장 기본적인 Select는 데이터베이스에서 '데이터를 선택해서 가져오겠다는 말이다.'
여기서 테이블 과 필드를 알면, 좀 더 쉽게 이해할 수 있다.
테이블 : 엑셀하단에 씨트명을 뜻하고 이는 데이터가 담긴 엑셀 씨트와 동일함
필드는 : 테이블에 닮긴 종목의 명? 쯤 생각하면 되겠음
Where 절의 개념
나는 이 where을 다른 프로그래밍 언어인 if문 개념이라고 생각했더니 쉽게 이해함.
사용방법은 다르지만 개념자체는 비슷함
select와 함께 쓰면 이렇게 표현
select * from orders
where payment_method = "naverpay"
해석하자면 orders 테이블에서 paymet_method가 "naverpay"인 것을 가져온 것이다.
Where 절과 같이쓰는 문법은
'같지 않음' 조건은 != // '범위' 조건은 between // '포함' 조건은 in // '패턴' 조건은 like
select * from orders
where course_title != "웹개발 종합반" -- 같지 않음 : 웹개발 종합반이 아닌 데이터를 뽑기
where created_at betwwn "2020-07-13" and "2020-07-15" -- 범위 : 7월 13일, 14일 주문 데이터를 뽑기
select * from checkins
where week in (1, 3) -- 포함 : 1, 3 주차 사람들의 '오늘의 다짐'만 뽑기
select * from users
where email like '%daum.net' -- 패턴 : 다음을 사용하는 이메일을 뽑기
나머지 문법
일부 데이터만 가져오는 : Limit -- (끝에 limit '숫자')를 기입하면, 숫자에 기입된 수 만큼 보여줌
중복 데이터는 제외하고 가져오기 : Distinct // 몇 개인지 숫자 세보기 : Count
Distinct와 Count를 같이 써보면서 이해하자
select count(distinct(name)) from users
-- 우선 distinct(name)을 통해 성씨별로 구별 후
-- 그 뒤 count에 감싸 몇개의 성씨로 이루어져 있는지 확인가능
[2주차]
Group by
동일한 범주를 갖는 데이터를 하나로 묶어서, 범주별 통계를 내주는 것
select name, count(*) from users
group by name
Order by
정렬할 때 사용
select * from checkins
order by likes desc -- desc를 넣으면 높은 순서 빼면 낮은 순서대로 볼 수 있음
같이 사용
select payment_method, count(*) from orders -- 주문 테이블에서 결제별 수단을 카운트
where course_title = "웹개발 종합반" -- 웹개발 종합반인 것만 보게하고
group by payment_method -- 그리고 카운터가 된 것을 내림차순으로 보여줌
[3주차]
Join
여러 정보를 한 눈에 보고 싶을 때 사용
두 테이블의 공통된 정보 (key 값)을 기준으로 테이블을 연결해서 한 테이블 처럼 보는 것을 의미
user_id 필드를 기준을 users 테이블과 orders 테이블을 연결해서 한눈에보는법
select * from point_users
left join users
on point_users.user_id = users.user_id
엑셀을 공부했다면, vlookup과 동일하다고 보면 됨
inner Join 과 left Join 차이점
inner 은 교집합, left join은 첫번째 원에 붙이는 것이라 생각하면 이해하기 쉬움
inner join
- orders 테이블과 users 테이블의 연결
select * from orders o
inner join users u
on o.user_id = u.user_id
left join
- user 테이블과 point_users 테이블을 left join 함
select * from users u
left join point_users pu on u.user_id = pu.user_id
결과에서 pu가 없는 사람들은 즉 시작하지 않은 사람을 뜻함.
Union
Select를 두 번 하지 않고, 한번에 모아서 보고 싶을 때 사용
우선 조건은 필드명이 같아야함
(
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주차]
Subquery
SQL안에 하나의 SQL 쿼리가 있는 것을 의미
select u.user_id, u.name, u.email from users u
where u.user_id in (
select user_id from orders
where payment_method = 'kakaopay'
)
이는 where. select, from 절에서 유용
Where
select * from users u
where u.user_id in (select o.user_id from orders o
where o.payment_method = 'kakaopay')
select
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;
from
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
with 절을 통해 깔끔하게 사용
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
//whith 절 사용 후
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