Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 네트워크
- 케이티 에이블스쿨 기자단
- 케이티 에이블스쿨 6기 java
- SQLD
- 머신러닝
- 백준
- KT 에이블스쿨
- 알고리즘
- 오블완
- 프로그래머스
- kt 에이블스쿨 6기 빅프로젝트
- 구현
- kt 에이블스쿨 기자단
- kt 에이블스쿨 6기
- 티스토리챌린지
- 판다스
- 파이썬
- kt aivle school
- 케이티 에이블스쿨 6기 후기
- kt 에이블스쿨 6기 미니 프로젝트
- 케이티 에이블스쿨 6기 ai
- 앙상블
- KT AIVLE
- 백준 사탕 게임
- 데이터 프레임
- 케이티 에이블스쿨 6기
- kt 에이블스쿨 6기 ai
- 케이티 에이블스쿨
- 에이블 기자단
- 케이티 에이블스쿨 6기 spring
Archives
- Today
- Total
미식가의 개발 일기
[SQLD] 조인 본문
1️⃣ 조인(JOIN)이란?
"2개 이상의 테이블들을 연결하는 것"
💡 등가 조인(EQUI JOIN)
- 두 테이블의 컬럼 값이 정확히 일치하는 경우
// WHERE 절에 조인 조건(구식)
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명1 = 테이블2.컬럼명2;
// ON 절에 조인 조건(명시적 조인)
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.컬럼명1 = 테이블2.컬럼명2;
💡 비등가 조인(Non EQUI JOIN)
- 두 테이블의 컬럼 값이 일치하지 않는 경우
// 컬럼명1과 컬럼명2 범위 사이에 있을 때만 결합
SELECT 테이블1.컬럼명, 테이블2.컬럼명
FROM 테이블1, 테이블2
WHERE 테이블1.컬럼명1 BETWEEN 테이블2.컬럼명1 AND 테이블2.컬럼명2;
2️⃣ 표준 조인
💡 표준 SQL 개요
일반 집합 연산자 | 순수 관계 연산자 |
UNION: 합집합 INTERSECTION: 교집합 DIFFERENCE: 차집합 PRODUCT: 곱집합 |
SELECT 연산 → WHERE 절: 조건에 맞는 행 조회 PROJECT 연산 → SELECT 절: 조건에 컬럼 조회 (NATURAL)JOIN 연산 → 다양한 JOIN 기능 DIVIDE: 현재 사용 X |
💡 INNER JOIN
- JOIN 조건에서 동일한 값이 있는 행만 반환
- DEFAULT 옵션으로 생략 가능
SELECT 테이블1.컬럼명
FROM 테이블1
INNER JOIN 테이블2
ON 테이블1.컬럼명1 = 테이블2.컬럼명2;
// 예시: 학생 ID를 기준으로 학생, 성적 테이블을 조인한 후 학생 이름 출력
SELECT 학생.이름
FROM 학생
INNER JOIN 성적
ON 학생.학생_ID = 성적.학생_ID;
💡 NATURAL JOIN
- 동일한 이름, 타입을 갖는 모든 컬럼에 대해 등가 조인 수행
- ALIAS나 접두사 불가
SELECT 컬럼명
FROM 테이블1
NATURAL JOIN 테이블2;
💡 CROSS JOIN
- 생길 수 있는 모든 데이터 조합 → M*N건
SELECT 컬럼명
FROM 테이블1
CROSS JOIN 테이블2;
💡 OUTER JOIN
- 동일한 값이 없는 행(NULL)도 출력
- USING/ON 조건절 필수로 사용
- USING: 동일한 이름을 가진 컬럼 기준 → ` USING (컬럼명);`
- `ON`: 두 테이블의 특정 컬럼 기준 → ` ON 테이블1.컬럼명1 = 테이블2.컬럼명2;`
< LEFT OUTER JOIN>
- 좌측 테이블 기준
SELECT t1.컬럼명
FROM 테이블1 t1
LEFT JOIN 테이블2 t2
ON t1.컬럼명 = t2.컬럼명;
< RIGHT OUTER JOIN>
- 우측 테이블 기준
SELECT t1.컬럼명
FROM 테이블1 t1
RIGHT JOIN 테이블2 t2
ON t1.컬럼명 = t2.컬럼명;
< FULL OUTER JOIN>
- LEFT와 RIGHT의 합집합
SELECT t1.컬럼명
FROM 테이블1 t1
FULL JOIN 테이블2 t2
ON t1.컬럼명 = t2.컬럼명;
3️⃣ 집합 연산자
- 2개 이상의 테이블에서 조인을 사용하지 않고, 연관된 데이터를 조회
집합 연산자 | 의미 |
UNION | 중복 X 합집합 |
UNION ALL | 중복 O 합집합 |
INTERSECT | 중복 X 교집합 |
EXCEPT | 중복 X 교집합 |
4️⃣ 계층형 질의와 셀프 조인
💡 계층형 질의
계층형 데이터: 동일 테이블에 계층적으로 상/하위 데이터가 포함된 데이터
<Oracle>
SELECT column1, column2, LEVEL // 현재 레벨을 나타내는 가상 컬럼
FROM table_name
START WITH condition // 최상위 부모 정의
CONNECT BY [NOCYCLE] PRIOR parent_column = child_column; // 부모, 자식 관계 정의
[ORDER SIBLINGS BY column, ...] // 자식 노드 정렬
// PRIOR: 현재 읽은 컬럼을 지정
// PRIOR 자식=부모: 부모->자식으로 순방향 전개, 리프=1
// PRIOR 부모=자식: 자식->부모로 역방향 전개, 루트=1
// ORDER SIBLINGS BY: 형제 NODE 위치를 바꿈
// NOCYCLE: 사이클 발생 이후 데이터는 전개 X
- 계층형 질의에서 사용되는 가상 컬럼
- `LEVEL`: 루트 데이터면 1, 리프 데이터까지 1씩 증가
- `CONNECT_BY_ISLEAF`: 리프 데이터면 1, 아니면 0
- `CONNECT_BY_ISCYCLE`: 사이클 여부 확인(자식 데이터가 조상으로서 존재하면 1, 아니면 0)
- 계층형 질의에서 사용되는 함수
- `SYS_CONNECT_BY_PATH`: 루트부터 현재 데이터까지의 경로 표시
- `CONNECT_BY_ROOT`: 현재 데이터의 루트 데이터를 표시
<SQL Server>
- CTE(Common Table Expression)로 재귀 호출하여 상위부터 하위 방향 전개
WITH CTE_Name (column1, column2, level)
AS
(
-- 기본 조건: 루트 데이터 정의
SELECT column1, column2, 1 AS level
FROM table_name
WHERE parent_column IS NULL -- 루트 조건, 예: 최상위 부모
UNION ALL
-- 재귀 조건: 자식 데이터를 찾는 조건
SELECT t.column1, t.column2, cte.level + 1 AS level
FROM table_name t
INNER JOIN CTE_Name cte ON t.parent_column = cte.column1 -- 부모-자식 관계
)
💡 셀프 조인
- 동일 테이블 사이의 조인
- 반드시 AILAS(테이블 별칭)을 사용해야 함
SELECT t1.column1, t1.column2, t2.column1, t2.column2
FROM 테이블 t1
JOIN 테이블 t2
ON t1.column1 = t2.column2;
반응형
'SQL' 카테고리의 다른 글
[프로그래머스/MySQL] 경기도에 위치한 식품창고 목록 출력하기 (0) | 2025.04.19 |
---|---|
[프로그래머스/MySQL] 잡은 물고기 중 가장 큰 물고기의 길이 구하기 (0) | 2025.04.19 |
[SQLD] GROUP BY, HAVING, ORDER BY 절 (0) | 2025.03.01 |
[SQLD] SQL 내장 함수 (0) | 2025.03.01 |
[SQLD] WHERE 절 (0) | 2025.03.01 |