가입(SQL)

Join (SQL)

SQL의 join 절(관계대수의 join 연산에 대응)은 하나 이상의 테이블의 열을 새 테이블로 결합합니다.ANSI 표준 SQL은 5가지 타입을 지정합니다.JOIN:INNER,LEFT OUTER,RIGHT OUTER,FULL OUTER그리고.CROSS.

샘플 테이블

조인 유형에 대해 설명하려면 이 문서의 나머지 부분에서는 다음 표를 사용합니다.

종업원 테이블
부서아이디
래퍼티 31
존스 33
하이젠베르크 33
로빈슨 34
스미스 34
윌리엄스 NULL
부문표
부서아이디 부서명
31 판매의
33 공학 기술
34 사무직
35 마케팅.

Department.DepartmentID프라이머리 키입니다.Department반면 테이블은Employee.DepartmentID는 외부 키입니다.

에 주의해 주세요.Employee"윌리엄스"는 아직 부서에 할당되지 않았습니다.또, 「마케팅」부문에 배치된 종업원은 없습니다.

위의 테이블을 작성하기 위한 SQL 문을 다음에 나타냅니다.

만들다 테이블 부서(     부서아이디 인트 기본적인 열쇠 것은 아니다. 특수한 순서,     부서명 바샤르(20) );  만들다 테이블 직원 (      바샤르(20),     부서아이디 인트 레퍼런스 부서(부서아이디) );  삽입 안으로 부서 가치 (31, '세일즈),        (33, '엔지니어링'),        (34, '클래리컬'),        (35, '마케팅');  삽입 안으로 직원 가치 ('래퍼티', 31),        ('존스', 33),        (하이젠베르크, 33),        ('로빈슨', 34),        ('스미스', 34),        ('윌리엄스', 특수한 순서); 

크로스 조인

CROSS JOIN조인 테이블에서 행의 데카르트 곱을 반환합니다.즉, 첫 번째 테이블의 각 행과 두 번째 테이블의 각 행을 결합하는 행을 생성합니다.[1]

직원. 직원.부서아이디 부서.부서명 부서.부서아이디
래퍼티 31 판매의 31
존스 33 판매의 31
하이젠베르크 33 판매의 31
스미스 34 판매의 31
로빈슨 34 판매의 31
윌리엄스 NULL 판매의 31
래퍼티 31 공학 기술 33
존스 33 공학 기술 33
하이젠베르크 33 공학 기술 33
스미스 34 공학 기술 33
로빈슨 34 공학 기술 33
윌리엄스 NULL 공학 기술 33
래퍼티 31 사무직 34
존스 33 사무직 34
하이젠베르크 33 사무직 34
스미스 34 사무직 34
로빈슨 34 사무직 34
윌리엄스 NULL 사무직 34
래퍼티 31 마케팅. 35
존스 33 마케팅. 35
하이젠베르크 33 마케팅. 35
스미스 34 마케팅. 35
로빈슨 34 마케팅. 35
윌리엄스 NULL 마케팅. 35


명시적 교차 결합의 예:

선택한다. * 부터 직원 건너다 합류하다 부서; 

암묵적인 크로스 조인 예:

선택한다. * 부터 직원, 부서; 

크로스 조인(cross join)은 항상 참인 상태의 내부 조인(inner join)으로 대체할 수 있습니다.

선택한다. * 부터 직원 내부 합류하다 부서  1=1; 

CROSS JOIN는 조인된 테이블에서 행을 필터링하기 위해 술어를 적용하지 않습니다.의 결과CROSS JOIN절을 사용하여 필터링할 수 있으며, 이 절은 내부 결합과 동등한 값을 생성할 수 있습니다.

SQL:2011 표준에서는 크로스 조인(cross join)은 옵션인 F401 "확장 조인 테이블" 패키지의 일부입니다.

일반적으로 서버의 [why?]성능을 확인하는 데 사용됩니다.

이너 조인트

내부 조인에서는 2개의 조인된 테이블의 각 행에 일치하는 열 값이 있어야 합니다.또한 어플리케이션에서 일반적으로 사용되는 조인 조작이지만 모든 상황에서 최선의 선택이라고는 할 수 없습니다.내부 조인에서는 조인-프리디케이트를 기반으로 2개의 테이블(A 및 B)의 열 값을 조합하여 새로운 결과 테이블을 만듭니다.쿼리는 A의 각 행을 B의 각 행과 비교하여 join-predicate를 충족하는 모든 행 쌍을 찾습니다.NULL 이외의 값을 일치시킴으로써 join-predicate가 충족되면 A와 B의 각 행 쌍의 열 값이 결과 행으로 결합됩니다.

조인 결과는 먼저 테이블 내의 모든 행의 데카르트 곱(또는 크로스 조인)을 취하여(테이블A의 각 행과 테이블B의 각 행을 조합) 조인 술어를 만족시키는 모든 행을 반환한 결과로 정의할 수 있습니다.실제 SQL 구현에서는 일반적으로 해시 조인이나 정렬 병합 조인 등의 다른 방법을 사용합니다. 왜냐하면 데카르트 제품의 계산 속도가 느리고 저장에 엄청나게 많은 메모리가 필요하기 때문입니다.

SQL은 조인을 표현하기 위한 두 가지 구문적 방법인 "명시적 조인 표기법"과 "명시적 조인 표기법"을 지정합니다.암묵적인 조인 표기법은 데이터베이스 시스템이 계속 지원하지만 더 이상 베스트 프랙티스로 간주되지 않습니다.

「명시적인 조인 표기법」에서는,JOIN키워드, 옵션 앞에INNER키워드: 가입할 테이블을 지정합니다.ON다음 예시와 같이 가입 술어를 지정합니다.

선택한다. 직원., 직원.부서아이디, 부서.부서명  부터 직원  내부 합류하다 부서  직원.부서아이디 = 부서.부서아이디; 
직원. 직원.부서아이디 부서.부서명
로빈슨 34 사무직
존스 33 공학 기술
스미스 34 사무직
하이젠베르크 33 공학 기술
래퍼티 31 판매의

"암시적인 결합 표기법"은 단순히 결합을 위한 테이블을 나열할 뿐입니다.FROM의 조항SELECT쉼표를 사용하여 구분합니다.따라서 크로스 조인(cross join)을 지정하고,WHERE구에서는 (명시적인 표기의 join-requestates와 동등하게 기능하는) 추가 필터 증명서를 적용할 수 있습니다.

다음 예시는 앞의 예와 동일하지만 이번에는 암묵적인 Join 표기법을 사용합니다.

선택한다. 직원., 직원.부서아이디, 부서.부서명  부터 직원, 부서 어디에 직원.부서아이디 = 부서.부서아이디; 

위의 예에서 제시된 쿼리는 부서를 사용하여 직원 및 부서 테이블에 결합됩니다.양쪽 테이블의 [ID]부서가 있는 곳이러한 테이블의 ID가 일치합니다(즉, join-predicate가 충족됨). 쿼리는 LastName, Department를 결합합니다. 테이블의 ID 열과 DepartmentName 열을 결과 행으로 만듭니다.부서가 있는 곳ID가 일치하지 않아 결과 행이 생성되지 않습니다.

따라서 위의 쿼리 실행 결과는 다음과 같습니다.

직원. 직원.부서아이디 부서.부서명
로빈슨 34 사무직
존스 33 공학 기술
스미스 34 사무직
하이젠베르크 33 공학 기술
래퍼티 31 판매의

직원 "Williams" 및 부서 "Marketing"은 쿼리 실행 결과에 나타나지 않습니다.다른 표에 일치하는 행이 없습니다.「 Williams 」에는 관련 부서가 없고, 부문 ID 35(「마케팅」)를 가지는 종업원은 없습니다.원하는 결과에 따라서는 이 동작이 미묘한 버그일 수 있습니다.이는 내부 조인을 외부 조인으로 대체함으로써 회피할 수 있습니다.

내부 조인 및 NULL 값

NULL 값을 포함할 수 있는 열의 테이블을 조인할 때는 특히 주의해야 합니다.NULL은 다른 값(NULL 자체도 아님)과 일치하지 않기 때문입니다.단, 조인 조건이 처음에 조인 열이 다음과 같은 것을 확인하는 조합 술어를 명시적으로 사용하지 않는 한, NULL은 다른 값과 일치하지 않습니다. NOT NULL나머지 술어 조건을 적용하기 전에.내부 결합은 참조 무결성을 적용하는 데이터베이스 또는 결합 이 NULL이 아닌 것으로 보장되는 데이터베이스에서만 안전하게 사용할 수 있습니다. 많은 트랜잭션 처리 관계형 데이터베이스는 데이터의 무결성을 보장하기 위해 ACID(원자성, 일관성, 격리, 내구성) 데이터 업데이트 표준에 의존하므로 내부 결합이 적절한 선택입니다.그러나 트랜잭션 데이터베이스에는 일반적으로 NULL이 허용되는 바람직한 조인 열도 있습니다. 많은 보고서 관계형 데이터베이스 및 데이터 웨어하우스에서는 대용량의 ETL(Extract, Transform, Load) 배치 업데이트를 사용하여 참조 무결성을 어렵게 하거나 강제할 수 없으므로 SQL 쿼리에서 NULL 조인 열이 발생할 수 있습니다.author는 수정할 수 없으며 이로 인해 내부 조인 데이터가 누락되고 오류가 표시되지 않습니다.내부 결합을 사용할지 여부는 데이터베이스 설계 및 데이터 특성에 따라 달라집니다.일반적으로 왼쪽 외부 조인은 한 테이블의 조인 열에 NULL 값이 포함될 수 있는 경우 내부 조인 대신 사용할 수 있습니다.

NULL(비어 있음)일 수 있는 데이터 열은 NULL 값을 가진 행을 삭제하는 것이 의도된 결과가 아닌 한 내부 조인에서 링크로 사용하지 마십시오.NULL 조인 열을 결과 세트에서 의도적으로 삭제하는 경우 테이블 조인 및 필터링이 한 번에 이루어지므로 내부 조인 속도가 외부 조인보다 빠를 수 있습니다.반대로 내부 조인은 SQL [2][3][4]Where 절의 데이터베이스 기능과 함께 대용량 쿼리에서 사용할 경우 성능이 크게 저하되거나 서버 크래시가 발생할 수 있습니다.SQL Where 절의 함수로 인해 데이터베이스가 비교적 컴팩트한 테이블 인덱스를 무시할 수 있습니다.데이터베이스는 계산된 값에 따라 달라지는 필터를 사용하여 행 수를 줄이기 전에 두 테이블에서 선택한 열을 읽고 내부 결합할 수 있습니다. 따라서 처리 효율성이 상대적으로 크게 저하됩니다.

숫자 식별 코드(룩업 테이블)의 전체 텍스트 설명을 검색하기 위해 사용되는 마스터 테이블을 포함하여 결과 세트를 결합함으로써 결과 세트를 생성하는 경우, 외부 키 중 하나에 NULL 값이 있으면 결과 세트에서 전체 행이 삭제되고 오류가 표시되지 않을 수 있습니다.하나 이상의 내부 조인과 여러 외부 조인을 포함하는 복잡한 SQL 쿼리는 내부 조인 링크 열의 NULL 값에 대해 동일한 위험이 있습니다.

내부 조인을 포함하는 SQL 코드에 대한 커밋은 NULL 조인 열이 향후 벤더 업데이트, 설계 변경 및 데이터 변환, 마이그레이션, 대량 Import 및 병합 등의 애플리케이션 데이터 검증 규칙 이외의 벌크 처리로 인해 도입되지 않을 것으로 가정합니다.

내부 결합을 등가 결합, 자연 결합 또는 교차 결합으로 추가로 분류할 수 있습니다.

에퀴조인

equi-join은 대조군 기반 조인의 특정 유형으로, 조인-프리케이트에서 동등 비교만 사용합니다.다른 비교 연산자 사용(예:<)는 가입이 등호로서 부적격입니다.위에 표시된 쿼리는 equi-join의 예를 이미 제공했습니다.

선택한다. * 부터 직원 합류하다 부서    직원.부서아이디 = 부서.부서아이디; 

우리는 다음과 같이 equi-join을 쓸 수 있다.

선택한다. * 부터 직원, 부서 어디에 직원.부서아이디 = 부서.부서아이디; 

equi-join의 컬럼이 같은 이름을 가진 경우 SQL-92는 equi-join을 표현하기 위한 생략형 표기를 옵션으로 제공합니다.USING구성:[5]

선택한다. * 부터 직원 내부 합류하다 부서 사용. (부서아이디); 

USING그러나 결과 집합이 명시적 술어를 가진 버전의 결과 집합과 다르기 때문에 구성은 단순한 구문 설탕 이상입니다.구체적으로는 에 기재되어 있는 모든 컬럼USING목록은 가입 테이블별로 한 번이 아니라 정규화되지 않은 이름으로 한 번만 나타납니다.위의 경우, 싱글이 있습니다.DepartmentIDcolumn과employee.DepartmentID또는department.DepartmentID.

USING절은 MS SQL Server 및 Sybase에서 지원되지 않습니다.

내추럴 조인

자연 결합은 에퀴 결합의 특별한 경우입니다.자연 결합())은 (R s S)로 표기되는 이항 연산자이며, 여기R과 S는 [6]관계입니다.자연 결합의 결과는 공통 속성 이름동일한 R과 S의 모든 튜플 조합의 집합입니다.를 들어 직원과 부서 및 이들의 자연스러운 참여를 고려합니다.

