SQL- 표준조인

박현·2022년 10월 15일
1

SQL

목록 보기
19/34

ANSI/ISO SQL에서 표시하는 FROM절의 조인형태는 다음과 같다.

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

INNER JOIN

INNER JOIN은 OUTER조인과 대비해 내부 조인이라고 하며 조인조건을 만족하는 행들만 반환한다.
INNER JOIN 표시는 전통적인 방식의 조인 문법에서는 WHERE절에 기술하던 조인 조건을 FROM절에서 정의하겠다는 표시이므로 USING조건절이나 ON조건절을 필수적으로 사용해야 한다.

사원 번호화 사원이름, 소속부서 번호와 소속부서 이름을 출력

위의 요구사항을 SQL로 작성하면 아래와 같다.

입력 ✏️

SELECT A.EMPNO
	 , A.ENAME
     , B.DEPTNO
     , B.DNAME
 FROM EMP A 
 INNER JOIN DEPT B
 ON B.DEPTNO = A.DEPTNO;

출력 💻


NATURAL JOIN

두 테이블 간에 동일한 이름을 갖는 모든 컬럼들에 대해 EQUI JOIN을 수행한다. 추가로 USING, ON, WHERE절에서 조인조건을 정의할 수 없다.

사원 번호와 사원이름, 소속부서번호와 소속부서이름 출력

입력 ✏️

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

출력 💻

위의 SQL은 별도의 조인컬럼을 지정하지 않았다. 두개의 테이블에서 DEPTNO라는 공통된 컬럼을 자동으로 인식해 조인을 처리하였다.
조인에 사용된 컬럼들은 같은 데이터 유형이어야 하며, ALIAS나 테이블명과 같은 접두사를 붙일수 없다.


USING 조건절

FROM절의 USING조건절을 이용하면 같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN을 할 수있다.

입력 ✏️

SELECT *
  FROM DEPT A JOIN DEPT_TEMP B 
 USING (DEPTNO);

출력 💻


ON 조건절

조인 서술부(ON조건절)와 비조인 서술부(WHERE)를 분리해 이해가 쉬우며, 컬럼명이 다르더라도 조인조건을 사용할 수 있는 장점이 있다.

입력 ✏️

SELECT A.EMPNO
	 , A.ENAME
     , B.DEPTNO
     , B.DNAME
 FROM EMP A JOIN DEPT B
   ON B.DEPTNO = A.DEPTNO;

출력 💻

ON 조건절을 사용한 조인의 경우 이름이 같은 컬럼들에 대해 ALIAS나 테이블명과 같은 접두사를 명확하게 지정해주어야 한다.

ON 조건절은 WHERE 절의 조인조건과 같은 기능을 하면서도, 명시적으로 조인의 조건을 구분할 수 있다. 다만 FROM절에 테이블이 많이 사용될 경우 다소 복잡하게 보여 가독성이 떨어지는 단점이 있다.

다중테이블 조인

사원과 DEPT테이블의 소속부서명, DEPT_TEMP테이블의 바뀐 부서명 정보를 출력

입력 ✏️

SELECT A.EMPNO
     , A.DEPTNO
     , B.DNAME
     , C.DNAME AS NEWNAME
  FROM EMP A JOIN DEPT B
    ON B.DEPTNO = A.DEPTNO
  JOIN DEPT_TEMP C
    ON C.DEPTNO = B.DEPTNO;

출력 💻


CROSS JOIN

두개의 테이블에 대한 CROSS PRODUCT와 같은 표현으로, 결과는 양쪽 집합의 M*N건의 데이터 조합이 발생한다.

사원, 부서테이블을 CROSS JOIN해 사원이름 및 소속부서이름을 출력

입력 ✏️

SELECT A.ENAME
     , B.DNAME
  FROM EMP A CROSS JOIN DEPT B
  ORDER BY A.ENAME;

출력 💻

emp 14건 * demp 4건의 데이터 총 56건의 결과가 출력되었다.

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


OUTER JOIN

OUTER JOIN 역시 조인 조건을 FROM절에 정의하겠다는 표시이므로 USING조건절이나 ON조건절을 필수적으로 사용해야 한다.

LEFT OUTER JOIN

  • Table A 와 B가 있을때 (Table A가 기준이 됨) A와 B를 비교해서 B의 조인칼럼에 조인조건을 만족하는 값이 있으면 해당 로우의 데이터를 가져오고, 조인조건을 만족하는 값이 없는 경우에는 B테이블에서 가져오는 컬럼들은 NULL값으로 채운다.

RIGHT OUTER JOIN

  • Table A 와 B가 있을때 (Table B가 기준이 됨) A와 B를 비교해서 B의 조인칼럼에 조인조건을 만족하는 값이 있으면 해당 로우의 데이터를 가져오고, 조인조건을 만족하는 값이 없는 경우에는 A테이블에서 가져오는 컬럼들은 NULL값으로 채운다.

DEPT에 등록된 부서중에는 사원이 없는 부서도 있다. DEPT와 EMP를 조인하되 사원이 없는 부서정보도 같이 출력

위의 요구사항을 SQL로 작성하면 아래와 같다.

입력 ✏️

SELECT A.ENAME
      ,B.DEPTNO
      ,B.DNAME
      ,B.LOC
 FROM EMP A RIGHT OUTER JOIN DEPT B
   ON B.DEPTNO = A.DEPTNO;

출력 💻

FULL OUTER JOIN

조인 수행 시 좌측, 우측 테이블의 모든 데이터를 읽어 조인해 결과를 만들어낸다. 즉 테이블A와 B가있을때 RIGHT OUTER JOIN과 LEFT OUTER JOIN의 결과를 합집합으로 처리한 결과와 동일하다.

DEPTNO 기준으로 DEPT와 DEPT_TEMP데이터를 FULL OUTER JOIN으로 출력

입력 ✏️

SELECT * 
  FROM DEPT A FULL OUTER JOIN DEPT_TEMP B
   ON B.DEPTNO = A.DEPTNO;

출력 💻

INNER JOIN이라면 부서번호가 동일한 30,40부서의 정보만 출력됐을 것이다. 하지만 FULL OUTER JOIN을 사용했으므로 DEPT테이블에만 있는 부서번호 10,20,의 부서정보와 DEPT_TEMP테이블에만 있는 부서번호 50,60의 부서정보까지 동시에 출력됐다.


참고자료 : SQL전문가가이드

0개의 댓글