JOIN 정리
JOIN이란?
- 두 개 이상의 테이블에서 데이터를 조회할 때 사용하는 SQL 구문.
- 조회 결과는 하나의 결과(RESULT SET)로 반환.
- 관계형 데이터베이스에서는 최소한의 데이터를 각각의 테이블에 담고 있어, 테이블 간 데이터를 외래키로 연결해 조회.
JOIN의 구분
- JOIN 구문은 크게 두 가지 방식으로 구분:
- 오라클 전용구문
- ANSI 표준구문
용어 정리
오라클 전용구문 ANSI 구문
등가조인 | 내부조인(INNER JOIN) |
포괄조인 | 외부조인(OUTER JOIN) |
자체조인/비등가조인 |
1. 등가조인(EQUAL JOIN) / 내부조인(INNER JOIN)
특징
- 연결되는 컬럼의 값이 일치하는 행들만 조회.
- 값이 일치하지 않는 행은 결과에 포함되지 않음.
오라클 전용구문
- FROM 절: 조회할 테이블 나열(쉼표로 구분).
- WHERE 절: 연결 조건 작성.
예시: 연결할 두 컬럼명이 다른 경우
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE E, DEPARTMENT D
WHERE E.DEPT_CODE = D.DEPT_ID;
예시: 연결할 두 컬럼명이 동일한 경우
SELECT EMP_ID, EMP_NAME, J.JOB_CODE, JOB_NAME
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
추가 조건이 있는 경우
SELECT EMP_ID, EMP_NAME, JOB_NAME, SALARY
FROM EMPLOYEE E, JOB J
WHERE E.JOB_CODE = J.JOB_CODE
AND JOB_NAME = '대리';
ANSI 구문
- FROM 절: 기준 테이블만 작성.
- JOIN 절: 연결할 테이블과 조건 작성.
예시: 연결할 두 컬럼명이 다른 경우
SELECT EMP_ID, EMP_NAME, DEPT_CODE, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
예시: 연결할 두 컬럼명이 동일한 경우
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE);
추가 조건이 있는 경우
SELECT EMP_ID, EMP_NAME, JOB_NAME, SALARY
FROM EMPLOYEE
JOIN JOB USING (JOB_CODE)
WHERE JOB_NAME = '대리';
2. 포괄조인 / 외부조인(OUTER JOIN)
특징
- 일치하지 않는 행도 포함하여 조회 가능.
- 기준 테이블을 명시적으로 설정해야 함 (LEFT 또는 RIGHT).
1) LEFT [OUTER] JOIN
- 왼쪽 테이블의 모든 행을 포함. 오른쪽 테이블에 매칭되지 않는 값은 NULL.
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEE
LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
오라클 전용구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
2) RIGHT [OUTER] JOIN
- 오른쪽 테이블의 모든 행을 포함. 왼쪽 테이블에 매칭되지 않는 값은 NULL.
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEE
RIGHT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
오라클 전용구문
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
3) FULL [OUTER] JOIN
- 두 테이블의 모든 행을 포함하며, 매칭되지 않는 값은 NULL.
SELECT EMP_NAME, DEPT_TITLE, SALARY, SALARY * 12 AS ANNUAL_SALARY
FROM EMPLOYEE
FULL JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);
주의사항
- 대부분의 환경에서 ANSI 구문을 권장.
- 오라클 전용구문은 특정 DBMS에 종속적이며 가독성이 떨어질 수 있음.