SQL 조인 및 윈도우 함수
Source: Dev.to
소개
SQL 조인은 공통 식별자(예: 외래 키)를 사용하여 두 개 이상의 테이블을 결합할 수 있게 해줍니다. 정규화 때문에 단일 테이블에 필요한 모든 열이 없을 수 있으므로, 조인은 테이블 간에 데이터를 “전송”하여 결과 집합에 두 테이블의 열을 포함할 수 있게 합니다.
샘플 테이블 (예시용)
학생 테이블
| student_id | name | course_id |
|---|---|---|
| 1 | Willis Kip | 001 |
| 2 | Edwin Sifuna | 002 |
| 3 | Tonny Oti | NULL |
강좌 테이블
| course_id | course_name |
|---|---|
| 001 | Botany |
| 002 | Political_sci |
| 004 | English |
Source: …
SQL 조인의 종류
1️⃣ INNER JOIN
두 테이블 모두에 존재하는 행만 반환합니다.

SELECT name, course_name
FROM Student
INNER JOIN Course
ON Student.course_id = Course.course_id;
Output
| 이름 | 과목명 |
|---|---|
| Willis Kip | Botany |
| Edwin Sifuna | Political_sci |
2️⃣ LEFT JOIN
왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행을 반환합니다.

SELECT name, course_name
FROM Student
LEFT JOIN Course
ON Student.course_id = Course.course_id;
Output
| 이름 | 과목명 |
|---|---|
| Willis Kip | Botany |
| Edwin Sifuna | Political_sci |
| Tonny Oti | NULL |
3️⃣ RIGHT JOIN
오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 행을 반환합니다.

SELECT name, course_name
FROM Student
RIGHT JOIN Course
ON Student.course_id = Course.course_id;
Output
| 이름 | 과목명 |
|---|---|
| Willis Kip | Botany |
| Edwin Sifuna | Political_sci |
| NULL | English |
4️⃣ FULL JOIN
두 테이블의 모든 행을 반환하고, 가능한 경우 일치시킵니다.

SELECT name, course_name
FROM Student
FULL JOIN Course
ON Student.course_id = Course.course_id;
Output
| 이름 | 과목명 |
|---|---|
| Willis Kip | Botany |
| Edwin Sifuna | Political_sci |
| Tonny Oti | NULL |
| NULL | English |
윈도우 함수
윈도우 함수는 OVER () 절로 정의된 특정 행 집합(“윈도우”)에 걸쳐 계산을 수행합니다. 전통적인 집계 함수가 행들을 하나의 결과로 압축하는 것과 달리, 윈도우 함수는 정의된 윈도우 내의 다른 행에 접근하면서도 각 행마다 값을 반환합니다.
구문
SELECT column_1,
column_2,
function() OVER (
PARTITION BY partition_expression
ORDER BY order_expression
) AS output_column_name
FROM table_name;
설명
| 구성 요소 | 설명 |
|---|---|
SELECT | 결과 집합에 포함시키려는 열을 나열합니다. |
function() | 적용하려는 윈도우 함수(예: ROW_NUMBER(), AVG()). |
OVER() | 함수가 작동할 윈도우를 정의합니다. |
PARTITION BY | 행을 파티션으로 나눕니다; 생략하면 전체 결과 집합이 하나의 파티션이 됩니다. |
ORDER BY | 각 파티션 내에서 행의 순서를 결정합니다. |
output_column_name | 계산된 열에 대한 별칭입니다. |
예시
SELECT dem.first_name,
dem.last_name,
gender,
AVG(salary) OVER (PARTITION BY gender) AS avg_salary_by_gender
FROM employee_demographics dem
JOIN employee_salary sal
ON dem.employee_id = sal.employee_id;
이 쿼리는 각 성별별 평균 급여를 계산하면서도 개별 직원 레코드를 그대로 표시합니다.
흔히 사용되는 윈도우 함수
ROW_NUMBER()RANK()DENSE_RANK()LAG(expression, offset)FIRST_VALUE()LAST_VALUE()
윈도우 함수로 사용되는 집계 함수
SUM()AVG()MAX()MIN()COUNT()
결론
- 여러 테이블의 관련 데이터를 결합해야 할 때 JOIN을 사용합니다.
- 유지하고 싶은 행에 따라 적절한 조인 유형(
INNER,LEFT,RIGHT,FULL)을 선택합니다. - 관련 행 집합에 의존하는 행‑레벨 계산(예: 누적 합계, 순위, 이동 평균)이 필요할 때 윈도우 함수를 사용합니다.
PARTITION BY와ORDER BY를 함께 사용하여 윈도우 범위와 정렬을 미세 조정합니다.
이 도구들을 함께 사용하면 SQL은 데이터 검색과 분석 계산 모두에 강력한 언어가 됩니다.