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