Order by 연습하기
문자열을 기준으로 정렬해보기
select * from users
order by email;
select * from users
order by name;
시간을 기준으로 정렬해보기
select * from users
order by created_at desc;
Group by 연습하기
select payment_method, count(*) from orders
where course_title = "앱개발 종합반"
group by payment_method;
select name, count(*) from users
where email like '%gmail.com'
group by name;
select course_id, avg(likes) from checkins
group by course_id;
📌 꿀팁
1) show tables로 어떤 테이블이 있는지 살펴보기
2) 제일 원하는 정보가 있을 것 같은 테이블에 select * from 테이블명 limit 10 쿼리 날려보기
3) 원하는 정보가 없으면 다른 테이블에도 2)를 해보기
4) 테이블을 찾았다! 범주를 나눠서 보고싶은 필드를 찾기
5) 범주별로 통계를 보고싶은 필드를 찾기
6) SQL 쿼리 작성하기!
select * from orders o
where o.course_title = '앱개발 종합반'
select payment_method, count(*) as cnt from orders o
where o.course_title = '앱개발 종합반'
group by payment_method
👉 숙제
네이버 이메일을 사용하여 앱개발 종합반을 신청한 주문의 결제수단별 주문건수 세어보기
select payment_method, count(*) from orders
where email like '%naver.com' and course_title = '앱개발 종합반'
group by payment_method
Join: 여러 정보를 한 눈에 보고 싶다면
👉 오늘의 미션!
'오늘의 다짐' 이벤트 당첨자를 선정하여 스타벅스 기프티콘을 지급해야 해요.
우선, 배운 내용을 사용해서 '오늘의 다짐' 테이블을 불러와 볼까요?
오늘의 다짐 이벤트: 오늘의 다짐을 남겨준 10명 추첨해서 기프티콘 지급하는 이벤트.
💡 그런데 문제가 생겼어요!
'오늘의 다짐' 이벤트 당첨자를 추첨하기 위해서는, 이름과 연락처 등의 정보를 알아야 하는데 여기에는 user_id라는 정보만 있어요.
📌 기존의 방식대로 하면
회원 정보가 필요하니 users 테이블을 한번 살펴볼까요?
똑같은 이름의 필드를 발견했어요. users 테이블의 user_id 필드와, checkins 테이블의 user_id 필드의 이름이 같아요. 이걸 잘 연결시키면 될 것 같지 않나요?
실제로 맞는지 확인해 봅시다! where를 잘 쓰면 되겠죠?
👉 [오늘의 꿀팁!]
한 테이블에 모든 정보를 담을 수도 있겠지만, 불필요하게 테이블의 크기가 커져 불편해집니다.
그래서, 데이터를 종류별로 쪼개 다른 테이블에 담아놓고 연결이 필요 한 경우 연결할 수 있도록 만들어놓습니다.
예를 들면, users와 checkins 테이블에 동시에 존재하는 user_id 처럼요.
이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 부릅니다.
Join을 사용하면?
Join 이란?
Join이란?
두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미해요.
예) user_id 필드를 기준으로 users 테이블과 orders 테이블을 연결해서 한 눈에 보고 싶어요!
그럴 때를 대비해서 무언가 연결된 정보가 있을 때, user_id 처럼 동일한 이름과 정보가 담긴 필드를 두 테이블에 똑같이 담아놓는답니다. 이런 필드를 두 테이블을 연결시켜주는 열쇠라는 의미로 'key'라고 불러요.
아래 테이블에서 (checkins 테이블) key값에 해당하는 필드를 찾아보세요.
💡 [오늘의 꿀팁!]
병원에서 의사선생님이 '환자번호 101번님 진료받으러 들어오세요' 라고 불렀는데 같은 환자번호를 가진 사람이 여러명이 있으면 누가 들어와야 할지 환자번호만으로 알 수 없겠죠?
SQL에서의 Join도 마찬가지에요.
key값을 사용해 연결하고 싶은 테이블에 찾아가서 똑같은 값을 가지는 key를 찾게 되는데, 똑같은 key를 가지는 데이터가 여러개 있으면 어느 데이터를 가져와서 연결해야 할지 알 수 없어요.
Join을 사용해서 Key값으로 두 테이블 연결해보기
select * from point_users
left join users
on point_users.user_id = users.user_id
Join의 종류: Left Join, Inner Join
Left Join: 유저 데이터로 Left Join 이해해보기
SQL에서의 Join은 두 집합 사이의 관계와 같답니다.
유저 데이터로 Left Join 이해해보기
select * from users u
left join point_users p
on u.user_id = p.user_id;
👉 어떤 데이터는 모든 필드가 채워져있지만, 어떤 데이터는 비어있는 필드가 있습니다.
꽉찬 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재해서 연결한 경우
비어있는 데이터: 해당 데이터의 user_id 필드값이 point_users 테이블에 존재하지 않는 경우
Inner Join: 유저 데이터로 Inner Join 이해해보기
유저 데이터로 Inner Join 이해해보기
select * from users u
inner join point_users p
on u.user_id = p.user_id;
Join 함께 연습해보기
orders 테이블에 users 테이블 연결해보기
👉 inner Join을 사용해서 주문 정보에, 유저 정보를 붙여서 볼까요?
select * from orders o
inner join users u
on o.user_id = u.user_id;
checkins 테이블에 users 테이블 연결해보기
👉 Inner Join을 사용해서 '오늘의 다짐' 테이블에, 유저 테이블을 붙여서 볼까요?
select * from checkins c
inner join users u
on c.user_id = u.user_id;
enrolleds 테이블에 courses 테이블 연결해보기
👉 Inner Join을 사용해서 '수강 등록' 테이블에, 과목 테이블을 붙여서 볼까요?
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
SQL 쿼리가 실행되는 순서
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
👉 위 쿼리가 실행되는 순서: from → join → select
배웠던 문법 Join과 함께 연습해보기
checkins 테이블에 courses 테이블 연결해서 통계치 내보기
👉 과목별 오늘의 다짐 갯수 세어보기
select co.title, count(co.title) as checkin_count from checkins ci
inner join courses co
on ci.course_id = co.course_id
group by co.title
point_users 테이블에 users 테이블 연결해서 순서대로 정렬해보기
👉 유저의 포인트 정보가 담긴 테이블에 유저 정보를 연결해서, 많은 포인트를 얻은 순서대로 유저의 데이터를 뽑아보자!
select * from point_users p
inner join users u
on p.user_id = u.user_id
order by p.point desc
orders 테이블에 users 테이블 연결해서 통계치 내보기
👉 주문 정보에 유저 정보를 연결해 네이버 이메일을 사용하는 유저 중, 성씨별 주문건수를 세어보자!
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
SQL 쿼리가 실행되는 순서
select u.name, count(u.name) as count_name from orders o
inner join users u
on o.user_id = u.user_id
where u.email like '%naver.com'
group by u.name
👉 위 쿼리가 실행되는 순서 :
from → join → where → group by → select
Join 연습1
point_users
에, orders
를 붙이기select o.payment_method, round(AVG(p.point)) from point_users p
inner join orders o
on p.user_id = o.user_id
group by o.payment_method
Join 연습2
enrolleds
에, users
를 붙이기select name, count(*) as cnt_name from enrolleds e
inner join users u
on e.user_id = u.user_id
where is_registered = 0
group by name
order by cnt_name desc
Join 연습3
courses
에, enrolleds
를 붙이기select c.course_id, c.title, count(*) as cnt_notstart from courses c
inner join enrolleds e
on c.course_id = e.course_id
where is_registered = 0
group by c.course_id
Join 연습4
courses
에, checkins
를 붙이기select c1.title, c2.week, count(*) as cnt from checkins c2
inner join courses c1 on c2.course_id = c1.course_id
group by c1.title c2.week
order by c1.title, c2.week
Join 연습5
courses
에, checkins
를 붙이고!checkins
에, orders
를 한번 더 붙이기!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