내부 조인은 두 조인 된 테이블의 각 행에 일치하는 열 값이 있어야하며 응용 프로그램에서 일반적으로 사용되는 조인 작업이지만 최선의 선택이라고 가정해서는 안됩니다. 모든 상황에서. 내부 조인은 join-predicate를 기반으로 두 테이블 (A 및 B)의 열 값을 결합하여 새 결과 테이블을 만듭니다. 쿼리는 A의 각 행을 B의 각 행과 비교하여 join-predicate를 충족하는 모든 행 쌍을 찾습니다. NULL이 아닌 값을 일치시켜 join-predicate가 충족되면 A와 B의 일치하는 각 행 쌍에 대한 열 값이 결과 행으로 결합됩니다.
조인 결과는 다음과 같이 정의 될 수 있습니다. 테이블에있는 모든 행의 카티 전 곱 (또는 교차 조인)을 먼저 취한 다음 (테이블 A의 모든 행과 테이블 B의 모든 행을 결합) 조인 조건자를 충족하는 모든 행을 반환 한 결과. 실제 SQL 구현은 일반적으로 해시 조인 또는 정렬-병합 조인과 같은 다른 접근 방식을 사용합니다. 데카르트 곱을 계산하는 것이 더 느리고 저장하는 데 엄청나게 많은 양의 메모리가 필요한 경우가 많기 때문입니다.
SQL은 두 가지 구문을 지정합니다. 조인을 표현하는 방법 : “명시 적 조인 표기”및 “암시 적 조인 표기”. “암시 적 조인 표기법”은 데이터베이스 시스템에서 여전히 지원하지만 더 이상 모범 사례로 간주되지 않습니다.
“명시 적 조인 표기법”은 JOIN
키워드를 사용합니다. 조인 할 테이블을 지정하기위한 INNER
키워드와 조인에 대한 술어를 지정하는 ON
키워드가 선택적으로 선행됩니다. 다음 예 :
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee INNER JOIN department ONemployee.DepartmentID = department.DepartmentID;
Employee.LastName | Employee.DepartmentID | Department.DepartmentName |
---|---|---|
Robinson | 34 | 사무직 |
Jones | 33 | 엔지니어링 |
스미스 | 34 | 사무직 |
하이젠 베르크 | 33 | 엔지니어링 |
Rafferty | 31 | 판매 |
“암시 적 조인 표기법”은 단순히 t를 나열합니다. 조인 테이블, SELECT
문의 FROM
절에서 쉼표를 사용하여 구분합니다. 따라서 교차 조인을 지정하고 WHERE
절은 추가 필터 조건자를 적용 할 수 있습니다 (명시 적 표기법의 join-predicates와 비교하여 작동 함).
다음 예제는 이전 예제와 동일하지만 이번에는 암시 적 조인 표기법을 사용합니다.
SELECT employee.LastName, employee.DepartmentID, department.DepartmentName FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
예제에 제공된 쿼리 위는 두 테이블의 DepartmentID 열을 사용하여 Employee 및 Department 테이블을 조인합니다. 이러한 테이블의 DepartmentID가 일치하는 경우 (즉, join-predicate가 충족되는 경우) 쿼리는 두 테이블의 LastName, DepartmentID 및 DepartmentName 열을 결과 행으로 결합합니다. DepartmentID가 일치하지 않으면 결과 행이 생성되지 않습니다.
따라서 위 쿼리 실행 결과는 다음과 같습니다.
Employee.LastName | Employee.DepartmentID | Department.DepartmentName |
---|---|---|
로빈슨 | 34 | 사무직 |
존스 | 33 | 엔지니어링 |
Smith | 34 | 사무직 |
Heisenberg | 33 | 엔지니어링 |
Rafferty | 31 | 판매 |
“Williams”직원과 “Marketing”부서가 쿼리 실행 결과에 나타나지 않습니다. 이들 중 어느 것도 다른 각 테이블에 일치하는 행이 없습니다. “Williams”에는 연관된 부서가 없으며 부서 ID 35 ( “Marketing”)의 직원도 없습니다. 원하는 결과에 따라이 동작은 미묘한 버그 일 수 있으며 내부 조인을 외부 조인으로 대체하여 피할 수 있습니다.
내부 조인 및 NULL 값 편집
프로그래머는 조인 조건이 조인 열이 나머지 조건 자 조건을 적용하기 전에. 내부 조인은 참조 무결성을 적용하거나 조인 열이 NULL이 아닌 것으로 보장되는 데이터베이스에서만 안전하게 사용할 수 있습니다. 많은 트랜잭션 처리 관계형 데이터베이스는 데이터 무결성을 보장하기 위해 ACID (Atomicity, Consistency, Isolation, Durability) 데이터 업데이트 표준에 의존하므로 내부 조인이 적절한 선택이됩니다. 그러나 트랜잭션 데이터베이스에는 일반적으로 NULL이 허용되는 바람직한 조인 열도 있습니다.많은보고 관계형 데이터베이스 및 데이터웨어 하우스는 참조 무결성을 적용하기 어렵거나 불가능하게 만드는 대용량 ETL (추출, 변환,로드) 배치 업데이트를 사용하므로 SQL 쿼리 작성자가 수정할 수없고 내부 조인이 생략되는 잠재적 인 NULL 조인 열이 발생합니다. 오류 표시가없는 데이터. 내부 조인을 사용하기위한 선택은 데이터베이스 디자인 및 데이터 특성에 따라 다릅니다. 한 테이블의 조인 열에 NULL 값이 포함될 수있는 경우 왼쪽 외부 조인이 일반적으로 내부 조인으로 대체 될 수 있습니다.
NULL (비어 있음) 일 수있는 모든 데이터 열은 링크로 사용해서는 안됩니다. 의도 된 결과가 NULL 값이있는 행을 제거하는 것이 아닌 경우 내부 조인. NULL 조인 열을 결과 집합에서 의도적으로 제거해야하는 경우 테이블 조인 및 필터링이 단일 단계로 수행되기 때문에 내부 조인이 외부 조인보다 빠를 수 있습니다. 반대로 내부 조인은 SQL Where 절의 데이터베이스 함수와 함께 대용량 쿼리에 사용될 때 성능이 비참하게 느려지거나 서버 충돌을 초래할 수 있습니다. SQL Where 절의 함수로 인해 데이터베이스가 비교적 압축 된 테이블 인덱스를 무시할 수 있습니다. 데이터베이스는 계산 된 값에 의존하는 필터를 사용하여 행 수를 줄이기 전에 두 테이블에서 선택한 열을 읽고 내부 조인 할 수 있으므로 상대적으로 많은 양의 비효율적 인 처리가 발생합니다.
결과 집합시기 숫자 식별자 코드 (조회 테이블)의 전체 텍스트 설명을 조회하는 데 사용되는 마스터 테이블을 포함하여 여러 테이블을 결합하여 생성됩니다. 외래 키 중 하나에 NULL 값이 있으면 결과 집합에서 전체 행이 제거 될 수 있습니다. 오류 표시없이. 하나 이상의 내부 조인과 여러 외부 조인을 포함하는 복잡한 SQL 쿼리는 내부 조인 링크 열의 NULL 값에 대해 동일한 위험을 갖습니다.
내부 조인을 포함하는 SQL 코드에 대한 약정은 NULL 조인 열이 그렇지 않다고 가정합니다. 공급 업체 업데이트, 설계 변경 및 데이터 변환, 마이그레이션, 대량 가져 오기 및 병합과 같은 애플리케이션의 데이터 유효성 검사 규칙 외부의 대량 처리를 포함하여 향후 변경으로 인해 도입 될 수 있습니다.
내부 조인을 다음과 같이 추가로 분류 할 수 있습니다. 동등 조인, 자연 조인 또는 교차 조인
Equi-joinEdit
동등 조인은 동등 비교 만 사용하는 특정 유형의 비교기 기반 조인입니다. join-predicate에서. 다른 비교 연산자 (예 : <
)를 사용하면 조인이 동등 조인으로 실격됩니다. 위에 표시된 쿼리는 이미 동등 조인의 예를 제공했습니다.
SELECT *FROM employee JOIN department ON employee.DepartmentID = department.DepartmentID;
아래와 같이 동등 조인을 작성할 수 있습니다.
SELECT *FROM employee, departmentWHERE employee.DepartmentID = department.DepartmentID;
공동 일 경우 동등 조인의 lumn은 동일한 이름을 가지며, SQL-92는 USING
구문을 통해 동등 조인을 표현하기위한 선택적 단축 표기법을 제공합니다.
SELECT *FROM employee INNER JOIN department USING (DepartmentID);
USING
구조는 결과 집합이 결과와 다르기 때문에 단순한 구문 설탕 이상입니다. 명시 적 술어가있는 버전 세트. 특히 USING
목록에 언급 된 모든 열은 조인의 각 테이블에 대해 한 번이 아닌 정규화되지 않은 이름으로 한 번만 표시됩니다. 위의 경우 단일 DepartmentID
열이 있고 employee.DepartmentID
또는 department.DepartmentID
가 없습니다. .
USING
절은 MS SQL Server 및 Sybase에서 지원되지 않습니다.
Natural joinEdit
The natural 조인은 동등 조인의 특별한 경우입니다. 자연 조인 (⋈)은 R과 S가 관계인 (R ⋈ S)로 작성된 이항 연산자입니다. 자연 조인의 결과는 공통 속성 이름에서 동일한 R 및 S의 모든 튜플 조합 집합입니다.예를 들어 Employee 및 Dept 테이블과 해당 자연 조인을 고려하십시오.
|
|
|
관계의 구성을 정의하는 데 사용할 수도 있습니다. 예를 들어, Employee와 Dept의 구성은 위에 표시된 것처럼 공통 속성 DeptName을 제외하고 모두에 투영 된 조인입니다. 범주 이론에서 조인은 정확히 섬유 제품입니다.
자연 조인은 논리적 AND의 관계형 대응이므로 가장 중요한 연산자 중 하나입니다. AND로 연결된 두 술어 각각에 동일한 변수가 나타나면 해당 변수는 동일한 것을 나타내며 두 모양 모두 항상 동일한 값으로 대체되어야합니다. 특히 자연 조인을 사용하면 외래 키와 관련된 관계를 조합 할 수 있습니다. 예를 들어, 위의 예에서 외래 키는 Employee.DeptName에서 Dept.DeptName까지 보유 할 수 있으며 Employee와 Dept의 자연 조인은 모든 직원을 해당 부서와 결합합니다. 외래 키가 동일한 이름의 속성 사이에 있기 때문에 작동합니다. Dept.manager에서 Employee.Name으로의 외래 키와 같은 경우가 아니면 자연 조인을 수행하기 전에 이러한 열의 이름을 바꿔야합니다. 이러한 조인은 때때로 동등 조인이라고도합니다.
보다 공식적으로 자연 조인의 의미는 다음과 같이 정의됩니다.
R ⋈ S = {t ∪ s ∣ t ∈ R ∧ s ∈ S ∧ F un (t ∪ s)} {\ displaystyle R \ bowtie S = \ left \ {t \ cup s \ mid t \ in R \ \ land \ s \ in S \ \ land \ {\ mathit {Fun}} (t \ cup s) \ right \}},
여기서 Fun은 r이 함수 인 경우에만 관계 r에 대해 참인 술어입니다. 일반적으로 R과 S에는 하나 이상의 공통 속성이 있어야하지만이 제약 조건이 생략되고 R과 S에 공통 속성이 없으면 자연 조인은 정확히 데카르트 곱이됩니다.
The 자연 조인은 다음과 같이 Codd의 프리미티브로 시뮬레이션 할 수 있습니다. c1,…, cm을 R 및 S에 공통적 인 속성 이름으로, r1,…, rn을 R에 고유 한 속성 이름으로, s1,…, sk를 S에 고유 한 속성. 또한 속성 이름 x1,…, xm이 R 또는 S에 없다고 가정합니다. 첫 번째 단계에서 S의 공통 속성 이름은 이제 이름을 바꿀 수 있습니다.
T = ρ x 1 / c 1,…, xm / cm (S) = ρ x 1 / c 1 (ρ x 2 / c 2 (… ρ xm / cm (S)…)) {\ displaystyle T = \ rho _ {x_ {1} / c_ {1}, \ ldots, x_ {m} / c_ {m}} (S) = \ rho _ {x_ {1} / c_ {1}} (\ rho _ {x_ {2} / c_ {2 }} (\ ldots \ rho _ {x_ {m} / c_ {m}} (S) \ ldots))}
그런 다음 카티 전 곱을 취하고 조인 할 튜플을 선택합니다.
U = π r 1,…, rn, c 1,…, cm, s 1,…, sk (P) {\ displaystyle U = \ pi _ {r_ {1}, \ ldots, r_ {n}, c_ {1}, \ ldots, c_ {m}, s_ {1}, \ ldots, s_ {k}} (P)}
자연 결합은 등가의 유형입니다. 조인 된 테이블에서 동일한 열 이름을 가진 두 테이블의 모든 열을 비교하여 조인 술부가 내재적으로 발생하는 조인. 결과 조인 된 테이블에는 동일한 이름의 열 쌍마다 하나의 열만 포함됩니다. 같은 이름의 열이 발견되지 않으면 결과는 교차 조인입니다.
대부분의 전문가는 NATURAL JOIN이 위험하다는 데 동의하므로 사용을 강력히 권장하지 않습니다. 다른 테이블의 다른 열과 이름이 같은 새 열을 실수로 추가하면 위험이 발생합니다. 기존의 자연 조인은 “자연적으로”비교를 위해 새 열을 사용하여 이전과 다른 기준 (다른 열의)을 사용하여 비교 / 일치를 수행 할 수 있습니다. 따라서 테이블의 데이터가 변경되지 않고 증가 된 경우에도 기존 쿼리는 다른 결과를 생성 할 수 있습니다.테이블 링크를 자동으로 결정하기 위해 열 이름을 사용하는 것은 이름 지정 규칙에 비현실적인 제약 조건을 적용하는 수백 또는 수천 개의 테이블이있는 대규모 데이터베이스의 옵션이 아닙니다. 실제 데이터베이스는 일반적으로 비즈니스 규칙 및 컨텍스트로 인해 일관되게 채워지지 않은 (NULL 값 허용) 외래 키 데이터로 설계됩니다. 서로 다른 테이블에서 유사한 데이터의 열 이름을 수정하는 것이 일반적이며 이러한 엄격한 일관성의 결여로 인해 자연스러운 조인이 이론적 개념으로 넘어갑니다.
위의 내부 조인 쿼리는 자연스러운 것으로 표현할 수 있습니다. 다음과 같은 방식으로 조인합니다.
SELECT *FROM employee NATURAL JOIN department;
명시적인 USING
절과 마찬가지로 한정자없이 조인 된 테이블에 DepartmentID 열이 하나만 발생합니다.
DepartmentID | Employee.LastName | Department.DepartmentName |
---|---|---|
34 | Smith | 사무직 |
33 | Jones | 엔지니어링 |
34 | Robinson | 사무직 |
33 | Heisenberg | 엔지니어링 |
31 | Rafferty | 판매 |
PostgreSQL, MySQL 및 Oracle su pport 자연 조인; Microsoft T-SQL 및 IBM DB2는 그렇지 않습니다. 조인에 사용 된 열은 암시 적이므로 조인 코드는 예상되는 열을 표시하지 않으며 열 이름을 변경하면 결과가 변경 될 수 있습니다. SQL : 2011 표준에서 자연 조인은 선택적 F401, “확장 조인 테이블”, 패키지의 일부입니다.
많은 데이터베이스 환경에서 열 이름은 쿼리 개발자가 아닌 외부 공급 업체에 의해 제어됩니다. 자연 조인은 공급 업체에서 요구하는 버전 업그레이드 중에 변경 될 수있는 열 이름의 안정성과 일관성을 가정합니다.