□ 조인 ( Join )
- 두 개 이상의 테이블 들을 연결 또는 결합하여 데이터를 출력하는 것
- 관계형 데이터베이스의 가장 큰 장점이면서 대표적 핵심 기능
- 일반적인 경우 PK( Primary Key )나 FK( Foreign Key ) 값의 연관에 의해 성립됨
논리적인 값들의 연관만으로도 성립 가능
- 데이터 처리 시 두 개의 집합씩 수행됨 ( 테이블 여러 개 조인 시에도 )
( ex) FROM A, B, C, D ☞ ( ( ( A JOIN B ) JOIN C ) JOIN D ) )
( 조인 순서는 옵티마이저에 의해 결정됨 )
- 정규화는 데이터 정합성과 데이터 저장 공간의 절약을 위해 Entity를 최대한 분리하는 작업
■ EQUI JOIN ( 등가 조인 )
- 두 개의 테이블 간 칼럼 값들이 서로 정확하게 일치하는 경우에 사용
- 대부분 PK ↔ FK의 관계를 기반 으로 함
- JOIN 조건은 WHERE 절에 '=' 연산자를 사용해서 표현
- 특정 칼럼에 접근 시 어느 테이블의 칼럼인지 명시해야 함
( 각각 다른 테이블에 동명의 칼럼이 존재할 수 있고, 가독성이나 유지보수성을 높이기 위해 )
- N 개의 테이블로부터 필요한 데이터를 조회하기 위해 필요한 JOIN 조건은 N - 1 개 이상
- 테이블에 대해 ALIAS 사용 가능 ( 테이블명이 길고 SQL 의 복잡도가 높아지면 주로 사용 )
( FROM 절에서 테이블에 대한 ALIAS 사용 후에는 WHERE 절과 SELECT 절에는 테이블명이 아닌 ALIAS를 써야 함 )
■ Non EQUI JOIN ( 비등가 조인 )
- 두 테이블 간에 칼럼 값이 서로 정확하게 일치하지 않는 경우에 사용 ( 데이터 모델에 따라 불가능한 경우도 있음 )
- WHERE 절에 ‘=’ 연산자가 아닌 다른 연산자( >, >=, <, <=, Between 등 )들을 사용
□ 표준 조인 ( Standard Join )
- ANSI/ISO 표준 SQL 기능 중 하나
< 집합 연산자 >
- 조인을 사용하지 않고 연관된 데이터를 조회할 수 있음
- 조인은 데이터 집합을 수직으로 연결 하고, 집합 연산자는 데이터 집합을 수평으로 연결
- 집합 연산자는 주로 서브 타입이나 수평 분할된 테이블을 연결하는 용도로 사용
- 집합 연산자는 여러 개의 질의의 결과를 연결하여 하나로 결합하는 방식
( 2개 이상의 질의 결과를 하나의 결과로 만들어 줌 )
- SELECT 절의 칼럼 수가 동일 하고, 동일 위치에 존재하는 칼럼의 데이터 타입이
상호 호환( 반드시 같은 데이터 타입일 필요는 없음 ) 가능해야 함
■ UNION ( 합집합 )
- UNION -- 공통 교집합의 중복을 없애기 위해 정렬 작업 발생 -> 시스템 부하
- UNION ALL -- 정렬 하지 않고 공통 집합을 중복해서 그대로 보여줌
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[ UNION [ALL | DISTINCT]
SELECT ... ]
■ INTERSECTION ( 교집합 )
- INTERSECT -- 두 집합의 공통 집합 추출 ( Oracle DB )
■ DIFFERENCE ( 차집합 )
- MINUS or EXCEPT -- 집합 A 에서 집합 B 와의 공통 집합을 제외한 부분 ( Oracle DB )
■ PRODUCT ( 곱집합 )
- CROSS JOIN -- JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합 ( 양쪽 집합의 M * N 건의 데이터 조합 발생 )
< 관계 연산자 >
■ SELECT 연산 ( 행 선택 ) -- WHERE 절
■ PROJECT 연산 ( 열 선택 ) -- SELECT 절
■ (NATURAL) JOIN 연산 -- 다양한 JOIN 기능
■ DIVIDE 연산 -- (X)
< JOIN 형태 > -- FROM 절에 사용
- [INNER] JOIN
- NATURAL JOIN
- LEFT / RIGHT / FULL [OUTER] JOIN
- CROSS JOIN
- SELF JOIN
■ INNER JOIN
- WHERE 절에서부터 사용하던 JOIN 의 DEFAULT 옵션
- JOIN 조건에서 동일한 값이 있는 행만 반환
- WHERE 절에서 사용하던 JOIN 조건을 FROM 절에서 정의하겠다는 표시이므로
USING 조건절이나 ON 조건절을 필수적으로 사용해야 함
- CROSS JOIN , OUTER JOIN과는 같이 사용할 수 없음
■ NATURAL JOIN
- 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI JOIN 수행
- JOIN이 되는 테이블의 데이터 타입과 칼럼명 등이 동일해야 하는 제약 조건 이 있음
- 별도의 JOIN 칼럼을 지정하지 않아도, 2개의 테이블의 공통된 칼럼을 자동으로 인식하여 JOIN 처리
- 추가로 USING / ON / WHERE 조건절에서 JOIN 조건을 정의할 수 없음
- ALIAS나 테이블명과 같은 접두사를 붙일 수 없음
■ OUTER JOIN
- JOIN 조건에서 동일한 값이 없는 행도 반환
- TAB1의 모든 값에 대해 TAB2의 데이터가 반드시 존재한다는 보장이 없는 경우 사용
- OUTER JOIN 도 역시 USING 조건절이나 ON 조건절을 필수적으로 사용해야 함
* LEFT OUTER JOIN -- 컬럼1 = 컬럼2 (+) ( 오른쪽 테이블에 NULL 허용 )
* RIGHT OUTER JOIN -- 컬럼1 (+) = 컬럼2 ( 왼쪽 테이블에 NULL 허용 )
* FULL OUTER JOIN -- RIGHT JOIN과 LEFT JOIN의 결과를 합집합으로 처리한 결과와 동일 ( 중복 데이터 제외 )
■ CROSS JOIN
- 테이블 간 JOIN 조건이 없는 경우 생길 수 있는 모든 데이터의 조합
- 두 개의 테이블에 대한 CARTESIAN PRODUCT 또는 CROSS PRODUCT와 같은 표현으로,
결과는 양쪽 집합의 M * N 건의 데이터 조합 발생
- NATURAL JOIN 과 달리, WHERE 절에 JOIN 조건 추가 가능
( 단 이 경우 INNER JOIN 과 같은 결과를 얻게 되므로 CROSS JOIN 을 사용하는 의미가 없어짐 )
■ SELF JOIN
- 동일 테이블 사이의 조인
- 한 테이블 내에서 두 칼럼이 연관 관계가 있을 때 사용
- 반드시 테이블 별칭( Alias )을 사용해야 함. 칼럼에도 모두 테이블 별칭 사용
< JOIN의 조건절 >
- USING
- ON
■ USING 조건절
- 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수 있음
- ‘*’ 와일드카드처럼 별도의 칼럼 순서를 지정하지 않으면
USING 조건절의 기준이 되는 칼럼들이 다른 칼럼보다 먼저 출력됨
이때 JOIN에 사용된 같은 이름의 칼럼을 하나로 처리
- NATURAL JOIN과 마찬가지로 JOIN 칼럼에 대해서는 ALIAS나 테이블 이름과 같은 접두사를 붙일 수 없음
■ ON 조건절
- 임의의 JOIN 조건을 지정하거나, 이름이 다른 칼럼명을 JOIN 조건으로 사용하거나,
JOIN 칼럼을 명시하기 위해 사용
- WHERE 절의 JOIN 조건과 같은 기능을 하면서도, 명시적으로 JOIN 조건을 구분할 수 있음
- ALIAS나 테이블명과 같은 접두사를 사용하여 SELECT에 사용되는 칼럼을 논리적으로 명확하게 지정해주어야 함
table_reference: {
table_factor
| joined_table
}
table_factor: {
tbl_name [PARTITION (partition_names)]
[[AS] alias] [index_hint_list]
| [LATERAL] table_subquery [AS] alias [(col_list)]
| ( table_references )
}
joined_table: {
table_reference {[INNER | CROSS] JOIN | STRAIGHT_JOIN} table_factor [join_specification]
| table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
| table_reference NATURAL [INNER | {LEFT|RIGHT} [OUTER]] JOIN table_factor
}
'프로그래밍 언어 ( Programming Language ) > SQL' 카테고리의 다른 글
[SQL][DBMS] Oracle DB 와 MySQL 의 차이 - 문자열 부호, 대소문자 구분 등 (0) | 2022.01.07 |
---|---|
[SQL][MySQL] 복합문 ( Compound Statement Syntax ) - 흐름 제어문 ( CASE, IF, LOOP 등 ), 선언문 ( DECLARE ), BEGIN ... END (0) | 2022.01.05 |
[SQL] 연산자 ( Operator ) ( + 다중 행 연산자, 집합 연산자 ) (0) | 2022.01.05 |
[SQL][MySQL] 데이터 타입 ( Data Type ) (0) | 2022.01.05 |
[SQL] 제약 조건 ( Constraint ) (0) | 2022.01.04 |