JOIN
여러개의 테이블을 이용하면 테이블들을 같이 연결해줄 수 있는 DML이 있다.
JOIN은 여러개의 연결된 테이블을 검색하는 방법이다. "연결된" 테이블이기 때문에, 기본키와 외래키를 이용하여 연결한다.
따라서 전제조건은 최소한 하나의 필드는 두 테이블이 공유하고 있어야한다는 점이다.
JOIN 방법
기본키와 외래키는 보통 같은 이름을 사용하는 경우가 많기 때문에, 이를 구분하기 위해서 예명을 사용해준다.
SELECT table1.col1, table2.col2,...
FROM table1, table2 WHERE table1.fk=table2.pk;
SELECT
table1.col1, table2.col2,...
FROM table1
JOIN table2 ON table1.fk=table2.pk;
Equijoin(동등 조인)
조인 조건이 정확히 일치하는 경우다.
-- emp테이블의 사원명, 급여, dept테이블의 부서명을 선택하라
SELECT e.ename, e.sal, d.deptno, d.dname FROM emp e, dept d WHERE e.deptno=d.deptno;
SELECT e.ename, e.sal, d.dname FROM emp e JOIN dept d ON e.deptno=d.deptno;
서브쿼리를 이용해서 조인해줄 수도 있다.
-- [문제] SALESMAN의 사원번호, 이름, 급여, 부서명, 근무지를 출력하라
SELECT
e.empno, e.ename, e.sal, d.dname, d.loc
FROM (SELECT empno, ename, sal, deptno FROM emp WHERE job IN 'SALESMAN') e
JOIN dept d ON e.deptno=d.deptno;
Non-Equijoin(비동등 조인)
조인 조건이 정확히 일치하지 않는 경우이다.
대표적으로 등급, 학점이 있다. 81~90점은 B, 91~100점은 A 이렇게 범위로 정해져있을때의 경우를 말한다.
이럴땐 JOIN절에 조건문을 붙여서 범위를 설정해주어야 한다.
-- 급여등급을 표시하자
SELECT
e.ename, e.sal, s.grade
FROM emp e
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
Self Join
어쩔땐 자기 자신을 조인해야하는 경우도 있다.
-- 사원의 관리자를 선택하라
SELECT
e1.empno, e1.ename, e1.job, e1.mgr,
e2.empno, e2.ename, e2.job
FROM emp e1
JOIN emp e2 ON e1.mgr=e2.empno;
위 3가지를 조합한 JOIN문을 살펴보자.
-- [문제] e사원명, e급여, d부서명, m관리자명, e입사일, s호봉을 선택하라
SELECT
e.ename name, e.sal,
d.dname dept, m.ename manager, e.hiredate, s.grade
FROM emp e
JOIN dept d ON e.deptno=d.deptno
JOIN emp m ON e.mgr=m.empno
JOIN salgrade s ON e.sal BETWEEN s.losal AND s.hisal;
Outer Join(외부 조인)
테이블을 JOIN할 시 한 쪽 테이블에 일치하는 행이 없으면 다른 쪽에 NULL로 표시해준다.
예를 들어 PRESIDENT인 KING에게는 관리자가 없다. 그래서 위에서 사원의 관리자를 선택하라고 했을 때, KING은 아예 목록에 없다.
하지만 OUTER JOIN을 사용하면 KING도 선택되고, 관리자의 데이터에는 NULL로 표시된다.
관리자가 없는 사원도 있지만 관리할 사람이 없는 사원 또한 마찬가지로 관리자 목록에 표시되지만, 관리하는 사원은 NULL일 것이다.
SELECT
e1.empno, e1.ename, e1.job, e1.mgr,
e2.empno, e2.ename, e2.job
FROM emp e1
LEFT/RIGHT/FULL OUTER JOIN emp e2 ON e1.mgr=e2.empno;
LEFT, RIGHT, FULL
관리자가 없는 사원을 선택하고 관리자를 NULL로 표시할지, 반대로 관리하는 사원이 없는 사원을 선택하고 관리하는 사원을 NULL로 표시할지, 아니면 아예 둘 다 표시할지는 LEFT, RIGHT, FULL로 정해진다.
당연히 FULL은 양쪽 전부 표시하는것이고, LEFT/RIGHT 방향만 제대로 알아보자.
두 테이블 중 NULL데이터가 발생하는 쪽의 반대편을 가리키면 된다.
KING을 선택하고 관리자를 NULL로 표시한다면, KING을 선택해오는 테이블을 가리키면 된다.
SELECT
e.ename, e.job, e.mgr, m.empno, m.ename
FROM emp e
LEFT JOIN emp m ON e.mgr=m.empno;
e테이블에서 KING을 불러왔으니, m테이블을 가리키면 된다는 뜻이다.
'Database' 카테고리의 다른 글
11.23.(수) OracleDB(14): VIEW 테이블 (0) | 2022.11.27 |
---|---|
11.22.(화) OracleDB(13): 실습테이블(4) (0) | 2022.11.26 |
11.21.(월) OracleDB(11): 실습테이블(3) (0) | 2022.11.23 |
11.21.(월) OracleDB(10): 실습테이블(2) (0) | 2022.11.22 |
11.21.(월) OracleDB(9): 제약조건 (0) | 2022.11.22 |