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)-AB의 교집합)

- 두 개의 테이블을 하나로 합치되, 두 테이블의 칼럼수, 칼럼의 데이터 형식 모두 일치해야 함

- 중복된 데이터를 제거하므로 정렬(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

+ Recent posts