티스토리 뷰
반응형
📘 데이터베이스 조인 — 정의, 필요성, 모든 경우의 수와 조건 필터링까지 완전한 정리
📖 조인이란
조인은 데이터베이스에서 두 릴레이션(테이블)의 데이터를 하나로 합치는 작업입니다.두 테이블의 각 행이 어떻게 연결될지를 조건으로 정하고, 그 조건에 맞는 데이터만 결과에 남깁니다.
조건을 지정하지 않으면 두 릴레이션의 모든 행이 곱해지는 카티션 곱이 발생합니다.
따라서 조인은 모든 행 조합을 만든 뒤, 지정한 조건을 만족하는 것만 남긴다는 점이 중요합니다.
여기서는 대표적인 조인 방식 3가지(세타, equal, natural)를 정의, 필요성, 합치기 전 데이터, 카티션 곱, 조건 검사, 결과까지 전부 기술합니다.
📖 세타 조인
정의
세타 조인(θ-조인)은 두 릴레이션의 모든 행 조합을 만든 후,그 중에서 지정한 비교 연산자(
=
, !=
, <
, >
, <=
, >=
)를 만족하는 행만 결과에 남기는 조인입니다.세타 조인은 다양한 조건으로 데이터를 연결할 수 있는 가장 일반적이고 유연한 방식입니다.
필요성
데이터를 연결할 때 정확히 같은 값이 아니라 범위에 속하거나 크기 비교를 해야 하는 경우가 있습니다.예를 들어 점수가 특정 구간에 속할 때 등급을 부여해야 한다면,
=
만으로는 불가능합니다.이런 경우
>=
, <=
처럼 다른 연산자를 써야 하기 때문에 세타 조인을 사용합니다.
합치기 전 데이터
학생 테이블
student_id | name | score |
---|---|---|
1 | 홍길동 | 85 |
2 | 이몽룡 | 90 |
등급 테이블
grade | min_score | max_score |
---|---|---|
A | 90 | 100 |
B | 80 | 89 |
모든 경우의 수 (카티션 곱)
두 테이블의 모든 행을 짝지어 만듭니다.학생 2명 × 등급 2개 = 4개의 조합이 됩니다.
student_id | name | score | grade | min_score | max_score |
---|---|---|---|---|---|
1 | 홍길동 | 85 | A | 90 | 100 |
1 | 홍길동 | 85 | B | 80 | 89 |
2 | 이몽룡 | 90 | A | 90 | 100 |
2 | 이몽룡 | 90 | B | 80 | 89 |
조건 검사
조건:학생.score >= 등급.min_score AND 학생.score <= 등급.max_score
학생 | 등급 | 계산 | 조건 만족 |
---|---|---|---|
홍길동(85) | A(90~100) | 85 ≥ 90 ✖️ | ❌ |
홍길동(85) | B(80~89) | 85 ≥ 80 ✔️, 85 ≤ 89 ✔️ | ✅ |
이몽룡(90) | A(90~100) | 90 ≥ 90 ✔️, 90 ≤ 100 ✔️ | ✅ |
이몽룡(90) | B(80~89) | 90 ≥ 80 ✔️, 90 ≤ 89 ✖️ | ❌ |
조건 만족하는 행만 남기기
student_id | name | score | grade | min_score | max_score |
---|---|---|---|---|---|
1 | 홍길동 | 85 | B | 80 | 89 |
2 | 이몽룡 | 90 | A | 90 | 100 |
📖 equal 조인
정의
equal 조인은 세타 조인의 특수한 형태입니다.조건에
=
만 사용하는 조인으로, 두 릴레이션의 속성이 정확히 일치하는 경우에만 연결됩니다.equal 조인은 데이터베이스에서 가장 흔히 사용되는 방식입니다.
필요성
두 릴레이션을 연결할 때, 공통 속성의 값이 정확히 같아야 하는 경우가 많습니다.예를 들어 직원 테이블의 부서 번호와 부서 테이블의 부서 번호처럼, 같은 키 값으로 정확히 연결할 때 필요합니다.
합치기 전 데이터
직원 테이블
emp_id | name | dept_no |
---|---|---|
1 | 홍길동 | 10 |
2 | 이몽룡 | 20 |
부서 테이블
dept_no | dept_name |
---|---|
10 | 영업부 |
20 | 인사부 |
모든 경우의 수 (카티션 곱)
직원 2명 × 부서 2개 = 4개의 조합이 됩니다.emp_id | name | dept_no(직원) | dept_no(부서) | dept_name |
---|---|---|---|---|
1 | 홍길동 | 10 | 10 | 영업부 |
1 | 홍길동 | 10 | 20 | 인사부 |
2 | 이몽룡 | 20 | 10 | 영업부 |
2 | 이몽룡 | 20 | 20 | 인사부 |
조건 검사
조건:직원.dept_no = 부서.dept_no
직원 | 부서 | 비교 | 조건 만족 |
---|---|---|---|
홍길동(10) | 10 | 10=10 ✔️ | ✅ |
홍길동(10) | 20 | 10=20 ✖️ | ❌ |
이몽룡(20) | 10 | 20=10 ✖️ | ❌ |
이몽룡(20) | 20 | 20=20 ✔️ | ✅ |
조건 만족하는 행만 남기기
emp_id | name | dept_no | dept_name |
---|---|---|---|
1 | 홍길동 | 10 | 영업부 |
2 | 이몽룡 | 20 | 인사부 |
📖 natural 조인
정의
natural 조인은 equal 조인과 같지만, 결과에서 중복된 공통 속성을 제거합니다.두 릴레이션에 이름이 같은 속성이 있을 때 자동으로 기준으로 삼고, 결과에 한 번만 표시됩니다.
필요성
equal 조인을 하면 공통 속성이 두 번 표시됩니다.이를 자동으로 하나로 줄여 결과를 간결하게 만들고, SQL 문장도 짧아집니다.
합치기 전 데이터
직원 테이블
emp_id | name | dept_no |
---|---|---|
1 | 홍길동 | 10 |
2 | 이몽룡 | 20 |
부서 테이블
dept_no | dept_name |
---|---|
10 | 영업부 |
20 | 인사부 |
모든 경우의 수 (카티션 곱)
emp_id | name | dept_no(직원) | dept_no(부서) | dept_name |
---|---|---|---|---|
1 | 홍길동 | 10 | 10 | 영업부 |
1 | 홍길동 | 10 | 20 | 인사부 |
2 | 이몽룡 | 20 | 10 | 영업부 |
2 | 이몽룡 | 20 | 20 | 인사부 |
조건 검사
조건:자동으로
dept_no(직원) = dept_no(부서)
를 비교
직원 | 부서 | 비교 | 조건 만족 |
---|---|---|---|
홍길동(10) | 10 | 10=10 ✔️ | ✅ |
홍길동(10) | 20 | 10=20 ✖️ | ❌ |
이몽룡(20) | 10 | 20=10 ✖️ | ❌ |
이몽룡(20) | 20 | 20=20 ✔️ | ✅ |
조건 만족하는 행만 남기기 + 중복 제거
emp_id | name | dept_no | dept_name |
---|---|---|---|
1 | 홍길동 | 10 | 영업부 |
2 | 이몽룡 | 20 | 인사부 |
📖 조인 방식 비교 정리표
구분 | 조건 형태 | 중복 속성 처리 |
---|---|---|
세타 조인 | >= , <= , != , < , > 가능 |
중복 속성 그대로 |
equal 조인 | = 만 사용 |
중복 속성 그대로 |
natural 조인 | 공통 속성을 자동으로 기준 삼음 | 자동으로 제거 |
📖 결론
- 조인은 두 릴레이션의 데이터를 합치는 작업이며, 합친 후 원하는 데이터만 남기기 위해 항상 조건이 필요합니다.
- 세타 조인은 비교 연산자를 자유롭게 사용 가능하며 범위 비교나 불일치 조건 등 유연한 데이터 연결이 가능합니다.
- equal 조인은 가장 기본적이고 흔히 쓰이는 형태로, 두 속성 값이 정확히 같아야 하는 상황에 적합합니다.
- natural 조인은 equal 조인을 더 간결하고 깔끔하게 만든 형태로, 공통 속성을 자동으로 기준 삼고 결과에서 중복 속성을 제거해줍니다.
반응형
'정보처리기사' 카테고리의 다른 글
GoF 디자인 패턴 23가지 완벽 마스터하기: 핵심 특징 및 요약 (1) | 2025.07.13 |
---|---|
소프트웨어 테스트 커버리지: 개념, 코드, 테스트케이스별 퍼센트까지 완전 정리 (0) | 2025.07.13 |
RIP와 OSPF — 링크 상태와 다익스트라로 보는 두 가지 길 찾기 방식 (5) | 2025.07.12 |
서브넷 마스크란? (0) | 2025.07.12 |
대칭키 암호화방법 : DES vs AES 총정리! (3) | 2025.07.09 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 동적 계획법
- 동적계획법
- 그래프 탐색
- 객체지향
- dfs
- python 알고리즘
- 파이썬코딩
- 알고리즘문제풀이
- 코딩테스트
- 프로그래밍
- 파이썬
- 알고리즘 문제풀이
- c언어
- 문자열처리
- 코딩
- 코딩 테스트
- C++ 알고리즘
- DP
- 문제풀이
- 브루트포스
- 파이썬문제풀이
- 문제 풀이
- C++
- 알고리즘
- 알고리즘기초
- 백준
- Python
- c++알고리즘
- 그리디알고리즘
- 그리디
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형