Point 01. 조인(Join)
01-01. EQUI(등가) 조인 - 교집합
(1) EQUI(등가) 조인
- 조인은 여러 개의 릴레이션을 사용해서 새로운 릴레이션을 만드는 과정이다.
- 조인의 가장 기본은 교집합을 만드는 것이다.
- 두 개의 테이블 간에 일치하는 것을 조인한다.
- EQUI 조인은 WHERE절에서 "="을 사용해서 두 개의 테이블을 연결한다.
(2) INNER JOIN
- INNER JOIN은 FROM절에 ON 구문을 사용해서 테이블을 연결한다.
- INNER JOIN 구에 두 개의 테이블명을 서술하고 ON 구조 조인 조건을 서술한다.
(3) INTERSECT 연산
- INTERSECT 연산은 두 개의 테이블에서 교집합을 조회한다.
- 즉, 두 개의 테이블에서 공통된 값을 조회한다.
01-02. NON-EQUI(비등가) 조인
- NON-EQUI는 두 개의 테이블 간에 조인하는 경우 "="을 사용하지 않고, ">, <, >=, <=" 등을 사용한다.
- 즉, NON-EQUI 조인은 정확하게 일치하지 않는 것을 조인하는 것이다.
01-03. OUTER JOIN
- OUTER JOIN은 두 개의 테이블 간에 교집합(EQUI-JOIN)을 조회하고 한 쪽 테이블에만 있는 데이터도 포함시켜서 조회한다.
- 왼쪽 테이블에만 있는 행도 포함하면 LEFT OUTER JOIN이라고 하고 오른쪽 테이블의 행만 포함시키면 RIGHT OUTER JOIN이라고 한다.
- FULL OUTER JOIN은 LEFT OUTER JOIN과 RIGHT OUTER JOIN 모두를 하는 것이다.
(1) LEFT OUTER JOIN과 RIGHT OUTER JOIN
- LEFT OUER JOIN은 두 개의 테이블에서 같은 것을 조회하고 왼쪽 테이블에만 있는 것을 포함해서 조회한다.
- RIGHT OUTER JOIN은 두 개의 테이블에서 같은 것을 조회하고 오른쪽 테이블에만 있는 것을 포함해서 조회한다.
01-04. CROSS JOIN
- CROSS JOIN은 조인 조건 구 없이 2개의 테이블을 하나로 조인한다.
- 조인구가 없기 때문에 카테시안 곱이 발생한다.
- CROSS JOIN은 FROM 절에 "CROSS JOIN" 구문을 사용하면 된다.
01-05. UNION을 사용한 합집합 구현
(1) UNION
- UNION 연산은 두 개의 테이블을 하나로 만드는 연산이다.
- 주의 사항은 두 개의 테이블의 컬럼 수, 컬럼의 데이터 형식 모두가 일치해야 한다.
- 만약 두 개의 테이블에 UNION 연산이 사용될 때 컬럼 수 혹은 데이터 형식이 다르면 오류가 발생한다.
- UNION 연산은 두 개의 테이블을 하나로 합치면서 중복된 데이터를 제거한다.
- 그래서 UNION 연산은 정렬 과정을 동반한다.
(2) UNION ALL
- UNION ALL은 두 개의 테이블을 하나로 합치는 것이다.
- UNION처럼 중복을 제거하거나 정렬을 유발하지 않는다.
01-06. 차집합을 만드는 MINUS
- MINUS 연산은 두 개의 테이블에서 차집합을 조회한다.
- 즉, 먼저 쓴 SELECT문에는 있고 뒤에 쓰는 SELECT문에는 없는 집합을 조회하는 것이다.
- MS-SQL에서는 MINUS와 동일한 연산이 EXCEPT이다.
Point 03. 서브쿼리
03-01. 메인 쿼리와 서브쿼리
- 서브쿼리는 SELECT문 내에 다시 SELECT문을 사용하는 SQL문이다.
- 서브쿼리의 형태는 FROM구에 SELECT문을 사용하는 인라인 뷰(Inline View)와 SELECT문에 서브쿼리를 사용하는 스칼라 서브쿼리 등이 있다.
- WHERE구에 SELECT문을 사용하면 서브쿼리라고 한다.
- WHERE구에 있는 SELECT문은 서브쿼리이고 괄호 내에 SELECT문을 사용한다.
- 서브쿼리 밖에 있는 SELECT문은 메인쿼리이다.
- FROM구에 SELECT문을 사용하여 가상의 테이블을 만드는 효과를 얻을 수 있다.
- FROM구에 SELECT문을 사용한 것이 인라인 뷰(Inline View)이다.
03-02. 단일 행 서브쿼리와 다중 행 서브쿼리
- 단일 행 서브쿼리는 하나의 행만 반환하는 서브쿼리로 비교 연산자는 =, <, <=, >=, <> 를 사용한다.
- 다중 행 서브쿼리는 여러 개의 행을 반환하는 것으로 IN, ANY, ALL, EXISTS를 사용해야 한다.
* 서브쿼리 종류(반환 행)
- 단일 행 서브쿼리: 서브쿼리를 실행하면 그 결과는 반드시 한 행만 조회된다. 비교 연산자인 =, <, <=, >, >=, <>를 사용한다.
- 다중 행 서브쿼리: 서브쿼리를 실행하면 그 결과는 여러 개의 행이 조회된다. 다중 행 비교 연산자인 IN, ANY, ALL, EXISTS를 사용한다.
03-03. 다중 행 서브쿼리
- 다중 행 서브쿼리는 서브쿼리 결과가 여러 개의 행을 반환하는 것으로 다중 행 연산자를 사용해야 한다.
* 다중 행 비교 연산자
- IN(Subquery) : 메인 쿼리의 비교 조건이 서브쿼리의 결과 중 하나만 동일하면 참이 된다. (OR 조건)
- ALL(Subquery) : 메인 쿼리와 서브쿼리의 결과가 모두 동일하면 참이 된다.
- ANY(Subquery) : 메인 쿼리의 비교조건이 서브쿼리의 결과 중 하나 이상 동일하면 참이 된다.
- EXISTS(Subquery) : 메인 쿼리와 서브쿼리의 결과가 하나라도 존재하면 참이 된다.
03-04. IN, ALL, EXISTS
- IN은 반환되는 여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산이다.
- ALL은 메인쿼리와 서브쿼리의 결과가 모두 동일하면 참이 된다.
- (예) SELECT * FROM EMP WHERE DEPTNO <= ALL (20, 30) ; # DEPTNO가 20, 30보다 작거나 같은 것을 조회한다.
- EXISTS는 Subquery로 어떤 데이터 존재 여부를 확인하는 것이다.
- 즉, EXISTS의 결과는 참과 거짓이 반환된다.
03-05. 스칼라 서브쿼리
- 스칼라 서브쿼리는 반드시 한 행과 한 컬럼만 반환하는 서브쿼리이다.
03-06. 연관(Corrleated) 서브쿼리
- 연관 서브쿼리는 서브쿼리 내에서 메인 쿼리 내의 컬럼을 사용하는 것을 의미한다.