Oracle - 조인(JOIN)

KDG·2021년 2월 21일
0

조인(JOIN)

  • 여러 테이블에 저장된 데이터를 한 번에 조회해야 할 필요가 있을 때 사용

  • 두 개 이상의 테이블을 결합

1. CROSS JOIN

  • 카테시안 곱(Cartesian Product) : 두 Table의 모든 행들이 무조건 결합하여 Table들에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것

  • 두 테이블 이상의 모든 조합을 표시하는 것

  • 한 쪽 테이블의 모든 행들과 다른 테이블의 모든 행을 조인

  • 특별한 키워드 없이 SELECT 문의 FROM절에 조인 할 테이블을 콤마로 연결하여 사용

ex)

 SELECT * FROM dept, emp
 
 전체 칼럼 수는 사원 테이블(emp)의 칼럼 수(8)와 부서 테이블(dept)의 칼럼 수(3)을 더한 11개
 전체 로우 수는 사원 한 명에 대해 dept 테이블 4개의 로우와 결합되어 14*456

2. EQUI JOIN

  • 두 테이블에서 공통 칼럼을 가지고, 같은 값을 가지는 행을 연결하여 결과를 생성하는 조인 방법

  • INNER JOIN

  • 형식

SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2
  • WHERE 절에 조인을 위한 칼럼명과 '=' 연산자를 사용하여 조인
# emp, dept 테이블의 deptno 컬럼으로 연결해서 전체 출력

SELECT * 
FROM emp, dept 
WHERE emp.deptno = dept.deptno;

# WEHRE 절에 조건추가하기

SELECT * 
FROM emp, dept 
WHERE emp.deptno = dept.deptno
AND empno = 7844;

# 모호한 칼럼명 자세히 지정

SELECT empno, ename, dname, deptno
FROM emp, dept 
WHERE emp.deptno = dept.deptno
AND emp.empno = 7844;
-> 오류 발생. deptno 부분이 두 테이블의 공통된 칼럼이라서 출력하고 싶은 칼럼의 테이블명을 명확하게 표시해줘야 한다.

SELECT empno, ename, dname, emp.deptno
FROM emp, dept 
WHERE emp.deptno = dept.deptno
AND emp.empno = 7844;

  • JOIN ~ USING
    조인하고자 하는 칼럼의 이름이 같을 때 WHERE 절의 '=' 사용하지 않고 JOIN ~ USING 키워드를 사용 가능
SELECT empno, ename, dname, deptno
FROM emp JOIN dept 
USING (deptno)
WHERE emp.empno = 7844;

  • JOIN ~ ON
    임의의 조건을 지정하거나 조인할 칼럼을 지정하려면 WHERE 절의 '=' 사용하지 않고 JOIN ~ ON 키워드를 사용 가능
SELECT empno, ename, dname, emp.deptno
FROM emp JOIN dept 
ON emp.deptno = dept.deptno
WHERE emp.empno = 7844;

3. NON-EQUI JOIN

  • 조인 조건에 특정 범위 내에 있는지를 조사하기 위해 사용

  • WHERE 절에 '<','>'와 같이 작거나 크거나 하는 경우, BETWEEN a AND b 사이의 값을 찾고 싶을 때 사용

# salgrade 테이블 값 출력
SELECT *
FROM salgrade;

# NON-EQUI JOIN 사용

SELECT ename, sal, grade
FROM emp, salgrade
WHERE sal BETWEEN losal AND hisal;

-> emp 테이블과 salgrade 테이블을 연결하고 emp 테이블의 sal 값들을 salgrade의 값들(losal, hisal)과 비교해서
   비교한 값이 losal, hisal 사이에 있으면 해당 등급을 출력

4. SELF JOIN

  • 하나의 테이블에 있는 칼럼끼리 연결해서 데이터를 찾을 경우 사용

  • 자기 자신과 조인을 맺는 것

# WHERE 절을 사용

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee, emp manager
WHERE employee.mgr = manager.empno;

-> emp 하나의 테이블을 연결해서 employee, manage로 나누고 
employee가 가진 mgr 번호와 manager가 가진 empno를 연결해서 사원과 연결된 직속상관을 출력

# JOIN ~ ON 절을 사용

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee JOIN emp manager
ON employee.mgr = manager.empno;

5. OUTER JOIN

  • EQUI JOIN 조건에서 두 테이블 중 어느 한쪽 칼럼에 NULL값이 있다면 '=' 비교 결과가 거짓이 된다.

  • OUTER JOIN을 사용하면 NULL값 까지 조인 결과로 출력 가능

  • 여러 테이블에서 한 쪽에는 데이터가 있고, 한 쪽에는 데이터가 없는 경우 데이터가 있는 쪽 테이블의 내용을 모두 출력

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee LEFT OUTER JOIN emp manager
ON employee.mgr = manager.empno;

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee JOIN emp manager
ON employee.mgr = manager.empno(+);

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee RIGHT OUTER JOIN emp manager
ON employee.mgr = manager.empno;

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee JOIN emp manager
ON employee.mgr(+) = manager.empno;

SELECT employee.ename as "사원이름", manager.ename as "직속상관이름"
FROM emp employee FULL OUTER JOIN emp manager
ON employee.mgr = manager.empno;






** 참고

0개의 댓글