DB

SQL Join

짱코딩러 2022. 8. 4. 21:01

조인은 두 개의 테이블을 서로 묶어서 하나의 결과를 만들어 내는 것을 말한다.

 

 

 

Cross Join

두 테이블 데이터의 모든 조합

조인 결과가 의미를 가지려면 조인할 때 조건을 지정해야 한다.

SELECT 칼럼명
FROM 기준 테이블, 대상 테이블;

<ANSI Cross Join>

SELECT *
FROM EMP CROSS JOIN DEPT;

 

 

Equi Join & Non-Equi Join

Equi Join

가장 많이 사용하는 조인 방법.

조인 조건식에 '='를 사용한다.

한개의 테이블의 열의 정보를 알고있고 그것에 대한 다른 테이블의 정보(공통 컬럼)를 알고 싶을때 사용

동일한 이름의 컬럼은 컬럼 명 앞에 테이블 명[별칭]을 기술함으로서 컬럼이 어느 테이블 소속인지 구분할 수 있게 된다. 

각 사원들이 소속된 부서의 상세 정보를 출력하기 위해서 두 개의 테이블을 조인한 예시
SELECT *
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO;
이름이 SCOTT인 사람의 부서명을 출력하는 예시
SELECT ENAME, DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO=D.DEPTNO
AND ENAME='SCOTT';

 

Non-Equi Join

'=' 연산자 이외의 비교 연산자를 사용한다.(Between, >, >=, <, <= 등)

등급의 최소 범위인 losal과 최대 범위인 hisal에 들었는지 확인하고 급여와 등급을 출력하는 예시
SELECT ENAME, SAL, GRADE
FROM EMP, SALGRADE
WHERE SAL BETWEEN LOSAL AND HISAL;

 

Self Join

하나의 테이블 내에서 조인 할 때 사용(자기 자신과 조인)

별칭을 붙여 구분해준다.

사원과 사원의 관리자를 출력하는 예시
SELECT e.ename, e.job, m.ename, m.job
FROM emp e, emp m
WHERE e.mgr = m.empno;

 

Inner Join

기준 테이블과 조인 테이블 모두에 조인 컬럼 데이터가 존재해야 조회됨

ANSI Inner Join

조인 정보를 ON절에 기술하여 조인 조건을 명확하게 지정하고

다른 조건에 대해서는 WHERE 구문에서 지정

(Oracle Join)
SELECT a.empno , a.ename , a.deptno , b.dname
FROM emp a INNER JOIN dept b
WHERE a.job = 'MANAGER'
AND a.deptno = b.deptno;
(ANSI Join)
SELECT a.empno , a.ename , a.deptno , b.dname
FROM emp a INNER JOIN dept b
ON a.deptno = b.deptno
WHERE a.job = 'MANAGER';

 

USING

두 개의 테이블이 내부 조인으로 조인 될 때, 조인하고자 하는 두 테이블의 컬럼명이 같을 경우

조인 조건을 길게 적지 않고 간단하게 적을 수 있도록 하는 역할(간단하게 적어도 공통 칼럼을 인식해줌)

SELECT EMP.ENAME, DEPT.DNAME
FROM EMP INNER JOIN DEPT
ON EMP.DEPTNO = DEPT.DEPTNO

SELECT EMP.ENAME, DEPT.DNAME
FROM EMP INNER JOIN DEPT
USING (DEPTNO);

NATURAL Join

두 테이블에 각각 조인을 정의한 컬럼의 이름이 동일하다면 USING 절에서 조인할 컬럼을 지정하여 

구문을 더 간단하게 표현할 수 있다. (공통칼럼을 적어주지 않아도 자동으로 인식해줌)

SELECT e.ENAME, d.DNAME
FROM EMP e NATURAL JOIN DEPT d;

USING과 NATURAL Join은 함께 사용할 수 없다.

 

 

Outer Join

내부 조인은 두 테이블에 모두 데이터가 있어야만 결과가 나오지만, 외부 조인은 한쪽에만 데이터가 있어도 결과가 나옴.

조인시킬 값이 없는 조인측에 "(+)"를 붙여주면 그 테이블의 데이터가 누락 없이 모두 조회된다.

 

LEFT OUTER JOIN

왼쪽 테이블을 기준으로 데이터가 출력되고 조건에 맞는 오른쪽 테이블의 컬럼이 같이 출력된다.

왼쪽 테이블은 전체가 출력되므로, 오른쪽 테이블에 참조할 값이 없으면 NULL이 나온다.

(Oracle Join)
SELECT
TB1.*, TB2.NAME
FROM TB1, TB2
WHERE TB1.NUM = TB2.NUM(+)
(ANSI Join)
SELECT TB1.*, TB2.NAME
FROM TB1 LEFT OUTER JOIN TB2
ON TB1.NUM = TB2.NUM

 

RIGHT OUTER JOIN

오른쪽 테이블을 기준으로 데이터가 출력되고 조건에 맞는 왼쪽 테이블의 컬럼이 같이 출력된다.

오른쪽 테이블은 전체가 출력되므로, 왼쪽 테이블에 참조할 값이 없으면 NULL이 나온다.

SELECT TB1.*, TB2.NAME
FROM TB1, TB2
WHERE TB1.NUM(+) = TB2.NUM

SELECT TB1.*, TB2.NAME
FROM TB1 RIGHT OUTER JOIN TB2
ON TB1.NUM = TB2.NUM

 

FULL OUTER JOIN

LEFT OUTER JOIN 과 RIGHT OUTER JOIN을 합친 것으로, 

양쪽 모두 조건이 일치하지 않는 것까지 모두 결합해 출력한다.

SELECT TB1.*, TB2.NAME
FROM TB1, TB2
WHERE TB1.NUM(+) = TB2.NUM(+)  =>오류. 한 쪽에만 (+)를 붙일 수 있다

SELECT TB1.*, TB2.NAME
FROM TB1 FULL OUTER JOIN TB2
ON TB1.NUM = TB2.NUM

 

 

 

 

'DB' 카테고리의 다른 글

SQL DDL DML +트랜잭션  (0) 2022.08.05
SQL 서브 쿼리  (0) 2022.08.04
SQL 함수  (0) 2022.08.03
SQL WHERE, GROUP BY, HAVING , ORDER BY절  (0) 2022.08.03
SQL*Plus 명령어, 오라클 계정 생성  (0) 2022.08.02