티스토리 뷰

수업/└Oracle

[CH_08] 조인(JOIN)

onlyun 2022. 1. 14. 10:53

 

 

조인

테이블 가로 연결(집합 연산자 : 세로 연결)

 

FROM절에 여러 테이블 지정

SELECT
  FROM 테이블1, 테이블2, 테이블3 ...

 

**WHERE절을 사용한 조건을 걸지 않으면 데카르트 곱 현상 발생.

SELECT *
  FROM EMP, DEPT
 ORDER BY EMPNO;

EMP의 DEPTNO 하나에 DEPT의 DEPTNO가 하나씩 연결되어 총 54개 행 발생. 데카르트 곱

→ WHERE 절을 사용해 조인. (이게 조인 테이블 개수 -1 해준 거?)

--EMP의 부서번호와 DEPT의 부서번호 연결
SELECT *
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO
 ORDER BY EMPNO;
 
--FROM의 테이블 이름도 별칭 사용 가능
--테이블 이름 띄우고 적으면 별칭 부여. 
SELECT *
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO
 ORDER BY EMPNO;

'.'을 찍어 별칭 표현할 수 있고 출력시 '.'은 출력되지 않음.

 

(1) 등가 조인(equi join) =

열 이름을 비교하는 조건식으로 조인(WHERE 조건절을 사용함으로써 테이블 개수 -1한 거? 데카르트 곱 발생 노)

--EMP의 부서번호와 DEPT의 부서번호 연결
SELECT *
  FROM EMP, DEPT
 WHERE EMP.DEPTNO = DEPT.DEPTNO
 ORDER BY EMPNO;

 

※ 테이블 이름 별칭 적용과 표현 ※

--테이블 이름을 별칭으로 표현
SELECT *
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO
 ORDER BY EMPNO;

--두 데이블에서 부서 번호가 똑같은 열 이름으로 포함되어 있을 때 - EMP의 DEPTNO, DEPT의 DEPTNO
--테이블 이름 띄우고 적으면 별칭 부여. 
--'.'을 찍어 별칭 표현 / 출력시 .은 출력되지 않음.
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DNAME, D.LOC
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO;

 

※ WHERE절에 조건식을 넣어 출력할 수 있음  ※

SELECT E.EMPNO, E.ENAME, E.SAL, E.DEPTNO, D.DNAME, D.LOC
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO
   AND E.SAL >=3000;

 

(2) 비등가 조인 <, <=, >, >=

--급여 범위에 따른 등급 부여표
SELECT *
  FROM SALGRADE;
  
--급여 범위를 지정하는 조건식으로 조인
--
SELECT *
FROM EMP E, SALGRADE S
WHERE E.SAL BETWEEN S.LOSAL AND S.HISAL;

 

(3) 자체 조인

하나의 테이블을 여러 테이블처럼 사용

--같은 테이블을 두 번 사용하여 자체 조인
SELECT
    E1.EMPNO, E1.ENAME, E1.MGR,
    E2.EMPNO AS MGR_EMPNO,
    E2.ENAME AS MGR_ENAME
  FROM EMP E1, EMP E2
 WHERE E1.MGR = E2.EMPNO;

 

(4) 외부 조인

왼쪽 외부 조인, 오른쪽 외부 조인. NULL 데이터 출력!

--왼쪽 외부 조인 : WHERE TABLE1.COL1 = TABLE2.COL1(+)
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
    E2.EMPNO AS MGR_EMPNO,
    E2.ENAME AS MGR_ENAME
  FROM EMP E1, EMP E2
 WHERE E1.MGR = E2.EMPNO(+)
 ORDER BY E1.EMPNO;

--오른쪽 외부 조인 : WHERE TABLE1.COL1(+) = TABLE2.COL1
SELECT E1.EMPNO, E1.ENAME, E1.MGR,
    E2.EMPNO AS MGR_EMPNO,
    E2.ENAME AS MGR_ENAME
  FROM EMP E1, EMP E2
 WHERE E1.MGR(+) = E2.EMPNO
 ORDER BY E1.EMPNO;

 

※ SQL-99 표준 문법 ※

