DataBase/Oracle
SQL - JOIN
jddng
2022. 1. 20. 21:02
728x90
반응형
JOIN
한 개 이상의 테이블에서 테이터를 조회하기 위해 사용하는 것으로 수행 결과는 하나의 Result Set으로 나오게 된다. 관계형 데이터베이스에서는 하나의 테이블에서 데이터를 가져오거나 외래키를 참조하여 외래키에 해당하는 테이블의 데이터들도 같이 가져오는 경우가 많다.
- 조인은 기본이 EQUAL JOIN이다 (EQU JOIN이라고도 함)
- 연결되는 컬럼의 값이 일치하는 행들만 조인된다
- 일치하는 값이 없는 행은 조인에서 제외 되는 것을 INNER JOIN이라고 한다.
- JOIN의 기본은 INNER JOIN & EQU JOIN이다.
JOIN구문은 오라클과 ANSI 표준이 있으니 둘 다 알아보도록 하자.
오라클 INNER JOIN
- FROM절에 ' , ' 로 구분하여 합치게 될 테이블명을 기술
- WHERE절에 합치기에 사용할 컬럼명을 명시한다.
- 두개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행은 조인에서 제외
- INNER를 명시하지 않아도 INNER JOIN으로 실행된다.
연결에 사용할 두 컬럼명이 다른 경우
- 연결할 두 테이블간의 컬럼명의 이름이 다른경우 WHERE절에서 조건을 넣어준다.
- WHERE절 조건에 따라 EMPLOYEE 테이블과 DEPARTMENT 테이블의 컬럼들이 합쳐진다.
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID;
연결에 사용할 두 컬럼명이 같은 경우
- 연결할 두 테이블간의 컬럼명의 이름이 다른경우
WHERE절에서 테이블명을 포함하여 조건처리하거나, 별칭을 이용한다. - WHERE절 조건에 따라 EMPLOYEE 테이블과 DEPARTMENT 테이블의 컬럼들이 합쳐진다.
--테이블명으로 해당 컬럼 구분
SELECT
EMPLOYEE.EMP_ID
, EMPLOYEE.EMP_NAME
, EMPLOYEE.JOB_CODE
, JOB.JOB_NAME
FROM EMPLOYEE
, JOB
WHERE EMPLOYEE.JOB_CODE = JOB.JOB_CODE;
-- 테이블명에 별칭 사용
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
, JOB J
WHERE E.JOB_CODE = J.JOB_CODE;
ANSI 표준 JOIN 구문
- JOIN 키워드를 1개 이상 테이블들의 데이터를 합칠 수 있다.
연결에 사용할 두 컬럼명이 같은 경우
- USING(컬럼명)을 사용한다.
SELECT
EMP_ID
, EMP_NAME
, JOB_CODE
, JOB_NAME
FROM EMPLOYEE
JOIN JOB USING(JOB_CODE);
연결에 사용할 두 컬럼명이 다른 경우
- ON(컬럼명1 = 컬럼명2)를 사용한다.
- 컬럼명이 같은 경우에도 ON()을 이용해 해당 테이블들을 합칠 수 있다.
-- 연결에 사용할 컬럼명이 다른 경우 ON()을 사용함
SELECT
EMP_ID
, EMP_NAME
, DEPT_CODE
, DEPT_TITLE
FROM EMPLOYEE
JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
-- 컬럼명이 같은 경우에도 ON()을 사용할 수 있다.
SELECT
E.EMP_ID
, E.EMP_NAME
, E.JOB_CODE
, J.JOB_NAME
FROM EMPLOYEE E
JOIN JOB J ON(E.JOB_CODE = J.JOB_CODE);
오라클 OUTER JOIN
- 두개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행도 조인에 포함
- OUTER JOIN은 반드시 OUTER JOIN임을 명시해야한다.
- 종류
- LEFT OUTER JOIN - 컬럼 = 컬럼(+)
- RIGHT OUTER JOIN - 컬럼(+) = 컬럼
- FULL OUTER JOIN - 종류
-
- LEFT OUTER JOIN (OUTER 생략 가능)
- RIGHT OUTER JOIN (OUTER 생략 가능)
- FULL OUTER JOIN (OUTER 생략 가능)
LEFT OUTER JOIN
- 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수를 기준으로 JOIN이 된다.
- 아래 코드는 DEPT_CODE가 EMPLOYEE의 컬럼이고, DEPT_ID가 DEPARTMENT의 컬럼이다.
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);
LEFT OUTER JOIN
- 기준이 되는 테이블은 DEPARTMENT
-- 오라클 전용
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;
FULL OUTER JOIN
- 오라클 전용은 FULL OUTER JOIN은 할 수 없다.
ANSI 표준 OUTER JOIN 구문
- 두개 이상의 테이블을 조인할 때, 일치하는 값이 없는 행도 조인에 포함
- OUTER JOIN은 반드시 OUTER JOIN임을 명시해야한다.
- 종류
- LEFT OUTER JOIN (OUTER 생략 가능)
- RIGHT OUTER JOIN (OUTER 생략 가능)
- FULL OUTER JOIN (OUTER 생략 가능)
LEFT OUTER JOIN
- 합치기에 사용한 두 테이블 중 왼편에 기술된 테이블의 행의 수를 기준으로 JOIN이 된다.
- 아래 코드는 DEPT_CODE가 EMPLOYEE의 컬럼이고, DEPT_ID가 DEPARTMENT의 컬럼이다.
- 기준이 되는 테이블은 EMPLOYEE
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- LEFT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
LEFT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
RIGHT OUTER JOIN
- 기준이 되는 테이블은 DEPARTMENT
-- ANSI 표준
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- RIGHT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
RIGHT JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
FULL OUTER JOIN
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
-- FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
FULL JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);
그 이외의 조인 구문
CROSS JOIN
- 카테이션곱 이라고도 한다.
- 조인되는 테이블의 각 행들이 모두 매핑된 데이터가 검색되는 방법
- 아래 코드로 설명하면 각 이름마다 모든 부서가 매핑되어 진다.
EMP_NAME * DEPT_TITLE의 개수만큼 행이 만들어짐
SELECT
EMP_NAME
, DEPT_TITLE
FROM EMPLOYEE
CROSS JOIN DEPARTMENT;
NON EQUAL JOIN(NON EQU JOIN)
- 지정한 컬럼의 값이 일치하는 경우가 아닌, 값의 범위에 포함되는 행들을 연결
- 아래 코드는 SALARY <= SAL_GRADE <= MAX_SAL 값의 범위인 행들을 조인한다고 보면 된다.
-- ANSI 표준
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE의 SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE의 SAL_LEVEL"
FROM EMPLOYEE E
JOIN SAL_GRADE S ON(SALARY BETWEEN MIN_SAL AND MAX_SAL);
-- 오라클 전용
SELECT
EMP_NAME
, SALARY
, E.SAL_LEVEL "EMPLOYEE의 SAL_LEVEL"
, S.SAL_LEVEL "SAL_GRADE의 SAL_LEVEL"
FROM EMPLOYEE E
, SAL_GRADE S
WHERE SALARY BETWEEN MIN_SAL AND MAX_SAL;
SELF JOIN
- 같은 테이블을 조인하는 경우, 즉 자기 자신과 조인을 하는 방법
-- ANSI 표준
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원이름
, E1.DEPT_CODE
, E1.MANAGER_ID
, E2.EMP_NAME 관리자이름
FROM EMPLOYEE E1
JOIN EMPLOYEE E2 ON(E1.MANAGER_ID = E2.EMP_ID);
-- 오라클 전용
SELECT
E1.EMP_ID
, E1.EMP_NAME 사원이름
, E1.DEPT_CODE
, E1.MANAGER_ID
, E2.EMP_NAME 관리자이름
FROM EMPLOYEE E1
, EMPLOYEE E2
WHERE E1.MANAGER_ID = E2.EMP_ID;
728x90
반응형