-
SQL - JOINDataBase/Oracle 2022. 1. 20. 21:02728x90반응형
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반응형'DataBase > Oracle' 카테고리의 다른 글
SQL - RANK, DENSE_RANK (0) 2022.01.22 SQL - SUBQUERY (0) 2022.01.21 SQL - SET OPERATION (0) 2022.01.20 SQL - ROLLUP, CUBE, GROUPING, GROUPING SETS (0) 2022.01.20 SQL - ORDER BY, GROUP BY, HAVING (0) 2022.01.19