본문 바로가기

카테고리 없음

SQL 마무리 정리

주차별로 간단하게 정리하며, 예를 하나 쓰려고함

 

[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