직원
이름. EmpId 부서명
해리. 3415 자금
샐리 2241 판매의
조지 3401 자금
해리엇 2202 판매의
부서
부서명 부장님
자금 조지
판매의 해리엇
생산. 찰스
직원 부서
이름. EmpId 부서명 부장님
해리. 3415 자금 조지
샐리 2241 판매의 해리엇
조지 3401 자금 조지
해리엇 2202 판매의 해리엇

이것은 관계의 구성을 정의하는 데도 사용할 수 있습니다.예를 들어 Employee와 Dept구성은 위와 같이 공통 속성인 DeptName을 제외한 모든 Atribute에 투영됩니다.범주 이론에서 결합은 정확히 섬유 제품입니다.

자연 결합은 논리 AND의 관계적 대응이므로 가장 중요한 연산자 중 하나입니다.AND에 의해 연결된 두 개의 술어 각각에 동일한 변수가 표시되는 경우 해당 변수는 동일한 것을 나타내며 두 개의 외관은 항상 동일한 값으로 대체해야 합니다.특히 자연 결합을 사용하면 외부 키에 의해 연관된 관계를 조합할 수 있습니다.예를 들어 위의 예에서는 Employee에서 외부 키가 보관되어 있을 수 있습니다.DeptName에서 Dept로DeptName을 거쳐 Employee와 Dept자연스러운 참여로 모든 직원이 자신의 부서와 결합됩니다.이것은, 외부 키가 같은 이름의 어트리뷰트간에 보관 유지되기 때문에 기능합니다.Dept.manager에서 Employee로의 외부 키와 같은 경우가 아닌 경우.그런 다음 이 열들의 이름을 변경해야 자연 결합을 사용할 수 있습니다.이러한 결합을 에퀴 결합이라고도 합니다.

