SQL에서의 크로스 조인 vs 이너 조인
CROSS JOIN
★★★★★★★★★★★★★★★★★」INNER JOIN
크로스 조인:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies
내부 결합:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status]
FROM
Customers
INNER JOIN
Movies ON Customers.CustomerID = Movies.CustomerID
어떤 것이 더 좋으며 왜 어느 것을 사용해야 합니까?
다음은 크로스 조인 및 내부 조인의 가장 좋은 예입니다.
다음 표를 고려하십시오.
§:Teacher
x------------------------x
| TchrId | TeacherName |
x----------|-------------x
| T1 | Mary |
| T2 | Jim |
x------------------------x
§:Student
x--------------------------------------x
| StudId | TchrId | StudentName |
x----------|-------------|-------------x
| S1 | T1 | Vineeth |
| S2 | T1 | Unni |
x--------------------------------------x
1. 이너 조인
내부 결합은 두 테이블을 모두 만족시키는 행을 선택합니다.
우리는 학급 선생님들과 그에 상응하는 학생들을 찾아야 한다고 생각해 보세요.상태에서는 '적용하다'를 해야 합니다.JOIN
★★★★★★★★★★★★★★★★★」INNER JOIN
will은
쿼리
SELECT T.TchrId,T.TeacherName,S.StudentName
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId
결과
x--------------------------------------x
| TchrId | TeacherName | StudentName |
x----------|-------------|-------------x
| T1 | Mary | Vineeth |
| T1 | Mary | Unni |
x--------------------------------------x
2. 크로스 조인
에서는 첫 과 두 ie로 됩니다.
을 모두 해 보세요. 는 반 선생님에 상관없이 선생님들과 학생들을 모두 찾아야 .CROSS JOIN
.
쿼리
SELECT T.TchrId,T.TeacherName,S.StudentName
FROM #Teacher T
CROSS JOIN #Student S
결과
x--------------------------------------x
| TchrId | TeacherName | StudentName |
x----------|-------------|-------------x
| T2 | Jim | Vineeth |
| T2 | Jim | Unni |
| T1 | Mary | Vineeth |
| T1 | Mary | Unni |
x--------------------------------------x
크로스 조인에서는 행이 조합되지 않습니다.각 테이블에 100개의 행이 1:1로 일치하는 경우 10,000개의 결과를 얻을 수 있습니다.Innerjoin은 같은 상황에서 100개의 행만 반환합니다.
다음 2개의 예에서는 동일한 결과가 반환됩니다.
크로스 조인
select * from table1 cross join table2 where table1.id = table2.fk_id
이너 조인트
select * from table1 join table2 on table1.id = table2.fk_id
마지막 방법 사용
크로스 조인 = (내부) 조인 = 쉼표("")
TL;DR SQL CROSS JOIN, (내부) JOIN 및 쉼표("")의 유일한 차이점은 (내부) JOIN이 ON인 반면 (내부) JOIN과 쉼표는 ON이 아니라는 것입니다.
중간 제품 사용
세 가지 모두 각 테이블에서 가능한 모든 행 조합의 중간 개념 SQL 스타일의 관계형 "Cartesian" 제품(일명 크로스 조인)을 생성합니다.행 수를 줄이는 것은 ON 및/또는 WHERE입니다.SQL 바이올린
SQL Standard에서는 <comma> via product (7.5 1.b.ii), <cross join> cross join via <comma> (7.7 1.a) 및 <comma> + WHERE (7.7 1.b)를 통한 (INNER) JOIN ON <검색 조건>을 정의하고 있습니다.
Wikipedia의 표현은 다음과 같습니다.
결과는 곱 조인후B의 ) 할 수 .[...] 조인 결과는 테이블 내의 모든 레코드의 데카르트 곱(또는 크로스 조인)을 먼저 취한 후(테이블 A의 모든 레코드와 테이블 B의 모든 레코드를 결합) 조인 술어를 충족하는 모든 레코드를 반환한 결과로 정의할 수 있습니다.
"암시적 결합 표기법"은 SELECT 문의 FROM 절에 쉼표를 사용하여 결합하기 위한 테이블을 단순히 나열합니다.따라서 교차 결합을 지정합니다.
일부 SQL에서는 크로스 조인을 위해 ON 없이 비표준(INNER) JOIN을 사용할 수 있습니다.
Re OUTER JOIN 내 답변을 참조하십시오. "Inner JOIN"과 "Outer JOIN"의 차이점은 무엇입니까?
OUTER JOIN을 참조하고 ON vs WHERE를 사용하면 LEFT JOIN(OUTER JOIN)과 INTER JOIN의 내 답변 조건을 볼 수 있습니다.
테이블 간에 열을 비교하는 이유는 무엇입니까?
중복된 행이 없는 경우:
모든 테이블에는 특정 빈칸 채우기(fill-in-the-blanks) 스테이트먼트템플릿에서 True 스테이트먼트를 작성하는 행이 저장됩니다.(특정(특징) 술어로부터 진정한 명제를 만들어 냅니다.)
기본 테이블에는 일부 DBA 지정 스테이트먼트템플릿에서 true 스테이트먼트를 작성하는 행이 저장됩니다.
/* rows where customer C.CustomerID has age C.Age and ... */ FROM Customers C
Join의 중간곱에는 오퍼랜드 템플릿의 AND에서 true 문을 만드는 행이 포함됩니다.
/* rows where customer C.CustomerID has age C.Age and ... AND movie M.Movie is rented by customer M.CustomerID and ... */ FROM Customers C CROSS JOIN Movies M
ON & WHERE 조건이 추가 템플릿으로 지정됩니다.값은 다시 해당 템플릿을 충족하는 행입니다.
/* rows where customer C.CustomerID has age C.Age and ... AND movie M.Movie is rented by customer M.CustomerID and ... AND C.CustomerID = M.CustomerID AND C.Age >= M.[Minimum Age] AND C.Age = 18 */ FROM Customers C INNER JOIN Movies M ON C.CustomerID = M.CustomerID AND C.Age >= M.[Minimum Age] WHERE C.Age = 18
특히 테이블 간의 (SQL) 동일성에 대한 열을 비교하는 것은 템플릿의 결합된 테이블의 부분으로부터 제품으로부터 유지되는 행이 이러한 열에 대해 동일한(NULL이 아닌) 값을 갖는다는 것을 의미합니다.많은 행이 테이블 간의 동등성 비교에 의해 일반적으로 제거되는 것은 우연의 일치입니다.필요하고 충분한 것은 원하는 행을 특성화하는 것입니다.
원하는 행의 템플릿에 SQL을 작성하기만 하면 됩니다.
의 의미는 다음을 참조하십시오
: 내부 유니언?부또또 또또 / 는?????
사람이 읽을 수 있는 설명에서 SQL 쿼리를 구성하는 경험칙이 있습니까?
"크로스 조인" 과부하
아쉽게도 "크로스 조인"이라는 용어는 다음과 같은 경우에 사용됩니다.
- 중간 제품.
- 크로스 조인
- (INNER) ON 또는 WHERE를 사용하여 한 테이블의 열을 다른 테이블의 열과 비교하지 않습니다. (이 경우 중간 제품 행이 많이 반환되는 경향이 있습니다.)
CROSS JOIN vs (내부) JOIN vs 콤마 사용
일반적인 표기법은 다음과 같습니다.
- 테이블 간에 열을 비교하지 않는 경우에만 크로스 조인(CROSS JOIN)을 사용하십시오.그것은 비교의 부족이 의도적이었다는 것을 보여주기 위함이다.
- 테이블 간의 열을 비교할 때 및 비교할 때만 (INNER) JOIN을 ON과 함께 사용하십시오. (다른 조건도 있을 수 있습니다.)
- 쉼표 쓰지 마세요.
일반적으로 WHERE의 경우 테이블 쌍에 포함되지 않은 조건도 유지됩니다.단, RIGHT, LEFT 또는 FULL(외부) JOIN에 인수에 적합한 행을 가져오려면 (n INSER) JOIN ON으로 해야 합니다.
"쉼표를 사용하지 않음" 참조: 쉼표의 우선순위가 낮기 때문에 쉼표를 명시적 JOIN과 함께 사용하면 오인될 수 있습니다.그러나 CROSS JOIN, (INNER) JOIN, 콤마의 의미에서의 중간제품의 역할을 감안할 때 이를 전혀 사용하지 않는 위의 규약에 대한 주장은 흔들리고 있다.CROSS JOIN 또는 쉼표는 TRUE 상태의 (내부) JOIN과 같습니다.중간 제품 ON 및 WHERE는 모두 대응하는 술어에 AND를 도입합니다.그러나 그 이외의 경우는, ON 조건을 만족시키는 입력 행의 페어를 검출했을 때만 출력 행을 생성하는 것으로 생각할 수 있습니다.그 경우에도 조건을 만족시키는 크로스 조인 행을 반환합니다.ON이 SQL에서 콤마를 보완해야 하는 유일한 이유는 OUTER JOINs를 쓰기 위해서입니다.물론 표현은 그 의미를 명확히 해야 합니다만, 무엇이 명확한지는 무엇을 의미하는지에 따라 다릅니다.
Re Venn diagram(벤 다이어그램 참조) 두 개의 교차하는 원이 있는 벤 다이어그램은 동일한 입력에 대한 INSER, LEFT, RIGHT 및 FULL JOIN의 출력 행 간의 차이를 나타낼 수 있습니다.ON이 무조건 TRUE일 경우 INSER JOIN 결과는 CROSS JOIN과 동일합니다.또한 CRESS, UNION 및 EXCEPT의 입력 및 출력 행을 나타낼 수 있습니다.양쪽 입력에 같은 컬럼이 있는 경우 표준 SQL NATURAL JOIN과 같은 결과이며 EXCEPTRESS 결과는 LEFT 및 RIGHT JOIN과 관련된 특정 관용어와 동일합니다.단, (INNER) JOIN이 일반적으로 어떻게 기능하는지는 설명하지 않습니다.그것은 언뜻 보기에 그럴듯해 보인다.ON, PK(기본 키), FK(외부 키) 및/또는 SELECT의 특수한 경우에 대한 입력 및/또는 출력 부분을 식별할 수 있습니다.이를 확인하려면 원으로 표시된 세트의 요소가 정확히 무엇인지 식별하기만 하면 됩니다.(이러한 프레젠테이션은 명확하지 않습니다.)일반적으로 join의 경우 출력 행의 머리글은 입력 행과 다릅니다.SQL 테이블은 NULL 행 세트가 아닌 백입니다.자연 결합에 대한 내 답변 Venn 다이어그램을 참조하십시오.
내부 결합
조인된 두 테이블에서 일치하는 행만 표시하는 조인(join)을 내부 조인(inner join(내부 조인)이라고 합니다.이것은 쿼리 및 뷰 디자이너에 대한 기본 가입입니다.
내부 결합 구문
SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name
크로스 조인
결합에 관여한 테이블의 데카르트 곱을 생성하는 교차 결합입니다.데카르트 곱의 크기는 첫 번째 표의 행 수에 두 번째 표의 행 수를 곱한 것입니다.
크로스 조인 구문
SELECT * FROM table_name1
CROSS JOIN table_name2
아니면 다른 방법으로 쓸 수도 있습니다.
SELECT * FROM table_name1,table_name2
이제 교차 결합에 대한 아래 쿼리를 확인하십시오.
예
SELECT * FROM UserDetails
CROSS JOIN OrderDetails
또는
SELECT * FROM UserDetails, OrderDetails
크로스 조인트
ATHE CROSS JOIN은 데카르트 곱을 생성하기 위한 것입니다.
데카르트 곱은 두 집합 A와 B를 취하여 주어진 두 데이터 집합에서 가능한 모든 쌍 레코드 순열을 생성합니다.
들어 과 같은 요.ranks
★★★★★★★★★★★★★★★★★」suits
다음 중 하나:
★★★★★★★★★★★★★★★★.ranks
는음음하다
| name | symbol | rank_value |
|-------|--------|------------|
| Ace | A | 14 |
| King | K | 13 |
| Queen | Q | 12 |
| Jack | J | 11 |
| Ten | 10 | 10 |
| Nine | 9 | 9 |
★★★★★suits
테이블에는 다음 레코드가 포함되어 있습니다.
| name | symbol |
|---------|--------|
| Club | ♣ |
| Diamond | ♦ |
| Heart | ♥ |
| Spade | ♠ |
다음과 같은 CROSS JOIN 쿼리로서:
SELECT
r.symbol AS card_rank,
s.symbol AS card_suit
FROM
ranks r
CROSS JOIN
suits s
는 합니다.ranks
★★★★★★★★★★★★★★★★★」suites
삭제:
| card_rank | card_suit |
|-----------|-----------|
| A | ♣ |
| A | ♦ |
| A | ♥ |
| A | ♠ |
| K | ♣ |
| K | ♦ |
| K | ♥ |
| K | ♠ |
| Q | ♣ |
| Q | ♦ |
| Q | ♥ |
| Q | ♠ |
| J | ♣ |
| J | ♦ |
| J | ♥ |
| J | ♠ |
| 10 | ♣ |
| 10 | ♦ |
| 10 | ♥ |
| 10 | ♠ |
| 9 | ♣ |
| 9 | ♦ |
| 9 | ♥ |
| 9 | ♠ |
이너 조인트
한편, INSER JOIN은 2개의 결합 데이터 세트의 데카르트 곱을 반환하지 않습니다.
대신 INSER JOIN은 왼쪽 테이블의 모든 요소를 가져와 오른쪽 테이블의 레코드와 대조하여 다음과 같이 합니다.
- 오른쪽 테이블에서 레코드가 일치하지 않으면 왼쪽 행이 결과 세트에서 필터링됩니다.
- 오른쪽 테이블의 일치하는 레코드에 대해 왼쪽 행은 해당 레코드와 오른쪽 테이블의 모든 관련 하위 레코드 사이에 데카르트 제품이 있는 것처럼 반복됩니다.
들어 부모 의 테이블 요.post
도 있다post_comment
츠키다
만약, 「」, 「」, 「」의 입니다.post
테이블에는 다음 레코드가 있습니다.
| id | title |
|----|-----------|
| 1 | Java |
| 2 | Hibernate |
| 3 | JPA |
및post_comments
테이블에는 다음 행이 있습니다.
| id | review | post_id |
|----|-----------|---------|
| 1 | Good | 1 |
| 2 | Excellent | 1 |
| 3 | Awesome | 2 |
다음과 같은 INSER JOIN 쿼리.
SELECT
p.id AS post_id,
p.title AS post_title,
pc.review AS review
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id
것을 입니다.post
및 관련된 모든 post_comments
:
| post_id | post_title | review |
|---------|------------|-----------|
| 1 | Java | Good |
| 1 | Java | Excellent |
| 2 | Hibernate | Awesome |
기본적으로는 를 필터 처리된 CROSS JOIN으로 생각할 수 있습니다.여기에는 일치하는 레코드만 최종 결과 세트에 저장됩니다.
WHERE 절이 추가되면 크로스 조인(cross join)은 내부 조인(inner join)으로 동작합니다.예를 들어 다음 Transact-SQL 쿼리는 동일한 결과 세트를 생성합니다.http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx 를 참조해 주세요.
SQL Server에서는 다음 간단한 표기법도 사용할 수 있습니다.
SELECT A.F,
B.G,
C.H
FROM TABLE_A A,
TABLE_B B,
TABLE_C C
WHERE A.X = B.X
AND B.Y = C.Y
이 간단한 표기법을 사용하면 내부 결합과 교차 결합의 차이를 걱정할 필요가 없습니다.두 개의 "ON" 절 대신, 작업을 수행하는 단일 "WHERE" 절이 있습니다.어떤 "JOIN" "ON" 절이 어디로 가는지 파악하는 데 어려움이 있는 경우 "JOIN" 표기법을 버리고 위의 간단한 표기법을 사용하십시오.
그것은 부정행위가 아니다.
내부 조인(inner join)을 사용하여 쿼리를 작성하는 동안 두 테이블 모두에서 조건이 충족되면, 즉 두 테이블의 공통 컬럼이 정확히 일치하면 레코드는 두 테이블 모두에서 가져옵니다.
크로스 조인(cross join)을 사용하여 쿼리를 작성할 때 결과는 두 테이블의 레코드 수의 데카르트 곱과 같습니다.예: table1에 2개의 레코드가 포함되어 있고 table2에 3개의 레코드가 포함되어 있는 경우 쿼리 결과는 2*3 = 6개 레코드입니다.
그러니까 그게 필요할 때까지 크로스 조인을 하지 마세요.
내부 조인은 두 테이블 간의 일치된 레코드 결과를 제공합니다. 교차 조인은 두 테이블 간의 가능한 조합을 제공합니다.
교차 결합과 내부 결합은 내부 결합에서 데카르트 제품의 결과 중 일부를 부울 방식으로 필터링한다는 유일한 차이와 동일합니다.
table1
x--------------------------------------x
| fieldA | fieldB | fieldC |
x----------|-------------|-------------x
| A | B | option1 |
| A | B1 | option2 |
x--------------------------------------x
table2
x--------------------------------------x
| fieldA | fieldB | fieldC |
x----------|-------------|-------------x
| A | B | optionB1 |
| A1 | B1 | optionB2 |
x--------------------------------------x
cross join
A,B,option1,A,B,optionB1
A,B,option1,A1,B1,optionB2
A,B1,option2,A,B,optionB1
A,B1,option2,A1,B1,optionB2
inner join on field1 (only with the value is the same in both tables)
A,B,option1,A,B,optionB1
A,B1,option2,A,B,optionB1
inner join on field1
A,B,option1,A,B,optionB1
데이터 설계에 따라 참여에 사용하는 필드의 케이스가 1개뿐이라고 판단합니다.조인만 두 테이블을 교차 조인하고 특별한 부울식을 수행하는 라인만 가져옵니다.
참가하고 있는 필드가 양쪽 테이블에서 늘이면 필터가 통과됩니다.null을 방지하거나 허용하기 위한 추가 규칙을 추가하는 것은 당사 또는 데이터베이스 제조업체에 달려 있습니다.기본을 지키려면 교차 결합에 이어 필터가 필요합니다.
기대하는 출력에 따라 다릅니다.
교차 결합은 한 테이블의 모든 행을 다른 테이블의 모든 행과 일치시킵니다.내부 조인(inner join)은 하나 이상의 필드에서 일치합니다.10개의 행이 있는 테이블과 10개의 행이 있는 테이블이 있는 경우 두 조인 동작은 달라집니다.
크로스 조인에는 100개의 행이 반환되며 이 행들은 관련되지 않습니다. 단지 데카르트 곱이라고 불리는 것입니다.내부 결합은 서로 레코드를 일치시킵니다.한쪽이 프라이머리 키를 가지고 있고 다른 한쪽이 외부 키를 가지고 있다고 가정하면 10개의 행이 반환됩니다.
크로스 조인에는 제한된 일반 유틸리티가 있지만 완전성을 위해 존재하며 쿼리에 관계를 추가하지 않고 테이블을 조인한 결과를 나타냅니다.크로스 조인(cross join)을 사용하여 단어 조합 등의 목록을 작성할 수 있습니다.한편, 이너 조인트가 가장 일반적인 조인입니다.
언급URL : https://stackoverflow.com/questions/17759687/cross-join-vs-inner-join-in-sql
'programing' 카테고리의 다른 글
키 목록을 통해 중첩된 사전 항목에 액세스하시겠습니까? (0) | 2023.04.13 |
---|---|
윈도우즈 PowerShell 환경 변수 설정 (0) | 2023.04.08 |
Scope_Identity(), Identity(), @@Identity 및 Ident_Current()의 차이점은 무엇입니까? (0) | 2023.04.08 |
SQL Server에 데이터베이스가 있는지 확인하는 방법 (0) | 2023.04.08 |
PowerShell은 상수를 지원합니까? (0) | 2023.04.08 |