08. SQL(Join)
08. SQL(Join)
[toc]
Join이란?
- 여러 테이블의 연관된 데이터를 합치는 연산을 Join이라 한다.
- 관계형 데이터베이스(RDBMS)는 이를 통해 다양한 형태의 데이터 분석을 가능하게 한다.
카티션곱 vs 이너조인
- 카티션곱(Cartesian Product): 테이블 A의 모든 행 × 테이블 B의 모든 행 (조건 없이 모든 조합 생성)
- 이너조인(Inner Join): 공통 컬럼을 기준으로 일치하는 행만 출력
1
2
SELECT *
FROM class.student s, class.major m;
- 위 쿼리는 카티션곱이 발생해, 5 × 3 = 15개의 행이 출력됨
1
2
3
4
SELECT *
FROM class.student s
JOIN class.major m
ON s.major_id = m.major_id;
- 공통 컬럼(major_id)을 기준으로 JOIN → 정확히 일치하는 행만 출력됨
ANSI SQL vs Non-ANSI SQL
✅ ANSI SQL
- SQL 표준 문법에 따라 작성된 조인
JOIN키워드와ON절을 이용해 조건을 명시적으로 표현- 가독성이 좋고, 다양한 DBMS에서 호환성 우수
- WHERE 조건은 조인 이후 필터링 역할
1
2
3
4
SELECT s.name, m.major_title
FROM class.student s
JOIN class.major m
ON s.major_id = m.major_id;
✅ Non-ANSI SQL (Oracle 등에서 사용됨)
FROM절에 여러 테이블을 나열하고,WHERE절에서 조인 조건을 명시- 오래된 방식이며 가독성이 떨어지고 유지보수에 불리함
1
2
3
SELECT s.name, m.major_title
FROM class.student s, class.major m
WHERE s.major_id = m.major_id;
실습 내용 정리
🔹 student 테이블
| student_id | name | major_id | bl_prfs_id |
|---|---|---|---|
| 1 | Mike | 1 | 1 |
| 2 | John | 2 | 2 |
| 3 | Cole | 3 | 2 |
| 4 | Jordan | 1 | 1 |
| 5 | Curry | 3 | 3 |
🔹 major 테이블
| major_id | major_title | major_student_cnt |
|---|---|---|
| 1 | Computer | 2 |
| 2 | Business | 1 |
| 3 | Sports Education | 2 |
🔹 professor 테이블
| prfs_id | name | major_id |
|---|---|---|
| 1 | 김철수 | 1 |
| 2 | 박영희 | 2 |
| 3 | 최자영 | 3 |
다양한 Join 실습
✅ 학과 정보 + 학생 정보
1
2
3
4
SELECT s.student_id, s.name, m.major_title
FROM class.student s
JOIN class.major m
ON s.major_id = m.major_id;
→ 학생 이름과 학과명을 함께 출력
✅ 교수 정보 + 학생 정보
1
2
3
4
SELECT s.name AS student, p.name AS professor
FROM class.student s
JOIN class.professor p
ON s.bl_prfs_id = p.prfs_id;
→ 학생별 담당 교수를 연결
✅ 조건부 Join with Subquery (학과 인원 수 < 300명)
1
2
3
4
5
6
SELECT s.major_id, s.student_id, s.name, m.major_title, m.major_student_cnt
FROM class.student s
JOIN (
SELECT * FROM class.major WHERE major_student_cnt < 300
) AS m
ON s.major_id = m.major_id;
Non-equi Join
- 등호(=)가 아닌 조건을 사용하는 조인
- 예: 포인트 범위에 따른 선물 제공 기준
1
2
3
4
SELECT *
FROM class.customer c
JOIN class.gift g
ON c.point BETWEEN g.point_s AND g.point_e;
Summary
- Join은 SQL에서 가장 중요한 연산 중 하나
- INNER JOIN은 공통 키 값을 기준으로 데이터를 연결
- ANSI SQL은 가독성과 유지보수성, 호환성이 좋음
- Non-equi Join은
BETWEEN,<,>같은 비교 연산자를 사용한 조인 방식
End
