SELF 조인은 같은 테이블 끼리 특정 컬럼을 기준으로 매칭 되는 컬럼을 출력하는 조인이다.
즉, 같은 테이블의 데이터를 각각의 집합으로 분류한 후 조인한다.
1-2. SELF 조인 문법
1 2 3 4 5 6 7 8
SELECT A.COL_1, A.COL_2, ..., B.COL_1, B.COL_3, ... FROM TABLE_NAME AS A INNERJOIN TABLE_NAME AS B -- THE SAME TABLE WITH THE FORMER ON A.COL_T = B.COL_T
SELECT E.FIRST_NAME || ' ' || E.LAST_NAME AS EMPLOYEE, M.FIRST_NAME || ' ' || M.LAST_NAME AS MANAGER FROM EMPLOYEE E -- EMPLOYEE 중심 INNERJOIN EMPLOYEE M -- MANAGER 중심 ON E.MANAGER_ID = M.EMPLOYEE_ID -- 매칭 시 헷갈리지 않도록 주의 ORDERBY MANAGER
>> SELF LEFT OUTER 조인 실습
MISSION:
각 직원의 상위 관리자를 출력하면서 모든 직원을 출력
최고관리자인 'Windy Hays’가 결과 집합에 포함시킴
1 2 3 4 5 6 7 8 9 10 11
SELECT E.FIRST_NAME || ' ' || E.LAST_NAME AS EMPLOYEE, M.FIRST_NAME || ' ' || M.LAST_NAME AS MANAGER FROM EMPLOYEE E LEFTOUTERJOIN EMPLOYEE M ON E.MANAGER_ID = M.EMPLOYEE_ID ORDERBY MANAGER
>> 부정형 조건 실습
MISSION: FILM 테이블에서 영화의 상영시간이 동일한 서로 다른 영화의 리스트를 출력
SELECT A.TITLE, B.TITLE, A.LENGTH FROM FILM A INNERJOIN FILM B ON A.FILM_ID != B.FILM_ID AND A.LENGTH = B.LENGTH
2. FULL OUTER 조인
2-1. 개념
FULL OUTER 조인은 INNER, LEFT OUTER, RIGHT OUTER 조인 집합을 모두 출력하는 조인 방식이다.
즉, 두 테이블간 출력가능한 모든 데이터를 포함한 집합을 출력한다.
2-2. FULL OUTER 조인 문법
1 2 3 4 5 6 7 8 9
SELECT A.COL_A1, A.COL_A2, ..., B.COL_B1, B.COL_B2, ... FROM TABLE_A A FULLOUTERJOIN TABLE_B B ON A.COL_Z_A = B.COL_Z_B
2-3. FULL OUTER 조인 실습
2-3-1. BASKET 데이터를 활용한 간단한 실습
>> FULL OUTER JOIN
(1) LEFT ONLY + LEFT&RIGHT + RIGHT ONLY
1 2 3 4 5 6 7 8 9 10 11
SELECT A.ID ID_A, A.FRUIT FRUIT_A, B.ID ID_B, B.FRUIT FRUIT_B FROM BASKET_A A FULLOUTERJOIN BASKET_B B ON A.FRUIT = B.FRUIT
(2) ONLY OUTER (LEFT ONLY + RIGHT ONLY)
1 2 3 4 5 6 7 8 9 10 11 12 13
SELECT A.ID ID_A, A.FRUIT FRUIT_A, B.ID ID_B, B.FRUIT FRUIT_B FROM BASKET_A A FULLOUTERJOIN BASKET_B B ON A.FRUIT = B.FRUIT WHERE A.ID ISNULL-- LEFT OUTER OR B.ID ISNULL-- RIGHT OUTER
2-3-2. 추가 실습
>> 실습 준비
1 2 3 4 5 6 7 8 9 10 11 12 13 14
CREATETABLE IFNOTEXISTS DEPARTMENTS -- 종재하지 않으면 생성 ( DEPARTMENT_ID SERIAL PRIMARY KEY, DEPARTMENT_NAME VARCHAR (255) NOTNULL );
SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E FULLOUTERJOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
>> RIGHT OUTER ONLY 실습
1 2 3 4 5 6 7 8 9 10 11
-- 소속한 직원이 없는 부서만 출력 -- FULL OUTER + RIGHT ONLY SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E FULLOUTERJOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID WHERE E.EMPLOYEE_NAME ISNULL
[P.S.] FULL OUTER JOIN+ RIGHT ONLY = RIGHT OUTER JOIN+ RIGHT ONLY
1 2 3 4 5 6 7 8 9 10
-- RIGHT OUTER + RIGHT ONLY SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E RIGHTOUTERJOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID WHERE E.EMPLOYEE_NAME ISNULL
>> LEFT OUTER ONLY 실습
1 2 3 4 5 6 7 8 9 10 11
-- 소속한 부서가 없는 직원만 출력 -- FULL OUTER + LEFT ONLY SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E FULLOUTERJOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID WHERE D.DEPARTMENT_NAME ISNULL
[P.S.] FULL OUTER JOIN+ LEFT ONLY = LEFT OUTER JOIN+ LEFT ONLY
1 2 3 4 5 6 7 8 9 10
-- LEFT OUTER + LEFT ONLY SELECT E.EMPLOYEE_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E RIGHTOUTERJOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID WHERE D.DEPARTMENT_NAME ISNULL
3. CROSS 조인
3-1. 개념
두 개의 테이블의 CATESIAN PRODUCT 연산의 결과를 출력한다. 데이터 복제에 많이 쓰이는 기법이다.
CATESIAN PRODUCT:
3-2. CROSS 조인 문법
1 2 3 4 5 6
SELECT * FROM CROSS_TABLE_1 CROSSJOIN CROSS_TABLE_2
SELECT * FROM PRODUCTS A NATURALJOIN CATEGORIES B;
1 2 3 4 5 6 7 8 9 10
-- 대체 방법 1 -- INNER JOIN으로 실현 SELECT P.CATEGORY_ID, P.PRODUCT_ID, P.PRODUCT_NAME, C.CATEGORY_NAME FROM PRODUCTS P INNERJOIN CATEGORIES C ON P.CATEGORY_ID = C.CATEGORY_ID;
1 2 3 4 5 6 7 8
-- 대체 방법 2 (INNER JOIN 대체 명령어) SELECT P.CATEGORY_ID, P.PRODUCT_ID, P.PRODUCT_NAME, C.CATEGORY_NAME FROM PRODUCTS P, CATEGORIES C WHERE P.CATEGORY_ID = C.CATEGORY_ID;
(2) “dvdrental” 데이터를 활용한 실습
>> 테이블 구성
>> 실습
두 테이블이 모두 “country_id” 컬럼이 존재한다.
이 두 테이블에 대해서 NATURAL JOIN을 진행해보면:
1 2 3 4 5 6
SELECT * FROM CITY A NATURALJOIN COUNTRY B;
기대와 다르게 출력 결과가 0건이다.
그 이유는:
두 테이블 간에 동일한 이름으로 존재하는 컬럼이 COUNTRY_ID 외에 LAST_UPDATE 도 존재한다. 이런 경우 NATURAL JOIN 시에는 LAST_UPDATE 컬럼까지 INNER조인에 성공해야만 결과값이 나온다. 하지만 두 테이블의 LAST_UPDATE 값이 서로 다르므로 위 SQL문을 실행 후 조건에 만족하는 결과가 없다.
따라서 NATURAL 조인이 아닌 INNER 조인을 이용해야한다.
1 2 3 4 5 6 7
SELECT * FROM CITY A INNERJOIN COUNTRY B ON A.COUNTRY_ID = B.COUNTRY_ID;
INNER 조인으로 ON절에 조인 컬럼을 명시하였고, 의도한 대로 데이터가 출력되었다.
1 2 3 4 5 6 7
-- INNER JOIN 대체 명령어 SELECT * FROM CITY A, COUNTRY B WHERE A.COUNTRY_ID = B.COUNTRY_ID;