728x90

 

JOIN 

INNER JOIN, OUTER JOIN

오라클 전용구문, ANSI 표준구문

-- 04.JOIN ★★★

/*
JOIN이란?
하나 이상의 테이블에서 데이터를 조회하기 위해 사용
여러개의 테이블들을 연결하여 데이터를 조회


<JOIN 세부 종류>
1.내부 조인
데이터가 ‘같은 부분’끼리 연결
위의 특성 때문에 해당하지 않는 데이터는 제외하고 반환됨
    1)오라클 전용구문 
        FROM절에 해당 테이블 모두 기술
        테이블끼리 연결하는 부분은 WHERE을 통해 연결
    2)ANSI 표준구문
        FROM절에 해당되는 테이블 모두 기술
        JOIN 구문 이용 
            JOIN + ON : 두 데이터값이 다른 이름일 때
            JOIN + USING : 두 데이터값이 같은 이름일 때
            but, 이름이 같더라도 JOIN + ON 사용가능

2.외부 조인
데이터가 같지 않은 행도 조인에 포함
내부 조인의 공통 데이터만 추출하는 특성에서 한쪽만 충족하는 데이터를 더 가져 올 수 있게 한 조인
    1)오라클 전용구문
        맞춰주는 테이블(기준이 아닌 테이블)의 컬럼 쪽에 (+)
    2)ANSI 표준구문 : 좀 더 LEFT, RIGHT 직관적
        LEFT OUTER JOIN
        RIGHT OUTER JOIN
        FULL OUTER JOIN : 양쪽 다 기준
        (OUTER)는 생략 가능


*/

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

--1.내부조인(Inner join)
--    1)오라클 전용 구문
--          컬럼명이 같으면 어느 테이블 컬럼인지 지정해줘야함 : 테이블명.컬럼명으로 지정
--    2)ANSI 표준 구문
--          내가 연결할 컬럼의 이름이 다를 때 = ON 사용
--          내가 연결할 컬럼이 이름이 같을 때 = USING 사용
--               컬럼 이름이 같다고 해서 무조건 USING 사용? X  


-- 사번, 이름, 부서코드, 부서명
-- 오라클 전용 구문
SELECT EMP_ID, EMP_NAME, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID -- 결과값 21개. 부서코드가 NULL인 직원은 제외
ORDER BY DEPT_ID;         

-- ANSI 표준 구문
SELECT EMP_ID, EMP_NAME, DEPT_ID, DEPT_TITLE
FROM EMPLOYEE
    JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);


-- 사번, 사원명, 직급코드, 직급명 // 각 사원에 대한 직급명 조회
-- 오라클 전용 구문
-- ANSI 표준 구문
-- 풀이과정
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE "E", JOB "J"
WHERE E.JOB_CODE = J.JOB_CODE; -- 23행
-- JOIN ~ ON
SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB_NAME
FROM EMPLOYEE
    JOIN JOB ON(EMPLOYEE.JOB_CODE = JOB.JOB_CODE);
SELECT EMP_ID, EMP_NAME, EMPLOYEE.JOB_CODE, JOB.JOB_NAME
FROM EMPLOYEE
    JOIN JOB ON(EMPLOYEE.JOB_CODE = JOB.JOB_CODE);
-- JOIN ~ USING
SELECT EMP_ID, EMP_NAME, JOB_CODE, JOB_NAME
FROM EMPLOYEE
    JOIN JOB USING(JOB_CODE); 
-- USING 쓰면 FROM EMPLOYEE테이블에 JOB테이블을 조인시키면서 명시되므로,
-- USUNG()안에 JOB.이라고 명시할 필요X
    
-- < ANSI 표준 구문>
-- 내가 연결할 컬럼의 이름이 다를 때 = ON 사용
-- 내가 연결할 컬럼이 이름이 같을 때 = USING 사용
--      컬럼 이름이 같다고 해서 무조건 USING 사용? X  

-- 테이블명 EMPLOYEE에 별칭 사용 연결
-- 오라클 전용구문
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE "E", JOB "J"
WHERE E.JOB_CODE = J.JOB_CODE; -- 23행
-- ANSI 표준 구문
SELECT EMP_ID, EMP_NAME, E.JOB_CODE, J.JOB_NAME
FROM EMPLOYEE "E"
    JOIN JOB "J" ON(E.JOB_CODE = J.JOB_CODE); -- 23행


