2021. 11. 1. 16:48ㆍCertificate`/SQLD
Standard SQL
일반 집합 연산자
- UNION(Union 연산), INTERSECT(Intersection 연산), MINUS/EXCEPT(Difference 연산), CROSS JOIN(Product 연산)
- UNION ALL : 공통집합을 중복해서 그대로 리턴 -> 정렬 작업이 일어나지 않는 장점
※ UNION / UNION ALL
- 출력 결과가 같다면
-> 응답속도 향상, 자원 효율과 측면에서 정렬 작업이 발생하지 않는 UNION ALL이 효과적
※ CROSS JOIN (CARTESIAN PRODUCT)
- JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
순수 관계 연산자
- SELECT / PROJECT / JOIN / DIVISION
- 관계형 DB를 구현하기 위해 새롭게 만들어진 연산자
FROM 절 JOIN 형태
- INNER JOIN / NATURAL JOIN / USING 조건절 / ON 조건절 / CROSS JOIN / OUTER JOIN
≫ INNER JOIN
- JOIN 조건에서 동일한 값이 있는 행만 반환
- USING 조건절/ON 조건절을 필수적으로 사용
-- 사원번호, 사원이름, 소속부서 코드, 소속부서 이름
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
------------------------------------------
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO;
≫ NATURAL JOIN
- INNER JOIN 하위 개념
- 두 테이블 간의 동일한 이름을 갖는 모든 컬럼들에 대해 EQUI JOIN 수행
- JOIN이 되는 테이블의 데이터 도메인, 컬럼명, 칼럼값이 동일해야 하는 제약조건 존재
- NATURAL INNER JOIN 이라고 표시 가능
- USING 조건절/ON 조건절/WHERE 절에서 JOIN 조건 정의 X | SQL Server에서 지원 X
-- 사원번호, 사원이름, 소속부서 코드, 소속부서 이름
SELECT EMPNO, ENAME, DEPTNO, DNAME
FROM EMP NATURAL JOIN DEPT ;
※ INNER JOIN/NATURAL JOIN 차이
- NATURAL JOIN에서는 E.EMPNO에서 E.처럼 ALIAS나 테이블명과 같은 접두사 사용 X
- INNER JOIN은 두 테이블 간의 같은 컬럼에 대해 모두 나오지만(DEPTNO, DEPTNO_1)
NATURAL JOIN은 두 테이블 간의 같은 컬럼에 대해 통합해서 하나의 컬럼으로 나온다(DEPTNO)
- NATURAL JOIN에서 컬럼 순서를 지정하지 않으면, NATURAL JOIN의 기준이 되는 컬럼이 첫 번째로 나온다
≫ USING 조건절
- 같은 이름을 가진 컬럼들 중에서 원하는 컬럼에 대해서만 선택적으로 EQUI JOIN
- SQL Server에서 지원 X
- JOIN 컬럼에 대해 ALIAS나 테이블명과 같은 접두사 사용 X
- SELECT 절에 * 사용 시 USING 조건절에 사용된 컬럼이 제일 먼저 출력
- USING 조건절에 사용되지 않은 컬럼들은 공통된 컬럼이 있을 시 INNER JOIN과 같이 각 테이블별로 2번씩 출력
≫ ON 조건절
- 컬럼명이 달라도 JOIN 조건을 사용할 수 있다
- ON 조건절과 WHERE 검색 조건은 충돌 없이 사용 가능
- ON 조건절에 데이터 검색 조건을 추가할 수 있으나, 목적이 검색 조건일 경우 WHERE 절 사용
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
------------------------------------------
SELECT E.EMPNO, E.ENAME, E.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D ON (E.DEPTNO = D.DEPTNO);
※ ON 조건절 + 데이터 검증 조건
SELECT E.ENAME, E.MGR, D.DEPTNO, D.NAME
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO AND E.MGR = 7698;
-----------------------------------------
SELECT E.ENAME, E.MGR, D.DEPTNO, D.DNAME
FROM EMP E JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE E.MGR = 7698;
≫ CROSS JOIN
- WHERE 절에 JOIN 조건 추가 가능
-> JOIN 조건을 추가하면 INNER JOIN과 같은 결과를 얻기 때문에 되도록이면 사용 X
≫ OUTER JOIN
- LEFT / RIGHT / FULL
- JOIN 조건에서 동일한 값이 없는 행도 반환
- 동일한 값이 없으면 NULL 값으로 채운다
- OUTER 키워드 생략 가능
- FULL JOIN은 LEFT JOIN과 RIGHT JOIN의 결과를 합집합으로 처리한 결과와 동일
- FULL JOIN ≒ UNION 기능 (중복 데이터 삭제)
-- LEFT OUTER JOIN
SELECT a.deptno, b.deptno
FROM emp a, dept b
WHERE a.deptno = b.deptno(+);
----------------------------------
SELECT a.deptno, b.deptno
FROM emp a LEFT OUTER JOIN dept b
ON a.deptno = b.deptno;
-- RIGHT OUTER JOIN
SELECT a.deptno, b.deptno
FROM emp a, dept b
WHERE a.deptno(+) = b.deptno;
----------------------------------
SELECT a.deptno, b.deptno
FROM emp a RIGHT OUTER JOIN dept b
ON a.deptno = b.deptno;
-- FULL OUTER JOIN
SELECT a.deptno, b.deptno
FROM emp a FULL OUTER JOIN dept b
ON a.deptno = b.deptno;