1. 조인(JOIN)
1) EQUI (등가) 조인 (교집합)
- 조인! 교집합을 만드는 것이 기본
- WHERE
- 두 개의 테이블 간에 일치하는 것을 조인
- “ = ”을 사용해서 두 개의 테이블을 연결
- 조인문에 추가조건 및 정렬을 할 수 있음
SELECT * FROM EMP, DEPT WHERE EMP.DEPNO = DEPT.DEPNO; |
2) Non-EQUI (비등가) 조인
- >, <, >=, <= 등 비교연산자 사용하는 조인. “ = ”사용 아님! (요건 조인)
- Non-EQUI 조인은 정확하게 일치하지 않는 것을 조인하는 것
3 FROM절 조인
(1) INNER JOIN
- JOIN 조건에서 동일한 값이 있는 행만 반환
- FROM절 안에 INNER JOIN구로 테이블을 서술하고 ON구로 조인 조건을 서술
SELECT * FROM EMP INNER JOIN DEPT ON EMP.DEPNO = DEPT.DEPTNO; |
- DEPT 테이블과 EMP테이블 전체를 읽은 다음(TABLE ACCESS FULL) 해시함수를 사용해서 해시 조인을 함
- 해시함수는 테이블을 해시 메모리에 적재한 후 해시함수로써 연결하는 방법
- 해시 조인은 EQUI 조인만 사용 가능
(2) NATURAL JOIN
- 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행
- 추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없음
- JOIN이 되는 테이블의 데이터 성격(도메인)과 칼럼명 등이 동일해야 하는 제약 조건
SELECT DEPTNO, EMPNO, ENAME, DNAME FROM EMP NATURAL JOIN DEPT; |
(3) USING 조건절
- FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음
SELECT * FROM DEPT JOIN DEPT_TEMP USING (DEPTNO); |
(4) ON 조건절
- JOIN 서술부(ON)와 비 JOIN 서술부(WHERE)를 분리 -> ON 조건절과 WHERE 검색 조건은 충돌 없이 사용 가능
- 임의의 JOIN 조건을 지정하거나, 이름이 다른 칼럼명을 JOIN 조건으로 사용하거나, JOIN 칼럼 명시하기 위해 사용
SELECT E.ENAME, E.DEPTNO, D.DEPTNO, D.DNAME FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO) WHERE E.DEPTNO = 30; |
- 검색 조건 목적인 경우는 WHERE 절을 사용 (ON 조건절에 JOIN 조건 외에도 데이터 검색 조건을 추가는 가능)
(5) OUTER JOIN
- 두 개의 테이블 간에 교집합을 조회(EQUI JOIN)하고 한쪽 테이블에만 있는 데이터도 포함시켜 조회
- 조인 수행 시 한쪽 테이블에 해당하는 데이터를 먼저 읽어 들이고 나중 테이블에서 JOIN대상 데이터를 읽어옴
- Oracle DB에서는 “(+)” 기호 사용 가능
① LEFT OUTER JOIN
- 두 개의 테이블에서 같은 것을 조회하고 왼쪽 테이블에만 있는 것을 포함해서 조회
SELECT * FROM DEPT LEFT OUTER JOIN EMP ON EMP.DEPTNO = DEPT.DEPTNO ; | SELECT * FROM DEPT, EMP WHERE EMP.DEPTNO (+) = DEPT.DEPTNO; |
- (+)를 사용한 OUTER JOIN의 (+) 위치는 LEFT에 있는 DEPT의 반대편에 붙어있음
② RIGHT OUTER JOIN
- 두 개의 테이블에서 같은 것을 조회하고 오른쪽 테이블에만 있는 것을 포함해서 조회
SELECT * FROM DEPT RIGHT OUTER JOIN EMP ON EMP.DEPTNO = DEPT.DEPTNO ; | SELECT * FROM DEPT, EMP WHERE EMP.DEPTNO = DEPT.DEPTNO (+); |
- (+)를 사용한 OUTER JOIN의 (+) 위치는 RIGHT에 있는 EMP의 반대편에 붙어있음
③ FULL OUTER JOIN
- LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 형태
SELECT * FROM DEPT FULL OUTER JOIN EMP ON EMP.DEPTNO = DEPT.DEPTNO; |
(5) CROSS JOIN
- 조인 조건 구 없이 2 개의 테이블을 하나로 조인
- 조인 구가 없기 때문에 카테시안 곱(교차곱 : 두 테이블의 모든 데이터를 조합하여 연산)이 발생
-> 테이블 1의 카디널리티 * 테이블 2의 카디널리티 = CROSS JOIN의 카디널리티
- FROM 절에 CROSS JOIN 구를 사용함
SELECT * FROM EMP CROSS JOIN DEPT; |
2. 집합연산자
- 두 개 이상의 테이블에서 조인 사용하지 않고 연관된 테이블 조회하는 방법
- 여러 개의 질의 결과를 연결하여 하나로 결합하는 것
(1) UNION
- 두 개의 테이블을 합집합 하는 연산 -> 중복된 데이터 제거! (합집합은 (집합A+집합B)-A와B의 교집합)
- 두 개의 테이블을 하나로 합치되, 두 테이블의 칼럼수, 칼럼의 데이터 형식 모두 일치해야 함
- 중복된 데이터를 제거하므로 정렬(SORT)과정이 발생
SELECT DEPTNO FROM EMP UNION SELECT DEPTNO FROM DEPT; |
(2) UNION ALL
- 두 개의 테이블을 그냥(중복 제거, 정렬 없이) 하나로 합치는 것 -> 단순히 결과만 합친 꼴
- 일반적으로 여러 질의 결과가 상호 배타적인 경우 많이 사용
SELECT DEPTNO FROM EMP UNION ALL SELECT DEPTNO FROM DEPT; |
(3) MINUS / EXCEPT
- 두 개의 테이블에서 차집합을 만드는 연산
- 먼저 쓴 SELECT 문에는 있고 뒤에 쓰는 SELECT 문에는 없는 집합을 조회하는 것
- MY-SQL에서는 MINUS와 동일한 연산이 EXCEPT
SELECT DEPTNO FROM EMP MINUS SELECT DEPTNO FROM DEPT; |
(4) INTERSECT 연산
- 두 개의 테이블에서 교집합을 조회하는 연산
SELECT DEPTNO FROM EMP INTERSECT SELECT DEPTNO FROM DEPT; |
**NATURAL JOIN / JOIN USING
'[자격증] SQLD (SQL Developer)' 카테고리의 다른 글
[SQLD][책없이 공부]2과목 02. SQL 활용_03 서브쿼리 (0) | 2019.11.26 |
---|---|
[SQLD][책없이 공부]2과목 02. SQL 활용_02 계층형 조회, 셀프 조인 (0) | 2019.11.26 |
[SQLD][책없이 공부]2과목 01. SQL 기본_06 DCL, TCL (0) | 2019.11.18 |
[SQLD][책없이 공부]2과목 01. SQL 기본_05 DECODE와 CASE문, ROWNUM과 ROWID (0) | 2019.11.14 |
[SQLD][책없이 공부]2과목 01. SQL 기본_04 함수 (0) | 2019.11.14 |