여러 테이블에 저장된 데이터를 한 번에 조회해야 할 필요가 있을 때 사용
두 개 이상의 테이블을 결합
카테시안 곱(Cartesian Product) : 두 Table의 모든 행들이 무조건 결합하여 Table들에 존재하는 행 갯수를 곱한 만큼의 결과값이 반환되는 것
두 테이블 이상의 모든 조합을 표시하는 것
한 쪽 테이블의 모든 행들과 다른 테이블의 모든 행을 조인
특별한 키워드 없이 SELECT 문의 FROM절에 조인 할 테이블을 콤마로 연결하여 사용
ex)
SELECT * FROM dept, emp
전체 칼럼 수는 사원 테이블(emp)의 칼럼 수(8)와 부서 테이블(dept)의 칼럼 수(3)을 더한 11개
전체 로우 수는 사원 한 명에 대해 dept 테이블 4개의 로우와 결합되어 14*4인 56개
두 테이블에서 공통 칼럼을 가지고, 같은 값을 가지는 행을 연결하여 결과를 생성하는 조인 방법
INNER JOIN
형식
SELECT table1.column, table2.column
FROM table1, table2
WHERE table1.column1 = table2.column2
# 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;
SELECT empno, ename, dname, deptno
FROM emp JOIN dept
USING (deptno)
WHERE emp.empno = 7844;
SELECT empno, ename, dname, emp.deptno
FROM emp JOIN dept
ON emp.deptno = dept.deptno
WHERE emp.empno = 7844;
조인 조건에 특정 범위 내에 있는지를 조사하기 위해 사용
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 사이에 있으면 해당 등급을 출력
하나의 테이블에 있는 칼럼끼리 연결해서 데이터를 찾을 경우 사용
자기 자신과 조인을 맺는 것
# 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;
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;