PLOD

SQL QUERY [JOIN] 본문

개발 공부/Database

SQL QUERY [JOIN]

훌룽이 2022. 9. 25. 09:42

조인 (join)은 두개 이상의 테이블이나 데이터베이스를 연결하여 데이터를 검색하는 방법이다. 자신이 검색하고 싶은 컬럼이 다른 테이블에 있을 경우 주로 사용하며 여러 개의 테이블을 마치 하나의 테이블인 것처럼 활용하는 방법이다. 테이블들은 PRIMARY KEY - FORIGEN KEY 관계로 연결되는데 테이블들을 연결하려면 적어도 하나의 칼럼은 서로 공유되고 있어야 한다. 

 

JOIN 조건을 생략한 경우나 JOIN 조건이 부적합한 경우에는 카티시안 곱(Cartesian  product)이 출력된다 .올바른 JOIN을 사용하기 위해서는 카티시안이 출력되지 않도록 해야 된다. 카티시안 곱으로 출력되게 되면 사용자가 원하지 않는 결과까지 출력되기 때문에 WHERE 절이나 JOIN (조인 할 테이블) ON 절에 항상 유효한 조인 조건을 지정해야 된다.
(최소 '(테이블 갯수) -1'  의 조건식이 필요함)

 

INNER - JOIN(내부 조인)

두 테이블에서 공통되는 데이터를 기준으로 JOIN하는 것을 내부조인 이라고 한다.

1)  EQUI - JOIN (동등 조인) = NATURAL-  JOIN

일반적으로 가장 많이 사용하는 조인 방식이며 기준 테이블과 JOIN 한 테이블의 중복된 값을 보여준다. 결과값은 A의 테이블과 B 테이블이 모두 가지고 있는 데이터만 검색된다. EQUI-JOIN을 사용하게 되면 아래의 EMP 테이블에서 DEPTNO와 DEPT 테이블에서 DEPTNO 가 같은 튜플들만 조인한 결과를 가지고 온다.

-- ANSI
SELECT EMPNO, ENAME, E.DEPTNO , DNAME, LOC
FROM EMP E
(NATURAL) JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;


-- ORACLE
SELECT EMPNO, ENAME, E.DEPTNO, DNAME, LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;

 

등가 조인이라고도 불리는 EQUI-JOIN은 테이블을 연결한 후에 출력 행을 각 테이블의 특정 열에 일치한 데이터를 기준으로 선정하는 방식이다.  동등 조인은 INNER JOIN 이라고도 불리기도 한다.  

EQUI - JOIN을 사용할 때 유의해야 될 점은 각각의 테이블에서 같은 이름으로 사용되는 애트리뷰트의 경우에는 그 애트리뷰트가 어떤 테이블의 것인지 명시해주어야 한다는 것이다. 

2) NON-EQUI - JOIN(비등가 조인)

비등가 조인은 두 테이블의 같은 원소를 가지고 출력하는 JOIN 방식이 아니라 일정 범위 같은 명확하지 않은 기준에 따라 JOIN 하여 출력하는 방식이다. 

--ORACLE
SELECT EMPNO, ENAME, SAL, GRADE
FROM EMP E, SALGRADE S
WHERE SAL BETWEEN LOSAL AND HISAL;

--ANSI
SELECT EMPNO, ENAME, SAL, GRADE
FROM EMP E
JOIN SALGRADE S
ON SAL BETWEEN LOSAL AND HISAL;

EMP 테이블에 있는 SAL 정보를 대조하여 SALGRADE에 있는 LOSAL, HISAL 기준에 맞게 GRADE를 출력하고 싶다면 등급에 맞는 LOSAL과 HISAL의 사이의 있는 수의 범위 안에 있으면 해당 등급을 출력 할 수 있도록 NON-EQUI-JOIN문을 짜야 된다. 

 

3) SELF - JOIN(자체 조인)

