SQL/SQL 개발자

Part 03. SQL 기본과 활용 - Section 02. SQL 활용

아웃라이어_ 2020. 9. 30. 13:45

Point 01. 조인(Join)

01-01. EQUI(등가) 조인 - 교집합

(1) EQUI(등가) 조인

- 조인은 여러 개의 릴레이션을 사용해서 새로운 릴레이션을 만드는 과정이다.

- 조인의 가장 기본은 교집합을 만드는 것이다.

- 두 개의 테이블 간에 일치하는 것을 조인한다.

- EQUI 조인은 WHERE절에서 "="을 사용해서 두 개의 테이블을 연결한다.

(2) INNER JOIN

- INNER JOINFROM절에 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 JOINLEFT OUTER JOINRIGHT OUTER JOIN 모두를 하는 것이다.

(1) LEFT OUTER JOIN과 RIGHT OUTER JOIN

- LEFT OUER JOIN은 두 개의 테이블에서 같은 것을 조회하고 왼쪽 테이블에만 있는 것을 포함해서 조회한다.

- RIGHT OUTER JOIN은 두 개의 테이블에서 같은 것을 조회하고 오른쪽 테이블에만 있는 것을 포함해서 조회한다.

 

01-04. CROSS JOIN

- CROSS JOIN은 조인 조건 구 없이 2개의 테이블을 하나로 조인한다.

- 조인구가 없기 때문에 카테시안 곱이 발생한다.

- CROSS JOINFROM 절에 "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) 서브쿼리

- 연관 서브쿼리는 서브쿼리 내에서 메인 쿼리 내의 컬럼을 사용하는 것을 의미한다.