[SQLD] SQL 활용 - JOIN
JOIN
SQL에서 두 개 이상의 릴레이션을 연결 또는 결합하여 데이터를 출력하는 연산이다.
EQUI(등가) JOIN
JOIN의 가장 기본은 교집합을 만드는 것으로 두 개의 테이블 간 일치하는 것을 JOIN한다.
"=" 제외한 조인의 형태는 NON-EUQI 비등가 조인이라고 한다.
INNER JOIN
ANSI 표준 등가 조인
SELECT *
FROM EMP e
INNER JOIN
DEPT d ON E.DEPTNO = d.DEPTNO
- 결과로 뽑을 컬럼명은 항상 붙여주는 것이 좋음
- ALIAS NAME 꼭 사용할 것
USING절을 사용한 JOIN
SELECT * --E.DEPTNO는 에러남
FROM EMP E
INNER JOIN
DEPT D
USING(DEPTNO)
- USING절 사용 시 컬럼은 as생략
ORACLE 사용 문법
SELECT E.ENAME, D.DEPTNO, D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
- WHERE절 사용
EQUI JOIN 후 실행 계획을 확인해 두 개의 테이블을 어떻게 연결했는지 확인해 보면 각각의 테이블 전체를 읽은 후 (TABLE ACCESS FULL) 해시 함수를 사용해 두 개의 테이블을 연결한다. HASH HOIN은 EQUI JOIN에서만 가능한 방법이다.
HASH JOIN
- 먼저 선행 테이블을 결정하고 선행 테이블에서 주어진 조건(WHRERE)에 해당하는 행을 선택한다.
- 해당 행이 선택되면 조인 키를 기준으로 해시 함수를 사용해 해시 테이블을 메인 메모리에 생성하고 후행 테이블에서 주어진 조건에 만족하는 행을 찾는다
- 후행 테이블의 조인 키를 사용해서 해시 함수를 적용하여 해당 버킷을 검색한다.
NATURAL JOIN
- 두 개 이상의 테이블에서 같은 컬럼값을 기준으로 조회하며 INNER JOIN과 결과는 같음
SELECT *
FROM EMP E
NATURAL JOIN
DEPT D
OUTER JOIN
두 개의 테이블 간에 교집합(EQUI JOIN)을 조회하고 한쪽 테이블에만 있는 데이터도 포함시켜서 조회한다. 왼쪽 테이블에만 있는 행도 포함하면 LEFT OUTER JOIN, 오른쪽 테이블의 행만 포함시키면 RIGHT OUTER JOIN 이라고 한다. LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과를 합쳐 중복값을 제거하는 것은 FULL OUTER JOIN이라고 한다.
ORACLE 문법 - (+)사용
SELECT *
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+) -- LEFT OUTER JOIN
WHERE E.DEPTNO(+) = D.DEPTNO -- RIGHT OUTER JOIN
OUTER JOIN시 주의해야 할 것이 on절에 조건이 걸리면 먼저 걸리고 실행 WHERE 절에 조건이 걸리면 조인이 된 후 걸러져 결과가 달라질 수 있다.
SELECT *
FROM EMP E
LEFT OUTER JOIN
DEPT D ON E.DEPTNO = D.DEPTNO AND D.DEPTNO = 10
WHERE D.DEPTNO = 10 --ON 절 조건과 결과값 다름
FULL OUTER JOIN
LEFT OUTER JOIN 결과와 RIGHT OUTER JOIN 결과를 합쳐 중복값을 제거
SELECT *
FROM EMP e
FULL OUTER JOIN
DEPT d ON e.DEPTNO = d.DEPTNO
CROSS JOIN
조인할 모든 테이블의 경우의수 발생하는 JOIN문이다. 조건구가 없기 때문에 카데시안 곱이 발생한다(ex. 10*10)
SELECT *
FROM EMP E
CROSS JOIN
DEPT D
ORACLE 문법
SELECT *
FROM EMP e, DEPT d
JOIN문 사용 시 실행 순서는 FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY 순으로 실행된다.