데이터베이스/데이터베이스 공부

FROM절 JOIN(INNER JOIN, NATURAL JOIN, USING 조건절, ON 조건절, CROSS JOIN, OUTER JOIN)

아밍나 2022. 9. 3. 00:51
728x90

FROM절 JOIN 형태

- INNER JOIN
- NATURAL JOIN
- USING 조건절
- ON 조건절
- CROSS JOIN
- OUTER JOIN

ANSI/ISO SQL에서 규정한 JOIN 문법은 WHERE 절을 사용하던 기존 JOIN 방식과 차이가 있다.


INNER JOIN

→ WHERE 절에서부터 사용하던 JOIN의 DEFAULT 옵션으로, JOIN 조건에서 동일한 값이 있는 행만 반환.

 CROSS JOIN, OUTER JOIN과는 같이 사용할 수 없다.

NATURAL JOIN

 INNER JOIN의 하위 개념. 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN 수행


WHERE 절에서 JOIN 조건과 데이터 검증 조건이 같이 사용되었을 때 용도가 불분명한 경우가 발생

 WHERE 절의 JOIN 조건을 FROM 절의 ON 조건절로 분리

단, FROM 절에 테이블이 많이 사용될 경우 가독성이 떨어질 수 있다.


INNER JOIN

JOIN 조건에서 동일한 값이 있는 행만 반환.

 WHERE 절에서 사용하던 JOIN 조건을 FROM 절에서 정의하는 것.

 USING 조건절이나 ON 조건절을 필수적으로 사용해야 한다.

//WHERE 절 JOIN 조건
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;

//FROM 절 JOIN 조건
SELECT EMP.DEPTNO, EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO;

→ INNER는 생략 가능.


NATURAL JOIN

두 테이블 간 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN을 수행.

 NATURAL JOIN이 명시되면, USING 조건절, ON 조건절, WHERE 조건절에서 JOIN 조건을 정의할 수 없다.

 SQL Server에서는 지원하지 않는다.

SELECT DEPTNO, EMPNO, ENAME, DNAME
FROM EMP NATURAL JOIN DEPT;

 EMP와 DEPT 테이블에서 공통된 칼럼을 자동으로 인식하여 JOIN을 처리한다.


NATURAL JOIN 특징

- NATURAL JOIN에 사용된 칼럼은 ALIAS나 테이블 명과 같은 접두사를 붙일 수 없다.

 

- JOIN이 되는 테이블의 데이터 성격(도메인)과 칼럼명 등은 동일해야 한다.

 

- 별도의 칼럼 순서를 지정하지 않으면(SELECT *) NATURAL JOIN의 기준이 되는 칼럼들이 다른 칼럼보다 먼저 출력된다.

 

- NATURAL JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리하지만, INNER JOIN은 별개의 칼럼으로 표시한다.


USING 조건절

같은 이름을 가진 칼럼들 중 원하는 칼럼에 대해 선택적으로 EQUI JOIN.

 SQL Server에서는 지원하지 않는다.


USING 조건절 특징

- ALIAS나 테이블 명과 같은 접두사를 붙일 수 없다.

//ERROR
SELECT DEPT.DEPTNO, DEPT.DNAME, DEPT.LOC
FROM DEPT JOIN DEPT_TEMP 
USING (DEPTNO);

//CORRECT
SELECT DEPTNO, DEPT.DNAME, DEPT.LOC
FRFOM DEPT JOIN DEPT_TEMP 
USING (DEPTNO);

- 별도의 칼럼 순서를 지정하지 않으면(SELECT *) USING 조건절의 기준이 되는 칼럼들이 다른 칼럼보다 먼저 출력된다.

 

- USING JOIN은 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리한다.

 

- 두 개의 테이블에서 JOIN 조건에 참여하지 않은 나머지 칼럼두 개의 칼럼으로 표시된다.

ex) 세 개의 칼럼명(LOC, DEPTNO, DNAME)이 같은 테이블 DEPT, DEPT_TEMP이 있을 때 LOC, DEPTNO 두 개 칼럼을 이용

SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (LOC, DEPTNO);

 

USING에 사용된 LOC, DEPTNO가 첫 번째, 두 번째 칼럼으로 출력되고, JOIN 조건에 참여하지 않은 나머지 칼럼(DNAME)은 2개의 칼럼으로 표시된다.

[실행 결과]

ON 조건절

칼럼명이 다르더라도 JOIN 조건을 사용할 수 있다.

ON 조건절 특징

- ALIAS나 테이블 명과 같은 접두사를 사용하여 SELECT에 사용되는 칼럼을 논리적으로 명확하게 지정해줘야 한다.

 

- 임의의 JOIN 조건을 지정하거나, 이름이 다른 칼럼명을 JOIN 조건으로 사용하거나, JOIN 칼럼을 명시하기 위해 ON 조건절을 사용한다.


CROSS JOIN

테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합.

→ 일반 집합 연산자의 PRODUCT의 개념


CROSS JOIN 특징

- 결과: 양쪽 집합의 M * N 건의 데이터 조합이 발생.

 

- WHERE 절에 JOIN 조건을 추가할 수 있으나, 이 경우는 INNER JOIN과 같은 결과를 얻기 때문에 CROSS JOIN을 사용하는 의미가 없어지므로 권고하지 않는다.

 

- 데이터 웨어하우스의 개별 DIMENSION을 FACT 칼럼과 JOIN하기 전에 모든 DIMENSION의 CROSS PRODUCT를 먼저 구할 때 사용하는 경우 사용.


OUTER JOIN

JOIN 조건에서 동일한 값이 없는 행도 반환.

 WHERE 절에서 사용하던 JOIN 조건을 FROM 절에서 정의하는 것.

 USING 조건절이나 ON 조건절을 필수적으로 사용해야 한다.


OUTER JOIN 특징

- 테이블1의 모든 값에 대해 테이블2의 데이터가 반드시 존재한다는 보장이 없을 때 사용


1) LEFT OUTER JOIN

좌측 테이블에 해당하는 데이터를 먼저 읽은 후, 우측 테이블에서 JOIN 대상 데이터를 읽어온다.

→ 좌측 테이블이 기준

 

테이블1과 테이블2를 비교

테이블2의 JOIN 칼럼에서 같은 값이 있을 때 해당 데이터를 가져옴.

테이블2의 JOIN 칼럼에서 같은 값을 없을 때 테이블2에서 가져오는 칼럼들은 NULL.

2) RIGHT OUTER JOIN

우측 테이블에 해당하는 데이터를 먼저 읽은 후, 좌특 테이블에서 JOIN 대상 데이터를 읽어온다.

→ 우측 테이블이 기준

 

테이블1과 테이블2를 비교

테이블1의 JOIN 칼럼에서 같은 값이 있을 때 해당 데이터를 가져옴.

테이블1의 JOIN 칼럼에서 같은 값을 없을 때 테이블1에서 가져오는 칼럼들은 NULL.

3) FULL OUTER JOIN

좌측, 우측 테이블의 모든 데이터를 읽어 JOIN 하여 결과를 생성.

 RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일.

( = UNION 기능, 중복되는 데이터 삭제)


 

728x90
반응형