-
SQL 02 - 기본 문법 (1) (SELECT/WHERE/GROUP BY/HAVING/ORDER BY)SQL 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;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월부터 코로나 이후 매출이 증가 혹은 줄어든 카테고리는 어딘지 등
'SQL' 카테고리의 다른 글
SQL 04 - SQL 조금 더 깊게 보기 (0) 2022.03.09 SQL 03 - 기본 문법 (2) (JOIN) (0) 2022.03.08 SQL 01 - 설치 (0) 2022.03.07 MySQL 다시보기 04 - 중첩쿼리/ON DELETE/TRIGGER/ERD (0) 2021.10.04 MySQL 다시보기 03 - SELECT/FUNCTION/UNION/JOIN (0) 2021.10.04