그룹 A — "입력을 넣으면 출력이 어떻게 나오나?" (모양으로 구분)
→ Scalar, Aggregate, Window, Table
그룹 B — "누가 만들고, 어디서 도는가?" (출처로 구분)
→ System, User-defined, External
이 4개는 "행(row)이 들어가고 나올 때 개수가 어떻게 변하나"로 외우면 됩니다.
가장 단순합니다. 한 줄 넣으면 한 값이 나옵니다.
📖 공식 정의: 스칼라 함수는 한 번 호출할 때 하나의 값을 반환하는 함수이며, 대부분 행(row)당 하나의 값을 반환하는 데 사용됩니다.
🔵 비유: 자판기. 동전 1개 넣으면 음료 1개 나옴.
SELECT UUID_STRING();
-- 결과: d29d4bfa-40cb-4159-9186-e10f5d59f031 (값 하나)
여러 행을 하나로 뭉쳐서(collapse) 결과 1개를 냅니다. 합계, 평균, 최댓값 같은 거죠.
📖 공식 정의: 스칼라 함수가 입력 행마다 출력 행 하나를 반환하는 반면, 집계 함수는 여러 입력 행에 대해 출력 행 하나를 반환합니다.
🔵 비유: 믹서기. 과일 여러 개 → 주스 한 잔.
-- 3개 행을 넣어도
SELECT MAX(AMOUNT) FROM ACCOUNT;
-- 결과: 67.78 (제일 큰 값 하나만)
집계랑 비슷한데 결정적 차이가 있습니다. Aggregate는 행을 뭉개버리지만, Window는 행을 그대로 두고 옆에 계산 결과를 붙여줍니다.
📖 공식 정의: SUM 집계 함수가 모든 입력 행에 대해 단일 합계 값을 반환하는 반면, 윈도우 함수는 여러 개의 결과를 반환합니다 — 각 행(현재 행)마다 하나씩, 파티션 내 다른 행들과 비교해서요.
강의 자료 보충: Window는 Aggregate의 하위 집합(subset)이며, 행의 일부(subset)에 대해 집계합니다.
🔵 비유: 반 친구들 키를 줄세우면서, 각자 옆에 "우리 반 최고 키"를 적어주는 것. 친구들이 사라지지 않음.
SELECT ACCOUNT_ID, AMOUNT, MAX(AMOUNT) OVER (PARTITION BY ACCOUNT_ID) FROM ACCOUNT;
| ACCOUNT_ID | AMOUNT | MAX(AMOUNT) |
|---|---|---|
| 001 | 10.00 | 23.78 |
| 001 | 23.78 | 23.78 |
| 002 | 67.78 | 67.78 |
→ 행 3개가 그대로 살아있고, 그룹별 최댓값이 옆에 붙음. (OVER 키워드가 윈도우의 표시!)
⭐ 함정: "Aggregate vs Window 차이?"
→ Aggregate = 행 합쳐짐 / Window = 행 그대로 +OVER(PARTITION BY)로 옆에 붙음
스칼라의 반대 느낌. 한 입력에서 여러 행이 나옵니다.
📖 공식 정의: 테이블이 행의 집합을 담듯, 테이블 함수도 행의 집합을 반환합니다. 테이블 함수는 SQL 문의 FROM 절에서 사용됩니다.
SQL 컴파일러가 테이블 함수를 행의 소스로 인식하도록, 테이블 함수 호출은 반드시 TABLE() 키워드로 감싸야 합니다.
강의 자료: 반환 집합은 0개, 1개, 또는 여러 행을 포함할 수 있고, 각 행은 1개 이상의 컬럼을 가질 수 있습니다.
🔵 비유: 씨앗 1개 심으면 → 열매 여러 개 열림.
SELECT RANDSTR(5, RANDOM()), RANDOM() FROM TABLE(GENERATOR(ROWCOUNT => 3));
-- 결과: 행 3개가 생성됨 (My4FU / YiPSS / cu2Hw ...)
⭐ 포인트: Table 함수는
FROM절에 쓰이고,TABLE()로 감싼다는 점!
| 함수 | 입력 → 출력 | 비유 |
|---|---|---|
| Scalar | 1행 → 1값 | 자판기 (동전 1 → 음료 1) |
| Aggregate | 여러 행 → 1값 | 믹서기 (과일들 → 주스 1잔) |
| Window | 여러 행 → 행마다 값 (행 유지) | 키 순서 옆에 "반 최고 키" 적기 |
| Table | 1행 → 여러 행 | 씨앗 1개 → 열매 여러 개 |
DB를 조작하거나 상태를 물어볼 때 쓰는 함수. 이름이 system$...로 시작합니다. 강의 자료 기준 3가지 용도:
| 용도 | 예시 함수 | 하는 일 |
|---|---|---|
| ① 액션 실행 | system$cancel_query(...) | 돌아가는 쿼리 강제 종료 |
| ② 시스템 정보 | system$pipe_status('my_pipe') | 파이프 상태 조회 (RUNNING 등) |
| ③ 쿼리 정보 | system$explain_plan_json(...) | 쿼리 실행 계획 조회 |
🔵 비유: 건물 관리사무소. "공조기 꺼주세요(실행)", "엘리베이터 상태 알려주세요(정보)".
💡 암기: 실행 / 시스템 상태 / 쿼리 정보 3종 세트. 전부
system$접두사.
기본 제공 함수로 안 되면 직접 만들어 쓰는 함수입니다.
🔵 비유: 시중에 없는 레시피라 직접 만든 나만의 요리.
반환 형태에 따라 두 종류:
CREATE OR REPLACE FUNCTION addone(i INT)
RETURNS INT LANGUAGE PYTHON RUNTIME_VERSION = '3.12'
HANDLER = 'addone_py'
AS $$
def addone_py(i):
return i+1
$$;
Snowflake 외부의 원격 코드(예: AWS Lambda)를 호출하는 함수입니다. 핵심은 직접 부르지 않는다는 점!
📖 공식 정의: Snowflake는 원격 서비스를 직접 호출하지 않습니다. 대신 클라우드 제공자의 네이티브 HTTPS 프록시 서비스(예: AWS의 API Gateway)를 통해 원격 서비스를 호출합니다.
Snowflake는 스칼라 외부 함수를 지원하며, 원격 서비스는 받은 각 행마다 정확히 하나의 행을 반환해야 합니다.
외부 함수는 (현재) window 함수를 지원하지 않습니다.
🔵 비유: 음식 배달. 내가 식당(원격 서비스)에 직접 안 가고, 배달앱(API Gateway 프록시)을 거쳐서 주문.
⭐ 포인트: External function = API integration 필요 + HTTPS 프록시(API Gateway) 경유 + Snowflake가 직접 호출 안 함.
| 함수 | 한 줄 정리 | 핵심 키워드 |
|---|---|---|
| Scalar | 1 → 1 | 행마다 값 하나 |
| Aggregate | 여러 개 → 1 (합쳐짐) | SUM/MAX, 행 collapse |
| Window | 여러 개 보고 → 행마다 값 (행 유지) | OVER (PARTITION BY) |
| Table | 1 → 여러 행 | FROM TABLE(...) |
| System | DB 조작/상태 조회 | system$ 접두사 |
| UDF | 내가 만든 함수 | Scalar UDF / UDTF |
| External | 외부 서비스 호출 | API integration, 프록시 경유 |
🔑 헷갈리면 이 두 문장만:
1. "Aggregate는 행을 뭉치고, Window는 행을 살린다(OVER)"
2. "External은 직접 안 부르고 API Gateway를 거친다"