- 두 개 이상의 테이블에서 조인을 사용하지 않고 연관된 데이터를 조회할 때 사용한다.
- SELECT 절의 칼럼 수가 동일하고 SELECT 절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환 가능할 때 사용가능 하다.
연산자 | 설명 |
---|---|
UNION | 합집합(중복행 1개로) 정렬 |
UNION ALL | 합집합(중복 행도 표시)정렬 X |
INTERSECTION | 교집합(중복행 1개로) |
MINUS/EXCEPT(DIFFRENCE) | 차집합(중복행 1개로) NOT EXISTS, NOT IN 서브쿼리로 변경가능 |
CROSS JOIN | 곱집합(PRODUCT) NOT EXISTS, NOT IN 서브쿼리로 변경가능 ALIAS는 처음 테이블, 정렬은 마지막 테이블 기준 |
UNION과 UNION ALL의 결과가 같다면 정렬 작업이 없어 속도가 빠른 UNION ALL을 사용하는 것이 좋다.
관계형 데이터베이스를 구현하기 위해 새롭게 만들어진 연산자
INNER JOIN
NATURAL JOIN
USING 조건절
ON 조건절
CROSS JOIN
OUTER JOIN
SELECT D.DEPTNO, D.DNAME, E.ENAME
FROM DEPT D
INNER JOIN EMP E ON D.DEPTNO = E.DEPTNO;
SELECT *
FROM EMP
NATURAL JOIN DEPT;
SELECT *
FROM DEPT
JOIN EMP USING(DEPTNO);
------WHERE절 혼용-------
SELECT E.ENAME, E.MGR,D.DEPTNO,D.DNAME
FROM EMP E JOIN DEPT D
ON(E.DEPTNO=D.DEPTNO)
WHERE E.MGR=7698;
------WHERE 혼용X-------------
SELECT E.ENAME,E.MGR,D.DEPTNO,D.DNAME
FROM EMP E JOIN DEPT D
ON(E.DEPTNO=D.DEPTNO AND E.MGR = 7698);
--------다중 테이블 JOIN---------------
--두 개의 쿼리문 결과 같음--
SELECT E.EMPNO, D.DEPTNO, D.DNAME, T.DNAME New_DNAME
FROM EMP E, DEPT D, DEPT_TEMP T
WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = T.DEPTNO;
SELECT E.EMPNO, D.DEPTNO,D.DNAME,T.DNAME NEW_DNAME
FROM EMP E
JOIN DEPT D ON(E.DEPTNO = D.DEPTNO)
JOIN DEPT_TEMP T ON(E.DEPTNO = T.DEPTNO);
ON 조건절에 JOIN 조건 외에도 데이터 검색 조건을 추가할 수는 있으나, 검색 조건 목적인 경우는 WHERE 절을 사용할 것을 권고한다. (다만, 아우터 조인에서 조인의 대상을 제한하기 위한 목적으로 사용되는 추가 조건의 경우는 ON 절에 표기되어야 한다.)
카타시안 곱 양쪽 집합의 M*N건의 데이터 조합이 발생
SELECT *
FROM EMP,DEPT;
위 쿼리문을 실행하면
EMP 테이블에 11개의 칼럼
DEPT 테이블에 3개의 칼럼이 존재하므로
14개의 칼럼이 생성되고
EMP 테이블에 12개의 행
DEPT 테이블에 4개의 행이 있어
총 48행의 데이터가 출력된다.
SELECT EMPLOYEE.ENAME || ‘의 매니저는 ’
|| MANAGER.ENAME || ‘입니다.’
FROM EMP EMPLOYEE, EMP MANAGER
WHERE EMPLOYEE.MGR = MANAGER.EMPNO(+);
-> 실행 결과
EX) EMP테이블과 JOB테이블을 LEFT OUTER JOIN 하여 직원의 직무 정보를 조회
SELECT D.DEPTNO, D.DNAME,E.ENAME
FROM DEPT D
LEFT OUTER JOIN EMP E ON D.DEPTNO = E.DEPTNO;
LEFT OUTER JOIN의 반대임
EX) LEFT에서 한 예제를 RIGHT로
-- 위와 결과 같음--
SELECT D.DEPTNO, D.DNAME,E.ENAME
FROM EMP E
RIGHT OUTER JOIN DEPT D ON D.DEPTNO = E.DEPTNO
EX) DEPT에 등록된 부서 중에는 사원이 없는 부서도 있다. DEPT와 EMP를 조인하되 사원이 없는 부서 정보도 같이 출력하도록 한다.
SELECT E.ENAME, D.DEPTNO, D.DNAME
FROM EMP E
RIGHT OUTER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
EX) DEPT테이블과 DEPT_TEMP테이블을 DEPTNO 컬럼을 기준으로 FULL OUTER JOIN
SELECT *
FROM DEPT
FULL OUTER JOIN DEPT_TEMP ON DEPT.DEPTNO=DEPT_TEMP.DEPTNO;
- INNER JOIN - > 2건
B-B, C-C- RIGHT OUTER JOIN -> 3건
NULL-A, B-B,C-C- LEFT OUTER JOIN -> 4건
B-B, C-C, D-NULL, E-NULL- FULL OUTER JOIN -> 5건
NULL-A, B-B, C-C, D-NULL, E-NULL- CARTESIAN PRODUCT -> 12건
B-A, B-B, B-C, C-A, C-B, C-C, D-A, D-B, D-C, E-A, E-B, E-C