SQL

SQL 02 - 기본 문법 (1) (SELECT/WHERE/GROUP BY/HAVING/ORDER BY)

H-V 2022. 3. 8. 11:25

패스트 캠퍼스 '한번에 끝내는 데이터 분석 초격차 패키지 Online' 강의 참조

 

 

 

 

 

01 거래 데이터를 이용한 기본 문법

  • 아래 'gmv_trend'는 KOSIS 웹사이트를 통해 다운 받은 데이터

  • 이 데이터를 통해 기본문법을 수행해 보자!
-- 1. 모든 컬럼 추출하기 ('*' -> 모두)
select * from gmv_trend 

-- 2. 특정 컬럼 추출하기 (원하는 컬럼'명'을 적으면 됨)
select category, yyyy, mm from gmv_trend

-- 3. 중복값 없이 특정 컬럼 추출 ('distinct' -> 중복값 없앰)
select distinct category from gmv_trend 

select distinct yyyy, mm from gmv_trend
-- 2) 특정 연도의 매출 탐색
-- 1-1. 조건이 하나일 때
----- 숫자열 : 'between /  대소비교', 연산자 써서 조건식 맞춤
-- 조건절은 일단 'where'로 시작, 그리고 컬럼 + 조건
select * from gmv_trend gt 
where yyyy = 2021

select * from gmv_trend gt 
where yyyy >= 2019

-- between + and 로 특정 조건들 사이의 값만 들고 올 수 있음
select * from gmv_trend gt 
where yyyy between 2018 and 2020

select * from gmv_trend gt 
where yyyy != 2019

----- 문자열 : 연산자 / like, in, not in 
-- 하나의 조건은 연산자, 두개 이상의 조건은 in
select * from gmv_trend gt 
where category = '화장품'

select * from gmv_trend gt
where category in ('화장품', '가방')

select * from gmv_trend gt
where category not in ('화장품', '가방')

-- like : 특정 단어가 들어간 컬럼을 거를 수 있음
-- '%--%' : %%사이의 특정 단어가 들어간것 다 들고 옴
-- '--%, %--' 특정단어로 시작하는것들, 뒤에가 특정단어로 끝나는것들 다 들고 옴
select * from gmv_trend gt 
where category like '%패션%'


-- 1-2. 조건이 여러개 일때
-- and(모든 조건 성립시) / or(하나만이라도 성립시) / and+or : 괄호가 필요
select * from gmv_trend gt 
where category = '화장품'
and yyyy = 2021

select * from gmv_trend gt 
where gmv > 1000000 or gmv < 10000

select * from gmv_trend gt 
where (gmv > 1000000 or gmv < 10000)
and yyyy = 2021

 

  • 'GROUP BY'
-- 3) 카테고리별 매출 분석 (groupby, 집계함수)
-- 1. 카테고리별, 연도별 매출
--> gmv 테이블에서 카테고리/연도별을 뽑는데 gmv는 sum을 하고
--> group by 를 하고자하는 컬럼을 그대로 넣는다 
select category, yyyy, sum(gmv)
from gmv_trend gt 
group by category, yyyy


* select category, yyyy, sum(gmv) as total_gmv
from gmv_trend gt 
group by category, yyyy

* select category, yyyy, sum(gmv) as total_gmv
from gmv_trend gt 
group by 1, 2

여기서 sum(gmv)의 컬럼명이 바뀌게 나오는데 설정도 가능 하다.&amp;amp;nbsp;

  • 'group by' 절은 반드시 그룹 함수와 함께 쓰이며 그룹 함수와 컬럼명이 같이 기술된 경우 해당 컬럼은 반드시 'group by'절에 그룹화 되어야 한다.
  • 'as'를 써서 컬럼명들을 자기가 원하는데로 바꿔서 출력이 가능하다 ('as'는 생략이 가능)
  • 'group by'에 들어가는 컬럼명은 타이핑을 일일히 안쳐도 되고 'select'에서 나온 순서의 번호대로 지정 가능. 실무에서는 'group by'를 숫자로 표현을 함 그 이유는 'select'절에 들어오는 컬럼명이 바뀌어도 번호로 받기때문에 일일히 타이핑을 안해도 됨
-- 카테고리별 총 합계
select category, sum(gmv) as total
from gmv_trend gt 
group by 1

-- 화장품 2017년 총합
select category, yyyy, sum(gmv) as total 
from gmv_trend gt where category = '화장품' and yyyy = 2017
group by 1, 2

