티스토리 뷰

JOIN ( 조인 ) 이란 ?

  • 둘 이상의 테이블을 연결하여 데이터를 검색하는 방법

  • 일반적으로 테이블의 식별값인 PRIMARY KEY와 테이블 간 공통값인 FOREIGN KEY를 사용하여 조인합니다.

  • EQUI JOIN

  • NON-EQUI JOIN

  • SELF JOIN

  • INNER JOIN

  • CROSS JOIN

  • OUTER JOIN

    • LEFT OUTER JOIN

    • RIGHT OUTER JOIN

    • FULL OUTER JOIN

 

 

EQUI JOIN (등가 조인)

  • 컬럼값이 일치되는 행을 연결하여 결과 생성

  • 가장 일반적으로 사용하는 '='에 의한 조인

/* EMP 테이블과 DEPT 테이블을 조인하여 직원들의 부서명을 조회해보자. */
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

 

 

 

 

NON-EQUI JOIN (비등가 조인)

  • 테이블의 어떤 컬럼도 JOIN할 테이블의 컬럼과 일치하지 않을 때 사용

  • BETWEEN~AND, IS NULL, IS NOT NULL, IN, NOT IN을 사용

/* EMP 테이블과 SALGRADE 테이블을 이용해 연봉 등급을 구해보자. */
SELECT E.ENAME, E.SAL, S.GRADE
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

/* ANSI 표준구문으로 */
SELECT ENAME, SAL, GRADE
FROM EMP JOIN SALGRADE ON (SAL BETWEEN LOSAL AND HISAL);

 

 

 

 

SELF JOIN

  • 자기 자신과 EQUI JOIN을 하는 것

  • 하나의 테이블에 대해 두 개의 ALIAS를 이용해 조인

/* EMP 테이블에서 사원과 그 사원의 매니저를 조회해보자. */
SELECT 사원.EMPNO, 사원.ENAME 사원, 매니저.EMPNO, 매니저.ENAME 매니저
FROM EMP 사원, EMP 매니저
WHERE 사원.MGR = 매니저.EMPNO;

/* ANSI 표준구문으로 */
SELECT 사원.EMPNO, 사원.ENAME 사원, 매니저.EMPNO, 매니저.ENAME 매니저
FROM EMP 사원 JOIN EMP 매니저
ON 사원.MGR = 매니저.EMPNO;

 

 

 

 

INNER JOIN

  • 일반적인 JOIN에서 INNER JOIN 절을 사용 (INNER 키워드는 생략 가능)

  • WHERE 절 대신 ON 절 사용

  • 동일한 컬럼명이 JOIN 조건일 때, ANSI에서는 USING 키워드를 제공합니다.

/* ON절 사용 */
SELECT E.EMPNO, E.ENAME, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

/* USING절 사용 */
SELECT EMPNO, ENAME, DNAME
FROM EMP INNER JOIN DEPT
USING (DEPTNO);

 

 


 

다른 예제로 알아보기

DROP TABLE X,S,M;

/* M 테이블 */
CREATE TABLE M(
	M1 CHAR(6),
	M2 VARCHAR(10)
);

INSERT INTO M VALUES('A','1');
INSERT INTO M VALUES('B','1');
INSERT INTO M VALUES('C','3');
INSERT INTO M VALUES(NULL, '3');

/* S 테이블 */
CREATE TABLE S(
	S1 CHAR(6),
	S2 VARCHAR(10)
);

INSERT INTO S VALUES('A','X');
INSERT INTO S VALUES('B','Y');
INSERT INTO S VALUES(NULL, 'Z');

/* X 테이블 */
CREATE TABLE X(
	X1 CHAR(6),
	X2 VARCHAR(10)
);

INSERT INTO X VALUES('A','DATA');

 

 

 

 

INNER JOIN

  • 한쪽 컬럼에 값이 없다면 해당 행은 조회되지 않습니다.

SELECT *
FROM M INNER JOIN S
ON M1 = S1;

JOIN될 조건이 부합하는 행만 조회됩니다.

 

 

OUTER JOIN (+)

  • JOIN 조건을 만족하지 못하는 행들까지 조회하고 싶을 때 사용

  • 조회하고 싶은 쪽에 (+) 를 쓰면 됩니다.

RIGHT OUTER JOIN

(+) 연산자를 왼쪽에

왼쪽 테이블에 NULL이 있어도 오른쪽 테이블의 모든 행이 출력됩니다.

SELECT *
FROM M RIGHT OUTER JOIN S
ON M1 = S1;

SELECT *
FROM M, S
WHERE M1(+) = S1;

 

LEFT OUTER JOIN

(+) 연산자를 오른쪽에

오른쪽 테이블에 NULL이 있어도 왼쪽 테이블의 모든 행이 출력됩니다.

SELECT *
FROM M LEFT OUTER JOIN S
ON M1 = S1;

SELECT *
FROM M, S
WHERE M1 = S1(+);

 

FULL OUTER JOIN

어느 쪽이든 NULL을 포함하는 행이 있더라도 모두 출력됩니다.

SELECT *
FROM M FULL OUTER JOIN S
ON M1 = S1;

 

 

CROSS JOIN

  • 두 테이블의 모든 JOIN 데이터 결과를 조회하고 싶을 때 사용

SELECT *
FROM M CROSS JOIN S;

최근에 올라온 글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Total
Today
Yesterday