조인을 그렇게 많이 봤는데 제대로 이해하지 못했다는 것을 깨달았다.
갑자기 툭 던지면 바로 뽑아낼 수 있도록 오라클의 조인에 대해서 적어보고자 한다.
전 POST에서는 LEFT OUTER JOIN과 RIGHT OUTER JOIN, FULL OUTER JOIN만 다뤘다.
이번 POST에선 좀 더 다양한 형태의 조인을 설명하고자 한다.
이미지 출처 : https://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
SQL
SELECT A.*
FROM EMPLOYEE A
, DEPT B
WHERE A.DEPT_CD = B.DEPT_CD(+);
SELECT A1.EMP_CD AS EMP_CD
FROM EMPLOYEE A1
WHERE A1.DEPT_CD IN (
SELECT B.DEPT_CD
FROM DEPT B
WHERE A1.DEPT_CD IS NOT NULL
)
UNION ALL -- union이나 union all을 쓸 경우 위의 select에서만 'AS 별칭' 설정한다면 아래도 자동 설정된다.
SELECT A2.EMP_CD
FROM EMPLOYEE A2
WHERE A2.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM DEPT B
WHERE A2.DEPT_CD IS NOT NULL
);
SELECT A.EMP_CD AS EMP_CD
FROM EMPLOYEE A
WHERE EXISTS(
SELECT 'x'
FROM DEPT B
WHERE A.DEPT_CD = B.DEPT_CD
)
UNION ALL
SELECT A.EMP_CD
FROM EMPLOYEE A
WHERE NOT EXISTS(
SELECT 'x'
FROM DEPT B
WHERE A.DEPT_CD = B.DEPT_CD
)
-- 사실 이게 가장 효율적인 코드이다.
SELECT *
FROM EMPLOYEE;
-- 1.
SELECT A.DEPT_CD
, A.DEPT_NM
, A.DEPT_UP_CD
FROM DEPT A
, EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD(+)
GROUP BY A.DEPT_CD, A.DEPT_NM, A.DEPT_UP_CD;
-- 2.
SELECT DISTINCT A.*
FROM DEPT A
, EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD(+);
SELECT A.DEPT_CD DEPT_CD
FROM DEPT A
WHERE A.DEPT_CD IN (
SELECT B.DEPT_CD
FROM EMPLOYEE B
)
UNION ALL
SELECT A.DEPT_CD
FROM DEPT A
WHERE A.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM EMPLOYEE B
WHERE B.DEPT_CD IS NOT NULL
)
SELECT A.DEPT_CD AS DEPT_CD
FROM DEPT A
WHERE EXISTS(
SELECT 'x'
FROM EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD
)
UNION ALL
SELECT A.DEPT_CD
FROM DEPT A
WHERE NOT EXISTS(
SELECT 'x'
FROM EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD
);
-- B(DEPT)테이블만 뽑는거라면 이게 가장 효율적이다.
SELECT *
FROM DEPT;
SELECT *
FROM EMPLOYEE A
, DEPT B
WHERE A.DEPT_CD = B.DEPT_CD;
-- 1.
SELECT A.DEPT_CD
FROM EMPLOYEE A
WHERE A.DEPT_CD IN (
SELECT B.DEPT_CD
FROM DEPT B
);
-- 2.
SELECT A.DEPT_CD
FROM DEPT A
WHERE A.DEPT_CD IN (
SELECT B.DEPT_CD
FROM EMPLOYEE B
WHERE B.DEPT_CD IS NOT NULL
GROUP BY B.EMP_CD
);
SELECT A.DEPT_CD
FROM EMPLOYEE A
WHERE EXISTS (
SELECT 'x'
FROM DEPT B
)
AND A.DEPT_CD IS NOT NULL;
SELECT A.DEPT_CD
FROM DEPT A
WHERE EXISTS (
SELECT 'x'
FROM EMPLOYEE B
where A.DEPT_CD = B.DEPT_CD
);
SELECT A.*
FROM EMPLOYEE A
, DEPT B
WHERE A.DEPT_CD = B.DEPT_CD(+)
AND A.DEPT_CD IS NULL;
SELECT A2.EMP_CD
FROM EMPLOYEE A2
WHERE A2.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM DEPT B
WHERE A2.DEPT_CD IS NOT NULL
);
SELECT A.EMP_CD
FROM EMPLOYEE A
WHERE NOT EXISTS(
SELECT 'x'
FROM DEPT B
WHERE A.DEPT_CD = B.DEPT_CD
);
SELECT A.*
FROM DEPT A
, EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD(+)
AND B.DEPT_CD IS NULL;
SELECT A.DEPT_CD
FROM DEPT A
WHERE A.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM EMPLOYEE B
WHERE B.DEPT_CD IS NOT NULL
);
SELECT A.DEPT_CD
FROM DEPT A
WHERE NOT EXISTS(
SELECT 'x'
FROM EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD
);
SELECT A.DEPT_CD
FROM EMPLOYEE A
UNION ALL
SELECT A.DEPT_CD
FROM DEPT A
, EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD(+)
AND B.DEPT_CD IS NULL;
SELECT A.DEPT_CD
FROM EMPLOYEE A
UNION ALL
SELECT A.DEPT_CD
FROM DEPT A
WHERE A.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM EMPLOYEE B
WHERE B.DEPT_CD IS NOT NULL
);
SELECT A.DEPT_CD
FROM EMPLOYEE A
UNION ALL
SELECT A.DEPT_CD
FROM DEPT A
WHERE NOT EXISTS (
SELECT 'x'
FROM EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD
);
SELECT A.DEPT_CD
FROM DEPT A
, EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD(+)
AND B.DEPT_CD IS NULL
UNION ALL
SELECT A.DEPT_CD
FROM EMPLOYEE A
, DEPT B
WHERE A.DEPT_CD = B.DEPT_CD(+)
AND A.DEPT_CD IS NULL;
SELECT A.DEPT_CD
FROM DEPT A
WHERE A.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM EMPLOYEE B
WHERE B.DEPT_CD IS NOT NULL
)
UNION ALL
SELECT A2.DEPT_CD
FROM EMPLOYEE A2
WHERE A2.DEPT_CD NOT IN (
SELECT B.DEPT_CD
FROM DEPT B
WHERE A2.DEPT_CD IS NOT NULL
);
SELECT A.DEPT_CD
FROM DEPT A
WHERE NOT EXISTS(
SELECT 'x'
FROM EMPLOYEE B
WHERE A.DEPT_CD = B.DEPT_CD
)
UNION ALL
SELECT A.DEPT_CD
FROM EMPLOYEE A
WHERE NOT EXISTS(
SELECT 'x'
FROM DEPT B
WHERE A.DEPT_CD = B.DEPT_CD
)
느낀 점