본문 바로가기
SQL(Oracle)/Oracle 이론 정리

[Oracle] JOIN

by ProSeraphina 2020. 8. 12.

Join: 두 개 이상의 테이블을 합쳐서 원하는 값들을 출력하는 기능

  →테이블에 컬럼이 많을 경우 중복되는 데이터가 존재할 가능성이 커짐. 이러한 비효율성을 방지하기 위해

    '정규화(:하나로 된 것을 더 작은 단위로 분리하는 기술)' 수행. 정규화 후에 여러개의 테이블로 흩어져 저장된 데이터

    들을 조합해서 가져오는 기술이 조인(Join)임. 

 

#Join 문법: 네 가지 모두 호환(아래의 쿼리문은 모두 같은 결과)

  Oracle JOIN
  : 오라클에서만 사용하는
    쿼리문장
  SELECT empno, ename, job, mgr, hiredate, 
  sal, comm, e.deptno, dname, loc
  FROM emp e, dept d 
  WHERE e.deptno=d.deptno;

***e,d는 별칭,
  컬럼명 다른 경우에는 테이블(별칭) 생략 가능

  ANSI JOIN
  : 모든 데이터베이스 표준
  SELECT empno, ename, job, mgr, hiredate, 
  sal, comm, e.deptno, dname, loc 
  FROM emp e JOIN dept d 
  ON e.deptno=d.deptno;
  NATURAL JOIN   SELECT empno, ename, job, mgr, hiredate, 
  sal, comm, deptno, dname, loc 
  FROM emp NATURAL JOIN dept 
;
  JOIN~USING   SELECT empno, ename, job, mgr, hiredate,
  sal, comm, deptno, dname, loc
  FROM emp JOIN dept USING(deptno); ( ) :연결고리 컬럼명

 

#Join 종류

1.  INNER JOIN(→교집합) →NULL값 처리 불가

  Q. 사원 이름, 직속 상사의 이름을 출력하시오(직속 상사가 있는 인원만 출력).
  A. SELECT e1.ename "본인", e2.ename "사수"

      FROM empe1,empe2
      WHERE e1.mgr=e2.empno;

  EQUI_JOIN
  : 등가조인, 조건절에서 = 사용
  NON_EQUI_JOIN
  : 비등가조인, 
   (주로 비교연산자, BETWEEN~AND)
  SELECT empno, ename, job, mgr, hiredate, 
  sal, comm, e.deptno, dname, loc 
  FROM emp, dept 
  WHERE emp.deptno=dept.deptno;
  SELECT empno, ename, job, mgr, hiredate,
  sal, comm, deptno, grade
  FROM emp, salgrade
  WHERE sal BETWEEN losal AND hisal;

+)혼합해서 사용 가능

  Q. (사번, 사원이름, 직급, 직속상사 번호, 입사일, 월급, 커미션,)-emp테이블, (부서번호,)-emp+dept테이블,

      (부서이름, 소재지,)-dept테이블, (급여등급)-emp(sal)+salgrade(grade)테이블을 입력하시오.

  A.

 ((ANSI 문법)) 

   SELECT empno, ename, job, mgr, hiredate, sal, comm, empdeptno, dname, loc, grade

   FROM emp 

   JOIN dept ON emp.deptno=dept.deptno (→EQUI_JOIN)
   JOIN salgrade ON sal BETWEEN losal AND hisal; (→NON_EQUI_JOIN)

 

((Oracle 문법))

  SELECT empno, ename, job, mgr, hiredate, sal, comm, emp.deptno, dname, loc, grade 
  FROM emp, dept, salgrade
  WHERE emp.deptno=dept.deptno
  AND sal BETWEEN losal and hisal; 

 

2. OUTER JOIN: 공통 데이터 없어도 포함 →NULL값 처리 가능

1)LEFT OUTER JOIN

  Q. 사원 이름, 직속 상사의 이름을 출력하시오(직속상사가 없는 인원도 출력).
  A. SELECT e1.ename "본인", e2.ename "사수"  
      FROM emp e1, emp e2 
      WHERE e1.mgr=e2.empno(+);

((ANSI)) SELECT e1.ename "본인", e2.ename "사수"  

            FROM emp e1 LEFT OUTER JOIN emp e2

            ON e1.mgr=e2.empno;

  **SELF_JOIN 사용: 같은 테이블 내에서 데이터를 연결하는 경우. 테이블명이 같기 때문에 반드시 별칭 필요
 ***왼쪽에서 데이터를 갖고와서 오른쪽에 붙임(Left Outer Join)

 

2)LEFT OUTER JOIN(RIGHT OUTER JOIN과 방향만 반대)

3)FULL OUTER JOIN(=UNION, ANSI JOIN이 간단)

'SQL(Oracle) > Oracle 이론 정리' 카테고리의 다른 글

[Oracle] SUBQUERY  (0) 2020.11.10
[Oracle] SEQUENCE  (0) 2020.08.24
[Oracle] 정규식 함수/그룹함수  (2) 2020.08.10
[Oracle] 단일행 함수  (1) 2020.08.06
[Oracle] SELECT / WHERE / GROUP BY / HAVING / ORDER BY  (0) 2020.08.05

댓글