미식가의 개발 일기

[SQLD] 조인 본문

SQL

[SQLD] 조인

대체불가 핫걸 2025. 3. 2. 17:10

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;

 

반응형