티스토리 뷰
반응형
📘 데이터베이스 조인 — 정의, 필요성, 모든 경우의 수와 조건 필터링까지 완전한 정리
📖 조인이란
조인은 데이터베이스에서 두 릴레이션(테이블)의 데이터를 하나로 합치는 작업입니다.두 테이블의 각 행이 어떻게 연결될지를 조건으로 정하고, 그 조건에 맞는 데이터만 결과에 남깁니다.
조건을 지정하지 않으면 두 릴레이션의 모든 행이 곱해지는 카티션 곱이 발생합니다.
따라서 조인은 모든 행 조합을 만든 뒤, 지정한 조건을 만족하는 것만 남긴다는 점이 중요합니다.
여기서는 대표적인 조인 방식 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
- 문제 풀이
- 코딩
- 알고리즘문제풀이
- 동적 계획법
- python 알고리즘
- Python
- 동적계획법
- 코딩 테스트
- 알고리즘 문제풀이
- 파이썬
- HTML
- 코딩테스트
- 알고리즘
- 문제풀이
- 프로그래밍
- 그리디
- 그래프 탐색
- c언어
- 그리디알고리즘
- 문자열처리
- 알고리즘기초
- dfs
- 상속
- 파이썬코딩
- 백준
- DP
- 브루트포스
- 객체지향
- 프로그래머스
- 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 |
글 보관함
반응형