-- 카테고리별 플래폼 모바일의 2019년 총합
select category, yyyy, platform_type, sum(gmv) as total 
from gmv_trend gt  where platform_type = 'mobile' and yyyy = 2019
group by 1,2,3

-- 2018년 카테고리별 평균 금액
select category, yyyy, round(avg(gmv), 0) as average
from gmv_trend gt where yyyy = 2018
group by 1, 2

-- 전체 총합
select sum(gmv) as gmv from gmv_trend gt

 

 

  • 'HAVING' - 집계 결과에 필터를 걸 수 있음
-- HAVING - 집계 결과에 필터를 걸 수 있음
select category, sum(gmv) as gmv
from gmv_trend gt
where yyyy = 2020
group by 1
having sum(gmv) >= 10000000
  • 'WHERE' VS 'HAVING' → 간단히 말해 WHERE은 집계 전 데이터를 필터링, HAVING은 집계 후 데이터를 필터링
  • 즉 WHERE절에는 집계함수가 올 수 없고, HAVING에는 집계함수만 올 수 있다

 

 

  • ORDER BY - 정렬
-- ORDER BY - 정렬, DESC - 내림차순, 
select * from gmv_trend gt order by yyyy

select * from gmv_trend gt order by category, yyyy, mm

-- 매출액이 높은순으로 카레고리 정렬
select category, sum(gmv) as total
from gmv_trend gt 
group by 1 order by total DESC

-- 두번째 컬럼의 정렬 방법 설정
select category , yyyy , sum(gmv) as gmv 
from gmv_trend gt group by 1,2
order by 1, 2 DESC

* select category , yyyy , sum(gmv) as gmv 
from gmv_trend gt group by 1,2
order by 1 DESC, 2 DESC
  • ORDER BY 를 통해 정렬이 바로 가능하고 DESC(내림차순), ASC(오름차순)을 고를 수 있다
  • 정렬시에 ORDER BY 1, 2을 하고 원하는 컬럼 바로 뒤에 차순을 설정하면 그 컬럼에 차순이 적용되어 출력 된다
  • ORDER BY 도 컬럼명 대신에 번호로 대체 가능
  • GROUP BY, ORDER BY 는 SELECT에 있는 절들만 불러 올 수 있다

 

 

▶ SQL의 실행 순서

  • 정리를 하자면 기본적으로 데이터를 가져오고 싶을때 가장 먼저 해야하는것은 어떤 데이터를 가져올것이냐이다 즉 컬럼명 'SELECT'가 필요하다
  • 그 다음 그 컬럼이 어디 테이블에 있는지 명시해줘야 한다 'FROM 테이블명'
  • 그 이후 WHERE을 통해 양을 줄여줘야 하고
  • 그 다음 그룹핑을 통해 조금 더 명확히 표시하고
  • 그 뒤에 HAVING을 통해 그룹핑에 있는것들만 들고 오고 
  • 최종적으로 그 값들로 정렬을 하는 것
  • LIMIT은 실제 현업에 들어가면 행과 열이 엄청나게 많다. 그래서 데이터 양을 줄임과 동시에 속도를 위한 문법

 

 

 

02 각 문법 주의 사항

1. SELECT

  • 띄어쓰기, 숫자로 시작하는 단어, 특수문자는 쓸 수 없고, 큰 따옴표로 감싸주면 가능하다. 

2. WHERE

  • 집계 전 데이터를 필터링하고 집계함수는 쓸 수 없다.
  • 긍정과 부정의 연산자를 구분 할 줄 알아야 한다.

  • 또한 WHERE절에 AND/OR을 같이 쓸 경우 반드시 '()'로 의미 단위끼리 묶어줘야 한다.

3. GROUP BY

  • SELECT절에 등장한 컬럼이 GROUP BY에 모두 명시되지 않은 경우 오류가 나므로 주의 (집계함수 제외)

4. HAVING 

  • 집계 후 데이터를 필터링 한다. 또한 집계함수만 올 수 있다. 

 

 

▶ 실제 매출 데이터의 구성은?

▶ 어떤 데이터를 추출 할 수 있을까?

  • 월별 총 매출액, 연간 매출액, 어느 해가 가장 크게 성장하였는가? 카테고리별 년 매출액 등등
  • 다른 툴과 연계해서 심화분석 가능 → 데이터를 추출하여 시각화를 통해 2021년 2월부터 코로나 이후 매출이 증가 혹은 줄어든 카테고리는 어딘지 등