ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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;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월부터 코로나 이후 매출이 증가 혹은 줄어든 카테고리는 어딘지 등

     

Designed by Tistory.