본문 바로가기

Lobo's study room/오라클DB

[3일차]JOIN 함수


## SQL - 조인(JOIN)

-- 부서테이블 복사

CREATE TABLE DEPT
AS
SELECT * FROM HR.DEPT;

-- 지역 테이블 복사

CREATE TABLE LOCATIONS
AS
SELECT * FROM HR.LOCATIONS;

-- JOB_GRADES 테이블 복사

CREATE TABLE JOB_GRADES
AS
SELECT * FROM HR.JOB_GRADES;

---------------------------------------

#조인
-하나 이상이 테이블을 합치는 것 (좌우로 합침)
-오라클 전용 조인, ANSI 표준 조인

# 조인의 유형
-EQUI JOIN (등가 조인 : INNER JOIN, NATURAL JOIN )
-NON EQUI JOIN
-OUTER JOIN
-SELF JOIN
-CROSS JOIN

# 오라클 전용 조인

-EQUIL JOIN

이름, 부서명 검색

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP, DEPT
WHERE EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID;

-OUTER JOIN

이름, 부서명 검색. 단, 사원은 모두 검색 => LEFT OUTER JOIN

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP, DEPT
WHERE EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID(+);

이름, 부서명 검색. 단, 부서는 모두 검색 => RIGHT OUTER JOIN

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP, DEPT
WHERE EMP.DEPARTMENT_ID(+)=DEPT.DEPARTMENT_ID;

이름, 부서명 검색. 단, 사원, 부서 모두 검색 => FULL OUTER JOIN

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP, DEPT
WHERE EMP.DEPARTMENT_ID(+)=DEPT.DEPARTMENT_ID(+);
==>지원 안함!!

----------------------------------------------------------------------------

# ANSI 표준 조인

--EQUIL JOIN

이름, 부서명 검색

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP JOIN DEPT 
ON (WHERE EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID);


SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP JOIN DEPT using (DEPARTMENT_ID);

-OUTER JOIN

이름, 부서명 검색. 단, 사원은 모두 검색 => LEFT OUTER JOIN

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP LEFT JOIN DEPT 
ON (WHERE EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID);

이름, 부서명 검색. 단, 부서는 모두 검색 => RIGHT OUTER JOIN

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP RIGHT JOIN DEPT
WHERE (EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID);

이름, 부서명 검색. 단, 사원, 부서 모두 검색 => FULL OUTER JOIN

SELECT LAST_NAME, DEPARTMENT_NAME
FROM EMP FULL JOIN DEPT
WHERE (EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID);

** 조인시 성능 향상을 위한 팁 !
- JOIN, ORDER BY는 시간이 오래 걸린다...
- 테이블 별칭시 AS는 안쓴다!!

SELECT E.LAST_NAME, D.DEPARTMENT_NAME
FROM EMP JOIN DEPT D
ON (WHERE EMP.DEPARTMENT_ID=DEPT.DEPARTMENT_ID);

===============================

#NON-EQUI JOIN

이름, 월급, 월급레벨

SELECT E.LAST_NAME, E.SALARY,J.GRADE_LEVEL
FROM EMP E JOIN JOB_GRADES J
ON (E.SALARY BETWEEN J.LOWEST_SAL AND J.HIGHEST_SAL);

#SELF JOIN
-테이블의 별칭을 다르게 주어 일반적인 조인문법으로 조인한다.
사원이름, 직속상관이름

SELECT E1.LAST_NAME AS 사원이름,E2.LAST_NAME AS 직속상관이름
FROM EMP E1 JOIN EMP E2
ON(E1.MANAGER_ID=E2.EMPLOYEE_ID);

** 여러 테이블 조인하기

SELECT  * 
FROM  A,B,C
WHERE  A.a = B.b and B.c=C.c

SELECT *
FROM A join B on (A.a=B.b)
join C on (B.c=C.c);