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분
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)