-> 블로그 이전

[SQLD] 2-10. 표준조인

2021. 11. 1. 16:48Certificate`/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 차이

INNER JOIN / NATURAL JOIN
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

CROSS JOIN (56행) / CROSS JOIN+JOIN 조건 (14행)

≫ 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;

LEFT OUTER JOIN / RIGHT OUTER JOIN