표준 SQL 함수 정리
표준 SQL 함수와 관련 개념
표준 SQL 함수 정리
집계 함수
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| COUNT() | 행 개수 계산 | COUNT(*), COUNT(DISTINCT column) |
| SUM() | 숫자 합계 | SUM(column) |
| AVG() | 숫자 평균 | AVG(column) |
| MIN() | 최솟값 | MIN(column) |
| MAX() | 최댓값 | MAX(column) |
NULL 처리 함수
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| COALESCE() | NULL 값 대체 (첫 번째 non-NULL 값 반환) | COALESCE(column, default) |
| NULLIF() | 두 값이 같으면 NULL, 다르면 첫 번째 값 반환 | NULLIF(col1, col2) |
조건문
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| CASE | 조건부 로직 처리 | CASE WHEN condition THEN value1 ELSE value2 END |
조인과 서브쿼리
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| INNER JOIN | 일치하는 행 결합 | SELECT a.col FROM table1 a INNER JOIN table2 b ON a.id = b.id |
| LEFT JOIN | 왼쪽 테이블의 모든 행 포함 | SELECT a.col FROM table1 a LEFT JOIN table2 b ON a.id = b.id |
| RIGHT JOIN | 오른쪽 테이블의 모든 행 포함 | SELECT a.col FROM table1 a RIGHT JOIN table2 b ON a.id = b.id |
| CROSS JOIN | 모든 행 조합 (카티션 곱) | SELECT a.col, b.col FROM table1 a CROSS JOIN table2 b |
| EXISTS | 서브쿼리로 존재 여부 확인 | WHERE EXISTS (SELECT 1 FROM table2 WHERE col = table1.col) |
| IN | 서브쿼리로 존재 여부 확인 | WHERE column IN (SELECT col FROM table2) |
윈도우 함수 목록
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| RANK() | 동일 값에 같은 순위 부여, 다음 순위 건너뜀 (예: 1, 1, 3) | RANK() OVER (PARTITION BY column ORDER BY column) |
| DENSE_RANK() | 동일 값에 같은 순위 부여, 다음 순위 연속 (예: 1, 1, 2) | DENSE_RANK() OVER (PARTITION BY column ORDER BY column) |
| ROW_NUMBER() | 동일 값에도 고유 순위 부여 (예: 1, 2, 3) | ROW_NUMBER() OVER (PARTITION BY column ORDER BY column) |
| LEAD() | 다음 특정 행 값 가져오기 | - 기본(다음 1행): LEAD(column) OVER (PARTITION BY column ORDER BY column)- 다음 3행: LEAD(column, 3) OVER (PARTITION BY column ORDER BY column) |
| LAG() | 이전 특정 행 값 가져오기 | - 기본(이전 1행): LAG(column) OVER (PARTITION BY column ORDER BY column)- 이전 3행: LAG(column, 3) OVER (PARTITION BY column ORDER BY column) |
| FIRST_VALUE() | 파티션 내 첫 번째 값 | FIRST_VALUE(column) OVER (PARTITION BY column ORDER BY column) |
| LAST_VALUE() | 파티션 내 마지막 값 (⚠️ 프레임 지정 필요) | LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) |
| NTH_VALUE() | 파티션 내 특정 번째 행 값 가져오기 | - 두 번째 행: NTH_VALUE(column, 2) OVER (PARTITION BY column ORDER BY column) |
| SUM() | 파티션 내 누적/집계 계산 | SUM(column) OVER (PARTITION BY column ORDER BY column) |
| COUNT() | 파티션 내 누적/집계 계산 | COUNT(column) OVER (PARTITION BY column ORDER BY column) |
| AVG() | 파티션 내 누적/집계 계산 | AVG(column) OVER (PARTITION BY column ORDER BY column) |
문자열 함수
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| CONCAT() | 문자열 결합 | CONCAT(col1, col2) |
| SUBSTRING() | 문자열 일부 추출 | SUBSTRING(column FROM 1 FOR 3) |
| TRIM() | 문자열 공백 제거 | TRIM(BOTH FROM column) |
| LTRIM() | 문자열 왼쪽 공백 제거 | LTRIM(column) |
| RTRIM() | 문자열 오른쪽 공백 제거 | RTRIM(column) |
| STRING_AGG() | - 문자열을 지정한 구분자로 결합 - 정렬 및 중복 제거 가능 | - 기본: STRING_AGG(column, ',')- 정렬: STRING_AGG(column, ',' ORDER BY column)- 중복 제거: STRING_AGG(DISTINCT column, ',' ORDER BY column) |
날짜/시간 함수
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| EXTRACT() | 날짜/시간에서 연도, 월 등 추출 | EXTRACT(YEAR FROM date_column) |
| INTERVAL | 날짜/시간 간격 처리 | date_column + INTERVAL '1 day' |
수학 함수
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| CEIL() | 숫자 올림 | CEIL(value) |
| FLOOR() | 숫자 내림 | FLOOR(value) |
| MOD() | 나머지 연산 | MOD(dividend, divisor) |
타입 변환 및 기타 함수
| 함수 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| ROUND() | 숫자 반올림 | ROUND(value, 2) |
| CAST() | 데이터 타입 변환 | CAST(column AS TEXT) |
집합 연산
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| UNION | 두 결과 집합 결합 (중복 제거) | SELECT col FROM table1 UNION SELECT col FROM table2 |
| UNION ALL | 두 결과 집합 결합 (중복 포함) | SELECT col FROM table1 UNION ALL SELECT col FROM table2 |
| INTERSECT | 두 결과 집합의 교집합 | SELECT col FROM table1 INTERSECT SELECT col FROM table2 |
| EXCEPT | 첫 결과 집합에서 두 번째 집합 제외 | SELECT col FROM table1 EXCEPT SELECT col FROM table2 |
논리 연산 및 서브쿼리 확장
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| AND | 논리곱 연산 | WHERE col1 > 0 AND col2 IS NOT NULL |
| OR | 논리합 연산 | WHERE col1 > 0 OR col2 IS NOT NULL |
| NOT | 논리 부정 연산 | WHERE NOT (col1 > 0) |
| ANY | 서브쿼리 값 중 하나라도 조건 만족 시 TRUE | WHERE column > ANY (SELECT value FROM table) |
| ALL | 서브쿼리 모든 값이 조건 만족 시 TRUE | WHERE column > ALL (SELECT value FROM table) |
필수 개념
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| 서브쿼리와 CTE | 복잡한 로직 단계별 분리 | WITH cte AS (SELECT ...) SELECT FROM cte |
| WITH RECURSIVE | 재귀 쿼리로 계층 구조 처리 | WITH RECURSIVE cte AS (<br>SELECT id FROM table WHERE parent_id IS NULL<br>UNION ALL<br>SELECT t.id FROM table t JOIN cte c ON t.parent_id = c.id<br>) SELECT * FROM cte |
윈도우 함수 문법
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| Window Functions | 행 집합에 대해 계산 수행 | SUM() OVER(), AVG() OVER() |
| OVER clause | 윈도우 범위 정의 | OVER (PARTITION BY column ORDER BY column) |
| PARTITION BY | 윈도우 그룹화 | PARTITION BY user_id |
| ORDER BY (윈도우 내) | 프레임 정렬 기준 | ORDER BY date |
프레임 지정
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| ROWS BETWEEN | 물리적 행 기반 프레임 범위 지정 | ROWS BETWEEN 6 PRECEDING AND CURRENT ROW |
| RANGE BETWEEN | 논리적 값 기반 프레임 범위 | RANGE BETWEEN INTERVAL '6' DAY PRECEDING AND CURRENT ROW |
| PRECEDING | 현재 행 이전 범위 | 6 PRECEDING |
| FOLLOWING | 현재 행 이후 범위 | 6 FOLLOWING |
| CURRENT ROW | 현재 행 | CURRENT ROW |
| UNBOUNDED PRECEDING | 파티션 시작까지 무제한 | ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW |
| UNBOUNDED FOLLOWING | 파티션 끝까지 무제한 | ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING |
윈도우 함수 응용 패턴
| 개념 | 설명 | 사용법 예시 (PostgreSQL) |
|---|---|---|
| Running Total | 누적 합계 | SUM(column) OVER (ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) |
| Moving Average | 이동 평균 | AVG(column) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) |
| Rolling Sum | 이동 합계 | SUM(column) OVER (ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) |
This post is licensed under CC BY 4.0 by the author.