티스토리 뷰
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;
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;
'DATABASE > 이론' 카테고리의 다른 글
[DB] 집합 연산자 - UNION , UNION ALL , INTERSECT , MINUS (0) | 2020.01.06 |
---|---|
[DB] [ORACLE] SUBQUERY ( 서브 쿼리 ) (0) | 2020.01.06 |
[DB] [ORACLE] TOP N QUERY - ROWNUM ( 조회한 결과에 순위 매기기 ) (0) | 2019.12.31 |
[DB] 분석 함수 3 - 다중 행 함수 ( 집계함수 , 그룹함수 ) , GROUP BY , HAVING (0) | 2019.12.31 |
[DB] 분석 함수 2 - 날짜 함수 , 변환 함수 , 기타 함수 (0) | 2019.12.31 |