2025-08-20 01:04

Tags:SQL

조인

  • 데이터베이스를 나누어 저장, 관리 : 정규화
  • 흩어진 데이터 조각을 다시 연결 의미있는 정보: 관계, 조인
  • 기본키와 외래키를 사용해 관계를 통해 데이터들을 논리적으로 연결
  • 관계를 이용해 실제 데이터 합쳐서 조회 조인
  • FROM 절에 조인할 테이블 나열
  • 조인이 연속되어도 2개의 집합에만 조인일어남 FROM A,B,C 면 A JOIN B의 결과 와 C 의 조인이 일어남
  • 여러 테이블 조인 시 SELECT 절에 해당 컬럼의 테이블 이름 명시, 당장 중복 안되도 장기적으로 명시하는게 컨벤션
  • N 개의 테이블 조인 시 최소 N-1 개의 조인 조건 필요

조인의 종류

1. 조건의 형태에 따른 구분

1. EQUI JOIN: 조인 조건이 동등 인 경우

  • 2개의 테이블 간에 컬럼 값들이 서로 정확하게 일치할 때 [ORACLE]            [ANSI/ISO SQL]
    조인 조건을 WHERE 절에    조인 조건을 ON절에
-- ORACLE
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호, P.TEAM_ID 팀코드,
       T.TEAM_NAME 팀명, T.REGION_NAME 연고지 
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID
 
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호,
       T.TEAM_NAME 팀명
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID = T.TEAM_ID AND P.POSITION = 'GK'
ORDER BY P.BACK_NO;
 
-- ANSI/ISO SQL
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호, P.TEAM_ID 팀코드,
       T.TEAM_NAME 팀명, T.REGION_NAME 연고지
FROM PLAYER P
INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID;
 
SELECT P.PLAYER_NAME 선수명, P.BACK_NO 등번호,
       T.TEAM_NAME 팀명
FROM PLAYER P
INNER JOIN TEAM T
ON P.TEAM_ID = T.TEAM_ID
WHERE P.POSITION = 'GK'
ORDER BY P.BACK_NO;

2. NOT EQUI JOIN: 조인 조건이 동등이 아닌 경우

  • 2개의 테이블 간에 컬럼 값들이 서로 정확하게 일치하지 않는 경우에 사용
  • ”=” 연산자가 아닌 다른(BETWEEN, <, , >, >= 등) 연산자들을 사용하여 조인을 수행하는 것

사원(EMP) 테이블

ENAMESAL
SMITH800
ALLEN1600
WARD1250
JONES2975
MARTIN1280
KING8000

급여 등급표(SALGRADE) 테이블

GRADELOSALHISAL
17001200
212011400
314012000
420013000
530019999
-- 사원에 따른 급여 등급 출력
SELECT E.ENAME 사원명, E.SAL 급여, S.GRADE 급여등급  
FROM EMP E, SALGRADE S  
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;
사원명급여급여등급
SMITH8001
ALLEN16003
WARD12502
JONES29754
MARTIN12802
KING80005

2. 조인 결과에 따른 구분

1. INNER 조인(내부 조인): 두 테이블 간 조인 조건이 일치하는 데이터만 출력

  • 연결고리(FK)가 일치하는 데이터만 가져옴
  • 두 테이블의 교집합
  • 주문 내역이 있는 고객 정보와 그 주문 내역 함께 보고 싶을때
SELECT C.customer_name, O.order_date, O.order_id
FROM Customers AS C
INNER JOIN AS O ON C.customer_id = O.customer_id

2. OUTER JOIN(외부 조인): 두 테이블간 조건이 일치하지 않는 데이터도 출력

1. LEFT 조인(왼쪽 외부 조인)
  • 왼쪽 테이블 전체 + 교집합
  • 모든 고객 목록 보되, 주문 내역있으면 함게 표시, 없으면 비워두기
SELECT C.customer_name, O.order_date
FROM Customers AS C
LEFT JOIN Orders AS O ON C.customer_id = O.customer_id;
2. RIGHT 조인(오른족 외부 조인)
  • 오른쪽 테이블 전체 + 교집합
  • 모든 주문 내역을 보되, 해당 주문을 한 고객 정보가 있다면 함께 표시하고 싶을 때. (만약 고객 정보가 삭제되었지만 주문 기록은 남아있는 경우 등을 확인할 수 있음)
SELECT C.customer_name, O.order_date
FROM Customers AS C
RIGHT JOIN Orders AS O ON C.customer_id = O.customer_id;

3. NATURAL JOIN

  • 두 테이블에서 같은 이름을 가진 컬럼 자동으로 찾아 조인

4. CROSS JOIN

  • 두 테이블의 모든 조합을 생성하는 조인
  • 오라클: FROM t1,t2 + WHERE 절에 조건 명시하지 않을때
  • ANSI: t1 CROSS JOIN t2 + ON 으로 조인 조건 명시하지 않을때

5. SELF JOIN

  • 같은 테이블을 두 번 이상 참조하는 조인
  • 동일 테이블 사이의 조인
  • FROM 절에 동일 테이블이 2번 이상 나타나게 되니 식별을 위해 반드시 테이블 ALIAS를 사용해야 한다.

같은 테이블 EMPLOYEES

EMP_IDNAMEMGR_ID
100KING
101ALLEN100
102WARD100
103JONES100
104MARTIN101
105SMITH103
SELECT E1.EMP_ID, E1.NAME, E1.MGR_ID, E2.EMP_ID, E2.NAME
FROM EMPLOYEES E1, EMPLOYEES E2
WHERE E1.EMP_ID = E2.EMP_ID
EMP_IDNAMEMGR_IDEMP_IDNAME
101ALLEN100100KING
102WARD100100KING
103JONES100100KING
104MARTIN101101ALLEN
105SMITH103103JONES
  • 이너 조인(EQUI JOIN)이라 MGR_ID 가 NULL 인 KING 은 조건에 안맞아서 제외
  • 조인 조건 안맞는 것도 출력하려면 OUTER 조인으로