본문 바로가기

스파르타코딩클럽/[왕초보] 엑셀보다 쉬운, SQL

[내일배움단] 엑셀보다 쉬운 SQL - 4주차

반응형
SMALL

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;

Limit 입력 결과 5개만 출력



● Distinct : 중복 데이터는 제외하고 가져오기

   ☞예시) 고객이 사용한 결제수단

select distinct(payment_method) from orders;

 

Distinct 입력 결과 4개의 결제수단이 나옴



● Count : 몇 개인지 숫자 세보기

  ☞예시) orders 테이블에 데이터가 몇 개 들어있는지

select count(*) from orders

 

Count 입력 결과 286나옴



● 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;

checkins 테이블에 course_id별 평균 likes수 필드 우측에 붙여보기

 

더보기

⊙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;

checkins 테이블에 과목명별 평균 likes수 필드 우측에 붙여보기

 

더보기

 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

course_id별 like 개수에 전체 인원을 붙이기

 



 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 절 입력 후 결과값도 같고 보기엔 더 깔끔해졌다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
LIST