오라클 외에서도 사용할 수 있는 조인 문법

 

(1) NATURAL JOIN : 등가 조인과 같은 결과 출력

연결할 명은 별칭없이 적어줌(DEPTNO)

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
       DEPTNO, E.ENAME, D.LOC
  FROM EMP E NATURAL JOIN DEPT D
 ORDER BY DEPTNO, E.EMPNO;

 

(2) JOIN ~ USING ( 연결할 명 )

연결할 명은 별칭없이 적어줌(DEPTNO)

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
       DEPTNO, E.ENAME, D.LOC
  FROM EMP E JOIN DEPT D USING (DEPTNO)
 WHERE SAL >= 3000
 ORDER BY DEPTNO, E.EMPNO;

(3) JOIN ~ ON( )

괄호 사이에 직접 조건 명시

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
       D.DEPTNO,
       D.DNAME, D.LOC
  FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO)
  WHERE SAL <= 3000
  ORDER BY E.DEPTNO, E.DEPTNO;

 

(4) INNER JOIN ~ ON

공통인 영역 가져옴.

SELECT E.EMPNO, E.ENAME, E.JOB, E.MGR, E.HIREDATE, E.SAL, E.COMM,
       D.DEPTNO,
       D.DNAME, D.LOC
FROM EMP E INNER JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);

 

※  오라클 외부 조인ANSI 표준문법으로 바꾸기 ※

--OUTER JOIN : JOIN 조건에서 동일한 값이 없는 행도 반환할 때 사용. NULL값 같은.

조건에 맞지 않는 데이터도 출력하고 싶을 때.

 

--왼쪽 외부 조인 : WHERE TABLE1.COL1 = TABLE2.COL1(+)

--왼쪽 테이블 기준 조인. 왼쪽 테이블의 NULL 출력.

--왼쪽 테이블 기준으로 오른쪽 테이블의 데이터를 참조해옴.  참조해올 값이 없을 경우 NULL값으로 가져옴.

SELECT E1.EMPNO, E1.ENAME, E1.MGR,
    E2.EMPNO AS MGR_EMPNO,
    E2.ENAME AS MGR_ENAME
  FROM EMP E1 LEFT OUTER JOIN EMP E2 ON(E1.MGR = E2.EMPNO)
 ORDER BY E1.EMPNO;

 

--오른쪽 외부 조인 : WHERE TABLE1.COL1(+) = TABLE2.COL1

--오른쪽 테이블 기준 조인. 오른쪽 테이블의 NULL 출력.

--오른쪽 테이블을 기준으로 왼쪽 테이블 데이터를 참조해옴. 역시 참조해올 값이 없을 경우, NULL값 가져옴.

SELECT E1.EMPNO, E1.ENAME, E1.MGR,
    E2.EMPNO AS MGR_EMPNO,
    E2.ENAME AS MGR_ENAME
  FROM EMP E1 RIGHT OUTER JOIN EMP E2 ON(E1.MGR = E2.EMPNO)
 ORDER BY E1.EMPNO;

 

--세 개 이상의 테이블 조인. 조인할 만큼 나열

 FROM TABLE1, TABLE2, TABLE3
WHERE TABLE1.COL = TABLE2.COL
  AND TABLE2.COL = TABLE3.COL
  AND TABLE3.COL = TABLE4.COL;

-ANSI 표준 INNER JOIN

FROM TABLE1 INNER JOIN TABLE2 ON (TABLE1.COL = TABLE2.COL)
            INNER JOIN TABLE3 ON (TABLE2.COL = TABLE3.COL)
            INNER JOIN TABLE4 ON (TABLE3.COL = TABLE4.COL);

'수업 > └Oracle' 카테고리의 다른 글

주말(01.15~16) 연습문제  (0) 2022.01.17
[CH10]데이터 조작(DML) : 데이터 추가(INSERT), 수정(UPDATE), 삭제(DELETE)  (0) 2022.01.17
[CH07]다중행 함수  (0) 2022.01.13
[함수]_문자  (0) 2022.01.07
[CH05]WHERE, 연산자  (0) 2022.01.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/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
글 보관함