보다 공식적으로 자연 결합의 의미는 다음과 같이 정의됩니다.

{ t R ( s ) { R \ \ { \ \ R \ land \ S \ land \ land \ \ \ \ \ { Fun ( t ) \ )

여기서 Fun은 r이 함수경우에만 r 관계에 대해 인 술어입니다.일반적으로 R과 S는 적어도 하나의 공통 속성을 가져야 하지만 이 제약 조건이 생략되고 R과 S가 공통 속성을 갖지 않으면 자연 결합은 정확히 데카르트 곱이 됩니다.

자연 결합은 다음과 같이 Codd의 원본을 사용하여 시뮬레이션할 수 있습니다.c, …, cm R S공통되는1 Atribute 이름, rn, …, r을 R에 고유한 Atribute 이름, s, …, sk S에 고유한 Atribute로 합니다11.게다가 속성명1 x, …, xm R에도 S에도 없다고 가정합니다.첫 번째 단계에서 S의 공통 속성 이름을 변경할 수 있습니다.

그런 다음 데카르트 곱을 사용하여 결합할 튜플을 선택합니다.

내추럴 조인(Natural Join)은 조인된 테이블에서 동일한 열 이름을 가진 두 테이블의 모든 열을 비교함으로써 조인 술어가 암묵적으로 발생하는 등가 조인 유형입니다.결과적으로 결합된 테이블에는 동일한 이름의 각 열 쌍에 대해 하나의 열만 포함됩니다.같은 이름의 열이 없는 경우 교차 결합이 됩니다.

대부분의 전문가들은 내추럴 조인(NATUAL JOIN)이 위험하기 때문에 사용을 [7]강력히 권장하지 않는다는데 동의합니다.이 위험은 다른 표의 다른 열과 동일한 이름의 새 열을 잘못 추가하면 발생합니다.기존 자연 결합은 "자연스럽게" 비교를 위해 새 열을 사용할 수 있으며, 이전과 다른 기준(다른 열)을 사용하여 비교/일치를 수행할 수 있습니다.따라서 테이블의 데이터는 변경되지 않고 증강되었을 뿐이지만 기존 쿼리는 다른 결과를 생성할 수 있습니다.테이블 링크를 자동으로 결정하기 위해 열 이름을 사용하는 것은 이름 지정 규칙에 비현실적인 제약을 가하는 수백 또는 수천 개의 테이블이 있는 대규모 데이터베이스에서는 선택사항이 아닙니다.실제 데이터베이스는 일반적으로 비즈니스 규칙 및 컨텍스트에 따라 일관되게 채워지지 않는 외부 키 데이터를 사용하여 설계됩니다(NULL 값은 허용됨).서로 다른 표에서 유사한 데이터의 열 이름을 수정하는 것이 일반적이며, 이러한 엄격한 일관성의 결여는 논의를 위한 이론적 개념으로 자연 결합을 유도한다.

내부 결합에 대한 위의 샘플 쿼리는 다음과 같은 방법으로 자연스러운 결합으로 표현할 수 있습니다.

선택한다. * 부터 직원 자연의 합류하다 부서; 

명시적인 것과 마찬가지로USING조항, 하나의 부서만조인된 테이블에서 ID 열이 수식자 없이 나타납니다.

부서아이디 직원. 부서.부서명
34 스미스 사무직
33 존스 공학 기술
34 로빈슨 사무직
33 하이젠베르크 공학 기술
31 래퍼티 판매의

PostgreSQL, MySQL 및 Oracle은 자연스러운 조인을 지원하지만 Microsoft T-SQL 및 IBM DB2는 지원하지 않습니다.조인에서 사용되는 열은 암묵적이므로 조인 코드는 예상되는 열을 나타내지 않으며 열 이름을 변경하면 결과가 변경될 수 있습니다.SQL:2011 표준에서는 자연 조인은 옵션인 F401 "확장 조인트 테이블" 패키지의 일부입니다.

많은 데이터베이스 환경에서 열 이름은 쿼리 개발자가 아닌 외부 공급업체에 의해 제어됩니다.자연스러운 결합은 벤더 필수 버전 업그레이드 중에 변경될 수 있는 열 이름의 안정성과 일관성을 가정합니다.

아우터 조인트

조인된 테이블은 다른 일치하는 행이 없는 경우에도 각 행을 유지합니다.외부 조인은 왼쪽, 오른쪽 또는 양쪽 테이블의 행에 따라 왼쪽 외부 조인, 오른쪽 외부 조인 및 전체 외부 조인으로 세분됩니다(이 경우 왼쪽과 오른쪽은 두 개의 측면을 나타냅니다).JOIN키워드를 지정합니다.내부 조인과 마찬가지로 모든 유형의 외부 조인을 등가 조인, 자연 조인으로 더욱 세분화할 수 있습니다.ON <predicate>(157-1983) [8]

표준 SQL에 외부 조인에 대한 암묵적인 조인 알림이 없습니다.

A Venn Diagram showing the left circle and overlapping portion filled.
표 A와 B 사이의 Left Join SQL 문을 나타내는 Venn 다이어그램.

좌측 아우터 조인트

테이블 A와 B의 왼쪽 외부 조인(또는 단순히 왼쪽 조인) 결과에는 조인 조건이 "오른쪽" 테이블(B)에 일치하는 행을 찾을 수 없는 경우에도 항상 "왼쪽" 테이블(A)의 모든 행이 포함됩니다.즉, 이 경우,ON구는 B의 0(제로) 행과 일치하지만(A의 특정 행에 대해) 조인에서는 결과(그 행에 대해) 행이 반환되지만 B의 각 열에 NULL이 반환됩니다.왼쪽 외부 조인은 내부 조인의 모든 값과 링크 열에 NULL(빈) 값이 있는 행을 포함하여 오른쪽 테이블과 일치하지 않는 왼쪽 테이블의 모든 값을 반환합니다.

예를 들어, 직원의 부서를 찾을 수 있지만, 여전히 부서에 할당되지 않은 직원을 표시합니다(위의 내부 조인 예와 달리, 미할당 직원은 결과에서 제외됨).

왼쪽 외측 조인(키워드는 옵션)의 예와 결과행(내측 조인과 비교)의 이탤릭체는 다음과 같습니다.

선택한다. * 부터 직원  왼쪽 외부 합류하다 부서  직원.부서아이디 = 부서.부서아이디; 
직원. 직원.부서아이디 부서.부서명 부서.부서아이디
존스 33 공학 기술 33
래퍼티 31 판매의 31
로빈슨 34 사무직 34
스미스 34 사무직 34
윌리엄스 NULL NULL NULL
하이젠베르크 33 공학 기술 33

대체 구문

Oracle은 사용되지[9] 않는 구문을 지원합니다.

선택한다. * 부터 직원, 부서 어디에 직원.부서아이디 = 부서.부서아이디(+) 

Sybase는 다음 구문을 지원합니다(Microsoft SQL Server는 버전 2000 이후 이 구문을 사용하지 않습니다).

선택한다. * 부터 직원, 부서 어디에 직원.부서아이디 *= 부서.부서아이디 

IBM Informix는 다음 구문을 지원합니다.

선택한다. * 부터 직원, 외부 부서 어디에 직원.부서아이디 = 부서.부서아이디 
A Venn Diagram show the right circle and overlapping portions filled.
표 A와 B 사이의 Right Join SQL 문을 나타내는 Venn 다이어그램.

우측 아우터 조인트

우측 아우터 조인(또는 우측 조인)은 테이블을 반대로 처리하는 경우를 제외하고 좌측 아우터 조인과 매우 유사합니다.오른쪽 테이블(B)의 모든 행이 조인된 테이블에 한 번 이상 나타납니다."왼쪽" 테이블(A)에 일치하는 행이 없는 경우 B에 일치하지 않는 행에 대해 A의 열에 NULL이 표시됩니다.

오른쪽 외부 조인에서는 오른쪽 테이블의 모든 값과 왼쪽 테이블의 일치된 값이 반환됩니다(일치하는 조인 술어가 없는 경우 NULL).예를 들어 각 직원 및 해당 부서를 찾을 수 있지만 직원이 없는 부서를 표시할 수 있습니다.

다음에 나타내는 것은 오른쪽 외부 조인(키워드는 옵션)의 예이며, 추가 결과 행은 이탤릭체로 표시됩니다.

선택한다. * 부터 직원 맞다 외부 합류하다 부서    직원.부서아이디 = 부서.부서아이디; 
직원. 직원.부서아이디 부서.부서명 부서.부서아이디
스미스 34 사무직 34
존스 33 공학 기술 33
로빈슨 34 사무직 34
하이젠베르크 33 공학 기술 33
래퍼티 31 판매의 31
NULL NULL 마케팅. 35

오른쪽 및 왼쪽 외부 결합은 기능적으로 동일합니다.어느 쪽도 다른 쪽에도 없는 기능을 제공하지 않기 때문에 테이블 순서가 바뀌면 오른쪽과 왼쪽의 외부 결합이 서로 대체될 수 있습니다.

A Venn Diagram showing the right circle, left circle, and overlapping portion filled.
표 A와 B 사이의 완전 가입 SQL 문을 나타내는 Venn 다이어그램.

풀 아우터 조인트

개념적으로 풀 아우터 조인(Full Outer Join)은 좌우 아우터 조인(Outer Join)을 모두 적용하는 효과를 결합합니다.FULL OUTER JOINED 테이블의 행이 일치하지 않는 경우 결과 세트는 일치하는 행이 없는 테이블의 각 열에 대해 NULL 값을 가집니다.일치하는 행의 경우 결과 세트(양쪽 테이블에서 채워진 열 포함)에 단일 행이 생성됩니다.

예를 들어, 한 부서에 있는 각 직원과 직원이 있는 각 부서에 있는 각 직원을 볼 수 있지만, 해당 부서에 속해 있지 않은 각 직원과 직원이 없는 각 부서도 볼 수 있습니다.

풀 아우터 조인의 예(키워드는 임의)

선택한다. * 부터 직원 가득한 외부 합류하다 부서    직원.부서아이디 = 부서.부서아이디; 
직원. 직원.부서아이디 부서.부서명 부서.부서아이디
스미스 34 사무직 34
존스 33 공학 기술 33
로빈슨 34 사무직 34
윌리엄스 NULL NULL NULL
하이젠베르크 33 공학 기술 33
래퍼티 31 판매의 31
NULL NULL 마케팅. 35

일부 데이터베이스 시스템은 전체 외부 조인 기능을 직접 지원하지 않지만 내부 조인 및 UNION ALL이 각각 왼쪽 및 오른쪽 테이블에서 "단일 테이블 행"을 선택하여 에뮬레이트할 수 있습니다.같은 예를 다음에 나타냅니다.

선택한다. 직원., 직원.부서아이디,        부서.부서명, 부서.부서아이디 부터 직원 내부 합류하다 부서  직원.부서아이디 = 부서.부서아이디  유니온 모든.  선택한다. 직원., 직원.부서아이디,        출연자들(특수한 순서 ~하듯이 바카(20)), 출연자들(특수한 순서 ~하듯이 정수) 부터 직원 어디에 것은 아니다. 존재한다 (     선택한다. * 부터 부서              어디에 직원.부서아이디 = 부서.부서아이디)  유니온 모든.  선택한다. 출연자들(특수한 순서 ~하듯이 바카(20)), 출연자들(특수한 순서 ~하듯이 정수),        부서.부서명, 부서.부서아이디 부터 부서 어디에 것은 아니다. 존재한다 (     선택한다. * 부터 직원              어디에 직원.부서아이디 = 부서.부서아이디) 

또 다른 접근법은 왼쪽 외측 결합의 UNION ALL과 오른쪽 외측 결합의 MINUS 내부 결합입니다.

셀프조인

셀프 조인(self-join)[10]이 스스로 테이블을 결합하고 있습니다.

종업원용 테이블이 2개 있고 첫 번째 테이블의 종업원이 두 번째 테이블의 종업원과 같은 국가를 가지도록 요구된 쿼리가 있는 경우 일반 조인 조작을 사용하여 응답 테이블을 찾을 수 있습니다.그러나 모든 직원 정보는 하나의 큰 테이블에 [11]포함되어 있습니다.

수정 검토Employee다음과 같은 테이블입니다.

종업원 테이블
직원아이디 나라 부서아이디
123 래퍼티 호주. 31
124 존스 호주. 33
145 하이젠베르크 호주. 33
201 로빈슨 미국 34
305 스미스 독일. 34
306 윌리엄스 독일. NULL

솔루션 조회의 예는 다음과 같습니다.

선택한다. F.직원아이디, F., S.직원아이디, S., F.나라 부터 직원 F 내부 합류하다 직원 S  F.나라 = S.나라 어디에 F.직원아이디 < > S.직원아이디 주문 타고 F.직원아이디, S.직원아이디; 

그 결과 다음 테이블이 생성됩니다.

국가별 셀프 가입 후 직원 테이블
직원아이디 직원아이디 나라
123 래퍼티 124 존스 호주.
123 래퍼티 145 하이젠베르크 호주.
124 존스 145 하이젠베르크 호주.
305 스미스 306 윌리엄스 독일.

이 예에서는 다음과 같습니다.

  • F그리고.S는 직원 테이블의 첫 번째 복사본과 두 번째 복사본의 별칭입니다.
  • 조건F.Country = S.Country에는, 다른 나라에 있는 종업원간의 편성은 제외됩니다.예제 질문에서는 같은 나라에 있는 직원 쌍만 원했습니다.
  • 조건F.EmployeeID < S.EmployeeID여기서의 페어링은 제외됩니다.EmployeeID첫 번째 종업원이 다음보다 크거나 같은 경우EmployeeID두 번째 직원과 함께요.즉, 이 조건의 효과는 중복된 페어링과 셀프 페어링을 배제하는 것입니다.그렇지 않으면 다음과 같은 덜 유용한 표가 생성됩니다(아래 표는 결과의 "독일" 부분만 표시됨).
직원아이디 직원아이디 나라
305 스미스 305 스미스 독일.
305 스미스 306 윌리엄스 독일.
306 윌리엄스 305 스미스 독일.
306 윌리엄스 306 윌리엄스 독일.

첫 번째 질문을 충족시키기 위해 필요한 것은 두 개의 중간 쌍 중 하나이며, 이 예에서는 맨 위 쌍과 맨 아래 쌍은 전혀 관계가 없습니다.

대체 수단

외부 결합의 효과는 결합 조건을 충족하지 않는 "메인" 테이블의 행 선택과 내부 결합 사이에 UNION ALL을 사용하여 얻을 수도 있습니다.예를들면,

선택한다. 직원., 직원.부서아이디, 부서.부서명 부터 직원 왼쪽 외부 합류하다 부서  직원.부서아이디 = 부서.부서아이디; 

라고도 쓸 수 있다

선택한다. 직원., 직원.부서아이디, 부서.부서명 부터 직원 내부 합류하다 부서  직원.부서아이디 = 부서.부서아이디  유니온 모든.  선택한다. 직원., 직원.부서아이디, 출연자들(특수한 순서 ~하듯이 바카(20)) 부터 직원 어디에 것은 아니다. 존재한다 (     선택한다. * 부터 부서              어디에 직원.부서아이디 = 부서.부서아이디) 

실행

관계형 시스템은 일반적으로 조인을 요구하지만 효율적인 실행을 최적화하는 데 어려움을 겪기 때문에 데이터베이스 시스템의 많은 작업은 조인의 효율적인 구현을 목표로 하고 있습니다.이 문제는 내부 조인(inner join)이 치환적연관적으로 동작하기 때문에 발생합니다.실제로 이는 사용자가 가입하기 위한 테이블 목록과 이용하기 위한 가입 조건만 제공한다는 것을 의미하며 데이터베이스 시스템은 조작을 실행하는 가장 효율적인 방법을 결정하는 태스크를 가지고 있다.쿼리 옵티마이저는 조인을 포함한 쿼리를 실행하는 방법을 결정한다.쿼리 옵티마이저에는 다음 두 가지 기본 자유가 있습니다.

  1. 가입 순서:이 명령어는 치환적 및 연관적으로 함수를 결합하기 때문에 시스템이 테이블을 결합하는 순서에 따라 쿼리의 최종 결과 집합은 변경되지 않습니다.단, Join-Order는 Join 조작 비용에 큰 영향을 미칠 수 있으므로 최적의 Join 순서를 선택하는 것이 매우 중요합니다.
  2. 조인 방식: 2개의 테이블과 조인 조건을 지정하면 여러 알고리즘에 의해 조인 결과 세트를 생성할 수 있습니다.어떤 알고리즘이 가장 효율적으로 실행될지는 입력 테이블의 크기, 조인 조건과 일치하는 각 테이블의 행 수 및 쿼리의 나머지 부분에서 필요한 조작에 따라 달라집니다.

많은 결합 알고리즘은 입력을 다르게 처리합니다.조인에 대한 입력을 각각 "외부" 및 "내부" 조인 오퍼랜드 또는 "왼쪽"과 "오른쪽"이라고 할 수 있습니다.예를 들어 중첩된 루프의 경우 데이터베이스 시스템은 외부 관계의 각 행에 대해 전체 내부 관계를 스캔합니다.

조인을 포함한 쿼리 플랜은 [12]다음과 같이 분류할 수 있습니다.

왼쪽 깊이의
계획에서 각 조인의 내부 오퍼랜드로 베이스 테이블(다른 조인이 아닌)을 사용
오른쪽 깊이의
기본 테이블을 계획에서 각 결합의 외부 피연산자로 사용
무성한
좌심도 우심도 아니다; 결합에 대한 두 입력은 결합 자체에서 발생할 수 있다.

이러한 이름은 트리로 그려진 경우 쿼리 계획의 모양에서 파생되며 외부 결합 관계는 왼쪽에 있고 내부 관계는 오른쪽에 있습니다(규칙에 따라).

결합 알고리즘

결합 조작을 실행하기 위한 기본적인 알고리즘은 네스트 루프 결합, 정렬 병합 결합 및 해시 결합의 3가지가 있습니다.

인덱스 결합

조인 인덱스는 데이터 웨어하우스에서 조인 쿼리를 쉽게 처리할 수 있는 데이터베이스 인덱스입니다. 현재(2012년) Oracle 및 Teradata [14]구현에서[13] 사용할 수 있습니다.

Teradata 구현에서는 데이터베이스 뷰의 정의와 유사한 구문을 사용하여 하나 이상의 테이블에서 지정된 열, 열의 집계 함수 또는 날짜 열의 구성요소를 지정합니다. 단일 조인 인덱스에서 최대 64개의 열/열 식을 지정할 수 있습니다.선택적으로 복합 데이터의 기본 키를 정의하는 열을 지정할 수도 있습니다. 병렬 하드웨어에서는 열 값을 사용하여 인덱스의 내용을 여러 디스크로 분할합니다.원본 테이블이 사용자에 의해 대화식으로 업데이트되면 조인 인덱스의 내용이 자동으로 업데이트됩니다.WHERE 절이 조인 인덱스에 정의된 것과 동일한 부분 집합(이른바 "커버링 쿼리")인 열 또는 열 식의 조합을 지정하는 쿼리는 쿼리 실행 중에 원래 테이블 및 해당 인덱스가 아닌 조인 인덱스를 참조합니다.

Oracle 구현에서는 비트맵 인덱스를 사용하도록 제한됩니다.비트맵 조인 인덱스는 낮은 카디널리티 열(Oracle 설명서에 따르면 300 미만의 개별 값을 포함하는 열)에 사용됩니다. 여러 관련 테이블의 낮은 카디널리티 열을 결합합니다.Oracle이 사용하는 예는 공급업체마다 다른 부품을 제공하는 인벤토리 시스템의 예입니다.스키마에는 두 개의 "마스터 테이블", 부품 및 공급업체 및 "상세 테이블"인 인벤토리의 세 가지 연결된 테이블이 있습니다.마지막 표는 공급업체와 부품을 연결하는 다대다 표로, 가장 많은 행이 포함되어 있습니다.모든 부품에는 부품 유형이 있으며 모든 공급업체는 미국에 기반을 두고 있으며 상태 열이 있습니다.미국에는 60개 이하의 주(州)+지역과 300개 이하의 부품 유형이 있습니다.비트맵 조인 인덱스는 위의 세 테이블에 있는 표준 3 테이블 조인 및 인덱스에 대한 Part_Type 및 Supplier_State 열을 지정하여 정의합니다.그러나 Part_Type 열과 Supplier_State 열은 각각 공급업체에서 "빌린" 열이지만 인벤토리 테이블에 정의되어 있습니다.

Teradata의 경우, Oracle 비트맵 조인 인덱스는 쿼리의 WHERE 이 조인 인덱스에 포함된 열로 제한된 열을 지정하는 경우에만 쿼리에 응답하는 데 사용됩니다.

스트레이트 조인

일부 데이터베이스 시스템에서는 사용자가 특정 순서로 조인 테이블을 강제로 읽을 수 있습니다.이것은 조인 옵티마이저가 비효율적인 순서로 테이블을 읽도록 선택한 경우에 사용됩니다.를 들어 MySQL에서 명령어는STRAIGHT_JOIN[15]쿼리에 나열된 순서대로 테이블을 읽습니다.

「 」를 참조해 주세요.

레퍼런스

인용문

  1. ^ SQL 크로스 조인
  2. ^ Greg Robidoux, "퍼포먼스를 위한 WHERE 조항에서 SQL Server 기능 회피", MSSQL 힌트, 2007년 5월 3일
  3. ^ Patrick Wolf, "Inside Oracle APEX "SQL 스테이트먼트에서 PL/SQL 함수 사용 시 주의", 2006년 11월 30일
  4. ^ 그레고리 A.Larsen, "T-SQL Best Practices - Don't Use Scal Value Functions in Column List or WHERE Clauses", 2009년 10월 29일
  5. ^ USING 키워드를 사용한 조인의 단순화
  6. ^ 유니코드에서는 보타이 기호는 ((U+22C8)입니다.
  7. ^ Tom에게 "Oracle의 ANSI Join 지원"을 요청합니다.Back to Basics : 내부 참여© Eddie Awad 블로그 2010-11-19 at the Wayback Machine (웨이백 머신에서 아카이브 완료)
  8. ^ Silberschatz, Abraham; Korth, Hank; Sudarshan, S. (2002). "Section 4.10.2: Join Types and Conditions". Database System Concepts (4th ed.). p. 166. ISBN 0072283637.
  9. ^ Oracle 좌측 외부 결합
  10. ^ Shah 2005, 페이지 165
  11. ^ Pratt 2005에서 개작, 페이지 115-6
  12. ^ Yu & Meng 1998, 213페이지
  13. ^ Oracle 비트맵 가입 인덱스.URL : http://www.dba-oracle.com/art_builder_bitmap_join_idx.htm
  14. ^ Teradata Join Indexs(테라데이터 결합 인덱스).: CS1 maint: 제목으로 아카이브된 복사(링크"Archived copy". Archived from the original on 2012-12-16. Retrieved 2012-06-14.{{cite web}})
  15. ^ "13.2.9.2 JOIN Syntax". MySQL 5.7 Reference Manual. Oracle Corporation. Retrieved 2015-12-03.

원천

외부 링크