SQL 레벨 별(Lv 1~5) 핵심 문법
- SQL 역량을 레벨로 정의해봤습니다. 업무를 하고, 학생들을 가르치면서 느낀 레벨을 정리했어요
- 주관적으로 정의했으며, DB는 BigQuery 기준으로 작성했습니다.
- 요즘 데이터 웨어하우스쪽은 문법이 유사해서 키워드만 가지고 가셔도 좋을 것 같습니다
- 키워드 : SQL 필수 문법, BigQuery 문법, SQL 레벨 별 핵심 문법
SQL 문법 레벨별 핵심 체크리스트
SQL 기본 형태
- SQL의 기본 형태는 다음과 같음(하나의 테이블을 사용할 경우)
SELECT
col1,
col2
FROM
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
SQL 문법(Lv 1)
- 제일 기본적인 개념
SELECT : 컬럼 선택, FROM : 테이블 지정
- 특정 테이블에 있는 컬럼을 확인
- AS를 사용해서 Alias(별칭)을 정의할 수 있음
SELECT
col,
col2 AS new_col
FROM Table
WHERE : 테이블의 컬럼에 조건 설정
- 테이블에 존재하는 컬럼에 조건을 설정하고 싶은 경우 사용
- 데이터에서 특정 조건을 충족하는 Row를 가지고 오고 싶은 경우 사용
SELECT
col,
col2 AS new_col
FROM Table
WHERE
col2 = 3
GROUP BY : 집계할 기준 명시
- 데이터를 특정 그룹으로 묶어서(집계) 쓰고 싶을 때 사용
- GROUP BY에 그룹화할 컬럼을 명시하고, SELECT에도 명시를 해줘야 함
SELECT
type1,
type2,
COUNT(*) AS cnt
FROM Table
GROUP BY
type1,
type2
- BigQuery에서는
GROUP BY ALL
을 사용하면 알아서 집계할 컬럼을 추론해서 실행함
COUNT(col) : col 개수 세기, DISTINCT : 고유값 추출(중복 제거)
- COUNT(*) : 컬럼의 Row 수를 센다. Row는 값이 NULL이여도 센다
- COUNT(컬럼) : 컬럼의 값의 수를 센다. 값이 NULL이면 세지 않는다
- COUNT(DISTINCT 컬럼) : 컬럼의 값의 고유값(중복 제외한 값)을 센다
SELECT
type1,
type2,
COUNT(*) AS cnt1,
COUNT(id) AS cnt2,
COUNT(DISTINCT id) AS cnt3
FROM Table
GROUP BY
type1,
type2
AVG, MAX, MIN
- 평균, 최대값, 최소값
HAVING : 집계 후 컬럼에 조건 설정
- GROUP BY와 같이 사용됨
- GROUP BY 후에 조건을 설정하고 싶은 경우 사용
- (비교) WHERE : 테이블의 컬럼에 조건 설정, HAVING은 GROUP BY 후에 조건 설정
SELECT
type1,
type2,
COUNT(*) AS cnt
FROM Table
GROUP BY
type1,
type2
HAVING cnt >=3
ORDER BY: 정렬
- 데이터를 정렬하고 싶은 경우 사용
- 쿼리의 중간에 사용하지 않고 쿼리 제일 바깥(마지막) 쿼리에 실행하는 것이 좋음
- ORDER BY는 모든 데이터를 다 확인해서 정렬을 하기 때문에 시간이 소요됨
- ASC(오름차순), DESC(내림차순)
SELECT
type1,
type2,
COUNT(*) AS cnt
FROM Table
GROUP BY
type1,
type2
HAVING cnt >=3
ORDER BY cnt DESC
LIMIT : 출력할 개수 제한
- 출력할 개수 제한하고 싶을 때 사용
SELECT
type1,
type2,
COUNT(*) AS cnt
FROM Table
GROUP BY
type1,
type2
HAVING cnt >=3
ORDER BY cnt DESC
LIMIT 3
SQL 문법(Lv 2)
조건문(CASE WHEN, IF)
- 조건을 설정하고 싶은 경우
- 다중 조건은 CASE WHEN 추천
SELECT
CASE
WHEN 조건1 THEN 결과1
WHEN 조건2 THEN 결과2
ELSE 모두아닐때
END AS case_result
FROM Table
SELECT
IF(조건, 조건이 참일 때 값, 조건이 거짓일 때 값) AS if_result
FROM Table
시간 데이터 다루기
- 시간, 월 추출
- 특정 일자 기준으로 버리기
- TIMESTAMP, DATETIME 개념
- UTC 개념도 알면 좋음
- BigQuery 기준으로 설명
SELECT
EXTRACT(HOUR FROM datetime_col) AS hour
FROM Table
JOIN : 여러 테이블을 연결할 때 사용
- INNER, LEFT, RIGHT, CROSS JOIN
- ON 사용해서 공통 Key 연결
SELECT
lt.id,
lt.col1,
rt.col4
FROM left_table AS lt
LEFT JOIN right_table AS rt
ON lt.id = rt.id
SQL 문법(Lv 3)
윈도우 함수
- 코딩 테스트에서 자주 출제되는 유형
- 이전/이후 : LAG/LEAD
- 처음, 마지막 값 : FIRST_VALUE, LAST_VALUE
- 순서 확인 : ROW_NUMBER, RANK, DENSE_RANK
- 윈도우 함수 문법
- 함수(컬럼) OVER(PARTITION BY 파티션컬럼 ORDER BY 정렬컬럼)
SELECT
LAG(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS prev_event_time,
FIRST_VALUE(event_time) OVER (PARTITION BY user_id ORDER BY event_time) AS first_event_time
FROM Table
SELECT
DENSE_RANK() OVER (PARTITION BY team ORDER BY cnt) AS rank
FROM Table
WITH문(CTE)
- 쿼리를 잘 정리하고 싶을 때 사용
- 서브쿼리를 작성하고 정리할 때 자주 사용함
WITH cte AS (...
SELECT
col2, col3
FROM Table
)
SELECT
*
FROM cte
SQL 문법(Lv 4)
윈도우 함수(Frame 조절)
- AVG, SUM 함수와 함께 Frame 조절
- 이동 평균 구할 때 활용
- 함수(컬럼) OVER(PARTITION BY 파티션컬럼 ORDER BY 정렬컬럼 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
- CURRENT ROW : 현재 ROW
- UNBOUNDED : 끝까지
- PRECEDING : 이전
- FOLLOWING 이후
- 윈도우 함수의 ORDER BY 뒤에 쓰면 됨
SELECT
SUM(value) OVER (PARTITION BY user_id ORDER BY order_date) AS cumulative_sum
FROM table
ARRAY, STRUCT
- 배열, 구조체 데이터를 다룰 때 사용
- GA4, Firebase 데이터 다룰 때 필수
- PostgreSQL, BigQuery, Apache Spark 등에 존재하며 문법이 다양함
GROUP BY GROUPING SETS/ROLLUP/CUBE
- GROUP BY의 확장판
- 집계를 더 편하게 할 수 있음
- 아래 쿼리는 category, region 별 집계 + region 별 집계 + 전체 집계
SELECT
category,
region,
SUM(sales_amount) AS total_sales,
COUNT(*) AS transaction_count
FROM sales
GROUP BY GROUPING SETS (
(category, region),
(region),
()
)
SQL 문법(Lv 5)
JSON
- JSON 형태에서 데이터 추출
- JSON_QUERY, JSON_VALUE
- DB마다 문법 다양함
정규표현식
- 텍스트 데이터에서 데이터 추출
- REGEXP_CONTAINS
- DB마다 문법 다양함
UDF(Used Defined Function)
- 사용자 정의 함수
- 파이썬에서 함수 쓰는 것처럼 정의해서 쓸 수 있음
- DB마다 문법 다양함
- 글 작성하는데 걸린 시간 : 23분
카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.