1. 수학적으로, 집합의 `집합 연산`과 관계형 DB의 `관계 연산` 비교
ㅇ 집합의 `집합 연산`
- 합집합 (UNION)
. 관계형 DB 대응 例) WHERE OR, SELECT () UNION SELECT ()
- 교집합 (INTERSECTION)
. 관계형 DB 대응 例) WHERE AND, SELECT () INTERSECT SELECT ()
- 차집합 (DIFFERENCE)
. 관계형 DB 대응 例) SELECT () EXCEPT SELECT ()
- 곱집합 (PRODUCT)
. 관계형 DB 대응 例) CROSS JOIN
ㅇ 관계형 DB의 `관계 연산`
- SELECT : (1 이상의 테이블에서 데이터를 추출)
- PROJECT : 어떤 속성(열,칼럼) 만을 돌려줌으로써, 각 튜플의 크기를 줄임
- JOIN : (1 이상의 테이블들을 조합시킴)
- DIVIDE : (실제 구현 없음)
2. JOIN (조인)
ㅇ JOIN 형태
ㅇ 내부 조인 (INNER JOIN)
- 기본적으로, `조건에 맞는` 또는 `가능한 모든` 행과의 조합(카르테시안 곱)을 생성
. 즉, 일치하는 행 만 포함
.. 양쪽 테이블에 동일 값이 있을 때 만 결합하는 방식 : 교집합 (INTERSECTION)
- 구분
. 동일 조인 (EQUI-JOIN 또는 INNER JOIN 또는 JOIN)
.. 테이블 간 특정 조건 하에서, 동일 값이 있는 행 만 반환
.. USING 조건절이나 ON 조건절 등을 사용하게 됨
.. (명시적 : JOIN 사용 함) SELECT ... FROM A JOIN B ON 조건
.. (암시적 : JOIN 사용 안함) SELECT ... FROM A,B WHERE 조건
. 자연 조인 (NATURAL JOIN)
.. ON 조건절을 명시할 필요없음
.. 암묵적으로, 테이블 간에 동일 이름을 갖는 칼럼이 있을 때,
.. 그 칼럼에서 동일한 값이 있는 행 만 반환
.. 만일, 동일 이름을 갖는 컬럼이 없을 때는, 교차 조인으로 변환되어 수행됨
.. 대부분의 전문가들이 이의 사용을 비 권장하고 있음 (별 유용성 없음)
- 例) 두 테이블에서 같은 값을 갖는 레코드들을 생성하려면, (동일 조인)
. SELECT column FROM table1 a INNER JOIN table2 b ON a.column = b.column;
ㅇ 외부 조인 (OUTER JOIN)
- 기본적으로, 기준 테이블의 모든 행과,
. 다른 테이블(왼쪽 또는 오른쪽)의 일치 또는 일치하지 않은 행(NULL 반환)도 보이게 함
- 구분
. (어느 한 쪽에 해당 사항이 있을 경우)에 만 결합
.. LEFT OUTER JOIN 또는 LEFT JOIN
.. RIGHT OUTER JOIN 또는 RIGHT JOIN
. (어느 한 쪽에도 해당 사항이 없을 경우)에도 결합 (한편, MySQL에서는 지원 안함)
.. FULL OUTER JOIN
※ [참고]
- 내부 조인은, 조건에 맞는 행만 반환하므로, 쿼리 구문상 두 테이블의 순서가 상관없지만,
- 외부 조인은, 기준 테이블에 따라 왼쪽(LEFT),오른쪽(RIGHT) 방향으로 구분할 수 있음
ㅇ 교차 조인 (CROSS JOIN)
- 테이블 간 JOIN 조건이 없는 경우로써, 가능한 모든 데이터의 조합을 반환
- 따라서, 테이블 간에 나올 수 있는 모든 경우의 행이 다 반환되게 됨
- 구문상으로 볼 때,
. 테이블명 간에 JOIN 없이 그냥 ,(콤마) 만으로 구분하여도 같은 효과를 보임 (실수 조심)
* 수학에서의 곱 집합을 말하며, 실무에서 거의 사용 기회 없음
3. UNION (유니온)
ㅇ 사실상, 위의 JOIN 중에, FULL OUTER JOIN과 같은 개념
- A ∪ B (UNION) : 테이블 A와 B를 합치되, 중복 레코드(또는,튜플)는 원칙적으로 제거
ㅇ 2 이상의 SELECT 문을 결합하는데 사용
- SELECT () UNION SELECT ()
. (문법) 각 SELECT 문 내 컬럼의 자료형이 동일해야 하고, 나열 순서도 같아야 함
. (결과) 각 테이블 내 칼럼들이 함께 연이어 붙어서 단일 테이블로 결과로써 보여줌
- 例) SELECT id,col1 FROM ... UNION SELECT id,col2 FROM ... UNION SELECT id,col3 FROM ...
ㅇ UNION 구분
- UNION ALL : 공통 교집합까지 중복 포함하며, 그대로 보여 줌 (속도 빠름)
- UNION : 공통 교집합의 중복을 제거하며, 정렬 작업이 내부적으로 발생 (속도 느림)
4. [기타] 서브 쿼리 (Sub Query)
ㅇ SELECT 문 하부의 WHERE 절이나 FROM 절 내 사용되는 부분 쿼리(서브 쿼리)