내부 조인은 두 조인 된 테이블의 각 행에 일치하는 열 값이 있어야하며 응용 프로그램에서 일반적으로 사용되는 조인 작업이지만 최선의 선택이라고 가정해서는 안됩니다. 모든 상황에서. 내부 조인은 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
read more