-- 부서명과 해당 부서의 지역명 조회
-- 오라클 전용 구문
-- ANSI 표준 구문
SELECT D.DEPT_TITLE, L.LOCAL_NAME
FROM DEPARTMENT "D", LOCATION "L"
WHERE D.LOCATION_ID = L.LOCAL_CODE;
-- 오라클 전용 구문
-- 경로지정X & 별칭X
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT, LOCATION
WHERE LOCATION_ID = LOCAL_CODE;  -- 9행 인사관리부	ASIA1
-- ANSI 표준 구문
SELECT DEPT_TITLE, LOCAL_NAME
FROM DEPARTMENT
    JOIN LOCATION ON(LOCATION_ID = LOCAL_CODE); -- 9행 인사관리부	ASIA1


------------------------------------------------------------------------------
------------------------------------------------------------------------------
-----------------------------2.외부조인(Outer join)-----------------------------
------------------------------------------------------------------------------
/*
내부 조인의 한계
매칭이 안되는 값이 있으면 조인해서 가져올 수 없는 한계
-> 보완하는 것이 외부조인
내부조인 개념이 일치하는 것을 가져오는 것

 2.외부조인(Outer join)
 컬럼 값이 일치하지 않는 행도 조인에 포함시킴
 아우터 조인 무조건 명시해야함

종류
1.LEFT (OUTER) JOIN
2.RIGHT (OUTER) JOIN
3.FULL (OUTER) JOIN
    - 오라클 구문은 풀아우터 조인 사용불가
- (OUTER) : 생략가능
    

*/ 

-- INNER JOIN
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
    JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); 
    -- 21행 : DEPT_CODE가 NULL인 사람은 제외(매칭X)



SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
    JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); -- 21행 : DEPT_CODE가 NULL인 사람은 제외(매칭X)
    

--1.LEFT (OUTER) JOIN
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
    LEFT OUTER JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID);

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE = DEPT_ID(+);


-- 내부조인과 차이
-- 내부조인에서는 부서코드가 NULL인 직원은 제외되고 21행 나왔지만
-- LEFT OUTER JOIN은 NULL인 직원 2명도 포함했기에 23행 출력
 
/* 
내 기준으로 왼쪽에 있는 얘를 기준으로 삼겠다
즉 EMPLOYEE가 기준
디파트가 임플한테 맞춰주는 것. 
그래서 오라클 전용구문에서 표기가 기준점이 되는 테이블이 아닌 조이하는 테이블(+) 붙임
ex)WHERE DEPT_CODE = DEPT_ID(+);


<강사쌤 설명>
--레프트 라이트 조인 기준으로 왼쪽이면 임플로이 오른쪽이면 디파트
--레프트는 임플이 기준이라 임플로이 전부를 출력함(23개행). 내부조인 하면 하동운,이오리 안나옴.
--임플이 기준이라 NULL값도 출력을 해줌
--디파트가 임플 맞춰줘야함->23개행이 나올 수 있도록 

<내가 한 이해>
레프트 라이트 조인 기준으로 왼쪽이면 임플로이 오른쪽이면 디파트
임플로이에는 EMP_NAME에서 사원명 가져오는데 이게 23명이고,
디파에서는 DEPT_TITLE에서 부서명 가져오는데 이건 21개. 부서배정이 아직인 2명이
NULL로 나오는데 임플 기준이라 23행 맞춰줘야하니 부서명이 없는 2명은 NULL로 표시

 
Q.EMPLOYEE안에 DEPT_CODE가 있으니까 DEPT_CODE안에 NULL이 있어도 일단 쓰고, 
  DEPARTMENT를 DEPT_CODE에 맞춰서 나온거죠,,?
A.YES

*/


 
 
--2.RIGHT (OUTER) JOIN
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID;

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
    RIGHT OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID);

-- ★양쪽 테이블의 매칭된 데이터 + 가져오길 원하는 한쪽 집합의 데이터★

--3.FULL (OUTER) JOIN
-- 둘 다 기준이 된다
SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE, DEPARTMENT
WHERE DEPT_CODE(+) = DEPT_ID(+);
-- ERROR :  a predicate may reference only one outer-joined table
-- 오라클 구문으로는 기준을 하나만 정할 수 있어 풀아우터조인은 사용불가

SELECT EMP_NAME, DEPT_TITLE
FROM EMPLOYEE
    FULL OUTER JOIN DEPARTMENT ON(DEPT_CODE = DEPT_ID); 
-- 26행 출력 : 
-- LEFT의 부서배정안된 22이오리23하동운 NULL 데이터 + RIGHT의 부서만 있고 직원 없는 
-- (NULL) 해외영업3부,마케팅부,국내영업부해서 
-- 내부조인 결과 21행에 LEFT 2행+ RIGHT 3행 = 21+2+3= 총26행
728x90
반응형

+ Recent posts