SQL_SQLD_JOIN

MR.HAN·2024년 2월 1일

SQL

목록 보기
10/10

JOIN


개요

  • 서로 다른 두 테이블을 공통 컬럼을 가지고 결합하여 조회하는 것
  • PK, FK를 이용한 조인이 일반적 (논리적인 연관만으로 성립될 수 있음.)
  • FROM A, B, C 에서 A, B 테이블 먼저 조인 처리, 그 다음 C와 조인 처리 (두 개의 집합 간에만 조인 발생)

종류

  • INNER JOIN
  • OUTER JOIN
  • CROSS JOIN
  • SELF JOIN

형태

(조인 조건 어디에 명시하는지에 따라)

  • WHERE 조건절
  • 표준 조인

EQUI JOIN

  • 등가 조인 : 두 개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하는 경우
  • WHERE 절 기술, '=' 연산자 사용
  • 대부분 PK = FK 관계 기반 (반드시 X)
  • SELECT 절 컬럼 작성시 테이블 이름과 함께 (한 테이블에만 있는 컬럼이라면 생략 가능)
  • WHERE 절에서 조인 조건 이외의 검색 조건 이용 가능
SELECT P.PLAYER_NAME AS 선수명, P.BACK_NO AS 등번호, P.TEAM_ID AS 팀코드, T.TEAM_NAME AS 팀명, T_REGION_NAME AS 연고지
FROM PLAYER P, TEAM T
WHERE P.BACK_NO > 10
AND T.TEAM_ID = P.TEAM_ID;

NON EQUI JOIN

  • 연관 있으나 컬럼 값들이 서로 일치하지 않는 경우
  • BETWEEN, >, >= 등 사용
  • 데이터 모델에 따라서 불가능한 경우도 있음.
# 1
SELECT ENAME, JOB, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL >= LOSAL
AND SAL <= HISAL;

# 2
SELECT ENAME, JOB, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;

3개 이상 TABLE JOIN

  • 테이블 수 n개라면 조인 조건은 최소 n-1개 이상
SELECT P.PLAYER_NAME 선수명, T.TEAM_NAME 팀명, S.STADIUM_NAME 구장명
FROM PLAYER P, TEAM T, STADIUM S
WHERE P.TEAM_ID = T.TEAM_ID
AND T.STADIUM_ID = S.STADIUM_ID
ORDER BY 선수명;



표준 조인


INNER JOIN

  • WHERE 절에 조건 명시 X
  • INNER 생략 가능
SELECT S.STADIUM_NAME, S.STADIUM_ID, S.SEAT_COUNT, T.TEAM_NAME
FROM STADIUM S INNER JOIN TEAM T
ON T.STADIUM_ID = S.STADIUM_ID;

NATURAL JOIN

  • 동일한 이름 갖는 모든 컬럼들에 대해 EQUI JOIN 수행 (SQL Server 지원 X)
  • 조인 조건 자동 결정 (USING, ON, WHERE 절 조건 정의 불가)
  • 조인에 사용된 컬럼
    - 같은 유형이어야 함.
    - ALIAS나 테이블 명과 같은 접두사 X (벤더마다 다름.)
# TEAM 테이블에 STADIUM_ID 컬럼 있음.
SELECT S.STADIUM_NAME, STADIUM_ID, S.SEAT_COUNT, T.TEAM_NAME
FROM STADIUM S NATURAL JOIN TEAM T; 

INNER JOIN VS NATURAL JOIN

NATURAL JOIN

  • 기준 컬럼 STADIUM_ID 가 맨 왼쪽에 먼저 출력
  • 기준 컬럼 한번만 출력
# TEAM 테이블에 STADIUM_ID 컬럼 있음.
SELECT *
FROM STADIUM S NATURAL JOIN TEAM T; 

INNER JOIN

  • T, S 컬럼의 순서대로 출력
  • 기준 컬럼이 반복적으로 출력
SELECT *
FROM STADIUM S INNER JOIN TEAM T
ON T.STADIUM_ID = S.STADIUM_ID;

USING 조건절

  • (NATURAL) JOIN 시 이름이 같은 모든 컬럼에 대해 EQUI JOIN
    - FROM 절의 USING 조건절은 동일 이름 컬럼 중 선택 가능 (SQL Server 지원 X)
    - ALIAS, 접두사 붙일 수 없음.
SELECT * 
FROM STADIUM S JOIN TEAM T
USING(기준컬럼1, 기준컬럼2, ...);

ON 조건절

  • WHERE 절 : 데이터 한정할 때 사용
  • ON 절 : 조인 조건을 명시할 때 사용
    - 컬럼 이름이 다르더라도 조인 조건 사용 가능
    - 테이블명, ALIAS 접두사 붙임.
SELECT *
FROM STADIUM S JOIN TEAM T
ON (SUBSTR(T.REGION_NAME, 1, 2) = SUBSTR(S.STADIUM_NAME, 1, 2));
  • WHERE 절과 ON 절 혼합하여 사용 불가
SELECT *
FROM STADIUM S JOIN TEAM T
ON (SUBSTR(T.REGION_NAME, 1, 2) = SUBSTR(S.STADIUM_NAME, 1, 2))
WHERE S.SEAT_COUNT>40000;
  • 다중 테이블 조인
SELECT P.PLAYER_NAME, T.TEAM_NAME, S.STADIUM_NAME
FROM PLAYER P JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
JOIN STADIUM S
ON T.STADIUM_ID = S.STADIUM_ID;

CROSS JOIN

  • 두 테이블 간 조인 조건 없는 경우 (조인이라기 보다는 조합 생성용)
  • CARTESIAN PRODUCT, CROSS PRODUCT
SELECT P.PLAYER_NAME, T.TEAM_NAME
FROM PLAYER P CROSS JOIN TEAM T
ORDER BY P.PLAYER_NAME;

OUTER JOIN

  • 등가 조건을 만족하지 않더라도 한 쪽 혹은 양쪽 테이블 내용이 모두 나오는 조인
  • Oracle : 조인 컬럼(+) → (+) 표시 반대쪽 테이블이 기준 테이블 (추천 방법 아님.)
  • 기준 테이블들의 컬럼들은 모두 값이 표시되고, 그 외 테이블은 값이 NULL
SELECT S.STADIUM_NAME, S.STADIUM_ID, S.SEAT_COUNT, T.TEAM_NAME
FROM STADIUM S, TEAM T
WHERE T.STADIUM_ID(+) = S.STADIUM_ID;

LEFT OUTER JOIN

  • 기준 테이블 (왼쪽) 내용은 무조건 출력
  • OUTER 생략 가능
# 기준 테이블은 STADIUM S
SELECT S.STADIUM_NAME, S.STADIUM_ID, S.SEAT_COUNT, T.TEAM_NAME
FROM STADIUM S LEFT OUTER JOIN TEAM T
ON T.STADIUM_ID = S.STADIUM_ID;

RIGHT OUTER JOIN

  • 기준 테이블 반대편 (오른쪽) 내용은 무조건 출력

FULL OUTER JOIN

  • LEFT와 RIGHT OUTER JOIN의 합집합
  • 조인에 성공한 행들은 한번만 출력

0개의 댓글