자체 조인은 자기 자신과 똑같은 테이블을 한개 더 복제하여 하나의 테이블에서 서로 다른 레코드들간에 조인이 수행되는 것을 의미한다. 자체 조인은 하나의 테이블을 여러 개의 테이블처럼 활용하여 조인하는 방식으로 앞에서 물러적으로 동일한 테이블 여러 개를 사용할 떄 발생 할 수 있는 문제점을 해결 할 수 있다. 

SELECT E.EMPNO , E.ENAME, E.MGR, M.ENAME
FROM EMP E, EMP M
WHERE E.MGR = M.EMPNO;

EMP 테이블에서 관리자번호(MGR)과 EMP 테이블에서 사원번호(EMPNO)가 같은 조회 결과를 력하기 위해서 SELF-JOIN 방식을 사용해야 한다. FROM 절에 두개의 EMP를 별칭을 다르게 지정하는 방식으로 사용한다.

 

OUTER - JOIN(외부 조인)

조인 조건 데이터 중 어느 한쪽이 NULL 임에도 결과를 출력해야 할 때가 있다. 그럴 때 사용하는 것이 두 테이블 간 조인 수행에서 조인 기준 열의 어느 한쪽이 NULL 이어도 강제로 출력하는 방식을 외부조인이라고 한다. 

-- LEFT OUTER JOIN
SELECT ENAME, E.DEPTNO,DNAME,LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO(+);

-- RIGHT OUTER JOIN
SELECT ENAME, E.DEPTNO,DNAME,LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO(+) = D.DEPTNO;

 

외부 조인은 좌우로 따로 나누어 지정하는데 WHERE 절에 조인 기준 열 중 한쪽에 (+)  기호를 붙여 준다(ORACLE SQL기준) , WHERE 조건의 오른쪽 컬럼에 (+).기호가 붙으면 LEFT - OUTER - JOIN 이고 반대로 왼쪽에 (+) 기호가 붙으면 RIGHT - OUTER - JOIN이다. 

 

1) LEFT OUTER JOIN(LEFT JOIN)

SELECT(컬럼명) FROM (MAIN 테이블 명) LEFT OUTER JOIN (SUB 테이블 명) ON 조건

SELECT ENAME, E.DEPTNO,DNAME,LOC
FROM EMP E
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;

 

2) RIGHT OUTER JOIN(RIGHT JOIN)

SELECT(컬럼명)FROM(MAIN 테이블 명) RIGHT OUTER JOIN (SUB 테이블 명) ON 조건

 

전에 했전 LEFT OUTER JOIN의 반대라고 생각하면 된다. 조인이 되어지는 테이블을 기준으로 JOIN한다고 생각하면 된다.

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

 

3) FULL OUTER JOIN 

SELECT(컬럼명)FROM(MAIN 테이블 명) FULL OUTER JOIN (SUB 테이블 명) ON 조건

 

전체 외부 조인은 왼쪽 , 오른쪽 외부 조인을 모두 적용한 , 왼쪽열이 NULL이 아닌 경우와 오른쪽 열이 NULL인 경우를 모두 출력하는 방식이다. FULL OUTER JOIN을 사용하여 양 쪽 모두 외부 조인된 결과를 출력할 수 있다

SELECT E.EMPNO, E.ENAME, E.MGR, M.EMPNO, M.ENAME
FROM EMP E
FULL OUTER JOIN EMP M
ON E.EMPNO = M.EMPNO;

 

* JOIN 문법 정리

더보기

SELECT table1.column, table2.column
FROM table1 
[CROSS JOIN table2] OR
[NATURAL JOIN table2] OR
[JOIN table2 USING (column_name)] OR
[JOIN table2
ON(table1.column_name=table2.column_name)] OR
[LEFT | RIGHT | FULL [OUTER] JOIN table2 
ON(table1.column_name=table2.column_name)];

 

 

'개발 공부 > Database' 카테고리의 다른 글

[DB] schema 와 instance  (0) 2022.10.25
[DB Modeling] Re-introduction to Database  (0) 2022.10.25
SQL QUERY [DDL, DML]  (0) 2022.09.23
SQL QUERY [SELECT]  (0) 2022.09.23
[DB] 데이터베이스의 정의와 용어  (0) 2022.09.23
Comments