4주차 숙제: 블로그를 하나 만들고 문법을 정리한 다음, 포스팅한 글의 링크를 제출해주세요!
● 쿼리(Query)문 : 쿼리는 질의를 의미. 데이터베이스에 명령을 내리는 것을 의미
● Select 쿼리문 : 데이터베이스에서 '데이터를 선택해서 가져오겠다'는 것을 의미
● Where 절 : Select 쿼리문으로 가져올 데이터에 조건을 걸어주는 것을 의미
● where 과 자주 같이 쓰는 문법
☞ != ( '같지 않음' 조건)
☞ 예시) '웹개발 종합반'을 제외하고 주문데이터를 추출
select * from orders
where course_title != "웹개발 종합반";
☞ between ('범위' 조건)
☞ 예시) 7월 13일, 7월 14일의 주문데이터만 추출
select * from orders
where created_at between "2020-07-13" and "2020-07-15";
☞ in ('포함' 조건)
☞ 예시) 1, 3주차 사람들의 '오늘의 다짐' 데이터만 추출
select * from checkins
where week in (1, 3);
☞ like ('패턴' 조건)
☞예시) 다음 (daum) 이메일을 사용하는 유저만 추출
select * from users
where email like '%daum.net';
* Like : 조건을 거는 문법이며 사용법이 아주 다양
→ where email like 'a%': email 필드값이 a로 시작하는 모든 데이터
→ where email like '%a' email 필드값이 a로 끝나는 모든 데이터
→ where email like '%co%' email 필드값에 co를 포함하는 모든 데이터
→ where email like 'a%o' email 필드값이 a로 시작하고 o로 끝나는 모든 데이터
등등등등
● Limit : 일부 데이터만 가져오기
☞예시) 많은 데이터 중 5개만 출력
select * from orders
where payment_method = "kakaopay"
limit 5;
● Distinct : 중복 데이터는 제외하고 가져오기
☞예시) 고객이 사용한 결제수단
select distinct(payment_method) from orders;
● Count : 몇 개인지 숫자 세보기
☞예시) orders 테이블에 데이터가 몇 개 들어있는지
select count(*) from orders
● Group by : 동일한 범주의 데이터를 묶어서 통계를 내줌
☞예시) 스파르타 회원: 성씨별로 몇 명의 회원이 있는지
select name, count(*) from users
group by name;
● Order by : 출력하는 데이터를 필드의 값으로 정렬하여 출력
*원본 쿼리*
select name, count(*) from users
group by name;
☞예시) 결과의 개수 오름차순으로 정렬해보기
select name, count(*) from users
group by name
order by count(*);
☞예시) 결과의 개수 내림차순으로 정렬해보기
select name, count(*) from users
group by name
order by count(*) desc;
● Join : 두 테이블의 공통된 정보 (key값)를 기준으로 테이블을 연결해서 한 테이블처럼 보는 것을 의미
☞예시) orders 테이블에 users 테이블 연결해보기
select * from orders o
inner join users u
on o.user_id = u.user_id;
☞예시) checkins 테이블에 users 테이블 연결해보기
select * from checkins c
inner join users u
on c.user_id = u.user_id;
☞예시) enrolleds 테이블에 courses 테이블 연결해보기
select * from enrolleds e
inner join courses c
on e.course_id = c.course_id;
* inner join : 교집합

* Left join : 첫번째 원

● Subquery : 쿼리 안의 쿼리라는 의미
⊙ Where 절에 들어가는 Subquery
⊙ Select 절에 들어가는 Subquery
⊙ From 절에 들어가는 Subquery
⊙ Where 절에 들어가는 Subquery
☞예시) 전체 유저의 포인트의 평균보다 큰 유저들의 데이터 추출
select * from point_users pu
where pu.point > (select avg(pu2.point) from point_users pu2);

⊙ Where 절에 들어가는 Subquery
☞예시) 이씨 성을 가진 유저의 포인트의 평균보다 큰 유저들의 데이터 추출
select * from point_users pu
where pu.point >
(select avg(pu2.point) from point_users pu2
inner join users u
on pu2.user_id = u.user_id
where u.name = "이**");

⊙Select 절에 들어가는 Subquery 연습해보기
☞예시) checkins 테이블에 course_id별 평균 likes수 필드 우측에 붙여보기
select checkin_id, course_id, user_id, likes,
(select avg(c2.likes) from checkins c2
where c.course_id = c2.course_id)
from checkins c;

⊙Select 절에 들어가는 Subquery 연습해보기
☞예시) checkins 테이블에 과목명별 평균 likes수 필드 우측에 붙여보기
select checkin_id, c3.title, user_id, likes,
(select round(avg(c2.likes),1) from checkins c2
where c.course_id = c2.course_id) as course_avg
from checkins c
inner join courses c3
on c.course_id = c3.course_id;

⊙ From 절에 들어가는 Subquery 연습해보기
☞예시) course_id별 like 개수에 전체 인원을 붙이기
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

● with 절 : 더 깔끔하게 쿼리문을 정리하기
☞ 예시 : 코스제목별 like 개수, 전체, 비율
밑 코드처럼 계속 서브쿼리가 붙으면, inner join 안쪽이 너무 헷갈린다 |
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 |
With 절 적용 |
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 |
With 절 입력 후 결과값도 같고 보기엔 더 깔끔해졌다. |
'스파르타코딩클럽 > [왕초보] 엑셀보다 쉬운, SQL' 카테고리의 다른 글
[내일배움단] 엑셀보다 쉬운 SQL - 3주차 (0) | 2023.01.22 |
---|---|
[내일배움단] 엑셀보다 쉬운 SQL - 2주차 (0) | 2023.01.22 |
[내일배움단] 엑셀보다 쉬운 SQL - 1주차 (0) | 2023.01.22 |