[SQL] INNER은 SQL에 가입 대 CROSS는 가입
SQLINNER은 SQL에 가입 대 CROSS는 가입
CROSS이 가입하고 내부 조인의 차이점은 무엇입니까?
CROSS JOIN은 :
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies
INNER JOIN은 :
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
어느 쪽이 더 낫다 왜 나는 둘 중 하나를 사용해야합니까?
해결법
-
==============================
1.크로스 당신이 1 경기 1에 각 테이블에 100 개의 행이있는 경우, 행을 결합하지 않습니다에 가입, 당신은 Innerjoin는 같은 상황에서 100 개의 행을 반환합니다, 10.000 결과를 얻을 수 있습니다.
크로스 당신이 1 경기 1에 각 테이블에 100 개의 행이있는 경우, 행을 결합하지 않습니다에 가입, 당신은 Innerjoin는 같은 상황에서 100 개의 행을 반환합니다, 10.000 결과를 얻을 수 있습니다.
이 둘은 동일한 결과를 반환합니다 :
크로스 가입
select * from table1 cross join table2 where table1.id = table2.fk_id
내부 조인
select * from table1 join table2 on table1.id = table2.fk_id
마지막 방법을 사용
-
==============================
2.여기에 십자가의 좋은 예는 가입하고 내부 조인입니다.
여기에 십자가의 좋은 예는 가입하고 내부 조인입니다.
다음 표를 고려
표 : 교사
x------------------------x | TchrId | TeacherName | x----------|-------------x | T1 | Mary | | T2 | Jim | x------------------------x
표 : 학생
x--------------------------------------x | StudId | TchrId | StudentName | x----------|-------------|-------------x | S1 | T1 | Vineeth | | S2 | T1 | Unni | x--------------------------------------x
내부는 만족 테이블 둘 것을 선택에게 행을 조인합니다. 우리가 수업 교사와 해당 학생 수있는 교사를 찾을 필요가 고려하십시오. 그 상태에서, 우리는 JOIN 또는 INNER JOIN를 적용 할 필요 것이다
질문
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
크로스 모든 가능성을 선택한다에게 즉 직교 제품으로서 제 1 테이블의 모든 행과 번째 테이블의 모든 행과 프로그램에 참여 우리는 관계없이 수업 교사의 모든 학교에서 교사와 학생을 찾아야 고려, 우리는 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
-
==============================
3.CROSS는 가입 = (INNER) 가입 = 쉼표 ( ",")
CROSS는 가입 = (INNER) 가입 = 쉼표 ( ",")
TL; DR는 SQL CROSS 사이의 유일한 차이는 CROSS가 가입하지 콤마 동안 ON이있다 조인 (INNER)이다 (쉼표 평가 순서 낮은 우선 순위를 갖는 외) ( ",")에 가입 콤마 (INNER)에 가입.
중간 제품을 다시
세 일명 크로스 각 테이블 행의 가능한 모든 조합의 가입, 중간 개념 SQL 스타일의 관계형 "데카르트"제품을 생산하고 있습니다. 이 행의 수를 줄일 ON 및 / 또는 WHERE이다. SQL 바이올린
는 SQL 표준을 정의 <쉼표> 제품 (7.5 1.b.ii), <쉼표> (7.7 1.A)를 통해 <크로스 가입>와 <검색 조건> ON 가입을 통해 <쉼표> 플러스 WHERE (7.7 1.B를 통해 ).
위키 백과가 말하듯 :
다시 OUTER 조인 및 내부 조인 대 (외부 조인) 왼쪽에서 약관을 참조 WHERE 그들에 대 JOIN ON 사용.
왜 테이블 사이의 열을 비교?
중복 행이없는 경우 :
모든 테이블은 특정하여 강제의 도가니 named-] 공백 문 템플릿에서 진정한 성명을 발표 행을 보유하고 있습니다. (- 만족 - 그것은에서 진정한 제안을하게 특정 (특성) 술어를.)
특히, 템플릿의 결합 된 테이블 '부분에서 생성물로부터 유지 행 그 열의 동일한 (비 NULL) 값을 가지고 테이블 수단 사이 (SQL) 열 어떤지를 비교. 필요 충분 당신이 원하는 행의 특성을 무엇 -이 행의 많은 일반적으로 테이블 간의 동등 비교에 의해 제거되는 것을 단지 우연의 일치입니다.
그냥 당신이 원하는 행에 대한 템플릿 SQL 쓰기!
(조건 대 및 테이블) 쿼리의 의미를 다시 참조 : 어떻게 두 개의 서로 다른 열에 대한 또 다른 SQL 테이블에서 데이터를 일치 얻을 : 내부 가입 및 / 또는 조합? 사람이 읽을 수있는 설명에서 SQL 쿼리를 구성하는 엄지 손가락의 규칙이 있나요?
오버로드 "크로스 가입"
불행하게도이 용어는 사용됩니다 "크로스 가입"
이러한 다양한 의미를 혼동 얻을. (예 : 여기에 다른 답변과 의견에있다.)
CROSS이 (INNER) 대 가입 사용하여 쉼표 대 가입
일반적인 규칙은 다음과 같습니다
하지 테이블의 쌍에 일반적으로 또한 조건은 WHERE에 대한 유지됩니다. 그러나이 오른쪽으로 인수에 대해 적절한 행을 얻을 ON 조인 (N INNER)에 넣어해야 할 수 있습니다, 왼쪽 또는 FULL (OUTER)가 가입.
다시 명시 적 쉼표가 낮은 우선 순위를 가지고 있기 때문에 오해 할 수 있습니다 가입과 혼합 쉼표 "쉼표를 사용하지 마십시오." 그러나 전혀 사용하지 않을의 위의 대회 십자가의 의미에서 중간 생성물의 역할 가입 (INNER) 가입 및 쉼표, 인자가 흔들리는이다. 크로스 가입 또는 쉼표 단지 (INNER)와 같은 인 TRUE ON 상태가의 가입하세요. 중간 제품은 ON과 WHERE 모두는 AND 해당 술어를 소개합니다. 그러나 다른 INNER가 ON 가입 생각할 수있다 -이 역시 크로스 반환 조건을 만족 행 가입 - 만족 ON 상태가 입력 행의 쌍을 찾는 경우에만 출력 행을 생성 말한다. ON은 SQL에서 보충 쉼표로했다 유일한 이유는 외부 조인 작성했다. 물론, 표현은 분명 의미해야한다; 하지만 분명한 것은 일이 의미하는 촬영에 따라 달라집니다.
INNER, LEFT, RIGHT 및 FULL 대한 출력 행의 차이를 설명 할 수있는 두 교차 원 재 벤 다이어그램 벤 다이어그램 동일한 입력에 결합한다. 를 ON 무조건 TRUE 일 때, 내부는 결과가 CROSS은 가입과 동일 가입하세요. 또한 그것은 교차 UNION 및 EXCEPT에 대한 입력 및 출력 행을 예시 할 수있다. 두 입력이 같은 열이있을 때 그리고, INTERSECT 결과는 JOIN 표준 SQL 자연과 동일하고, 그 결과를 제외하고는 LEFT & RIGHT 가입과 관련된 특정 숙어와 동일합니다. 그러나 (INNER)는 일반적으로 작품을 가입하는 방법을 설명하지 않습니다. 그건 그냥 언뜻 그럴듯하게 보인다. 그것은 특별한 ON의 경우, PK와 (기본 키), FKS (외래 키) 및 / 또는 SELECT에 대한 입력 및 / 또는 출력의 일부를 확인할 수 있습니다. 당신이보고해야 할 일은 정확히 원으로 표현 된 세트의 요소가 무엇인지 파악하는 것입니다. (어떤 프리젠 테이션을 명확하게하지 뒤죽박죽.) (출력 행이 입력 행에서 다른 제목을 조인 일반적으로 그 기억. 그리고 SQL 테이블이 아닌 세트 null로 행의 가방입니다.)
-
==============================
4.는 해당 표시 내부 조인으로 모두 조인 된 테이블에 일치하는 항목이 알려져있는 행을 조인합니다. 이 기본값은 쿼리 및 뷰 디자이너에 참여한다.
는 해당 표시 내부 조인으로 모두 조인 된 테이블에 일치하는 항목이 알려져있는 행을 조인합니다. 이 기본값은 쿼리 및 뷰 디자이너에 참여한다.
내부 구문 가입
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
-
==============================
5.가입 조항이 추가되는 경우 A는, 십자가가 내부로 동작 가입하면, 기억하십시오. 예를 들어, 다음 Transact-SQL 쿼리는 동일한 결과 집합을 생산하고 있습니다. http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx를 참조하십시오
가입 조항이 추가되는 경우 A는, 십자가가 내부로 동작 가입하면, 기억하십시오. 예를 들어, 다음 Transact-SQL 쿼리는 동일한 결과 집합을 생산하고 있습니다. http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx를 참조하십시오
-
==============================
6.또한 SQL Server의 간단한 표기법을 허용합니다
또한 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"절 하나가있다. 당신이 ""가입 "어떤 파악에 어려움이있는 경우 가입"표기하고 위 한 간단한 사용 "조항은 포기 어디로 가야".
그것은 부정하지 않습니다.
-
==============================
7.이 글에서 설명하고있는 바와 같이, 십자가는 데카르트 제품을 생성하기위한 것입니다 JOIN.
이 글에서 설명하고있는 바와 같이, 십자가는 데카르트 제품을 생성하기위한 것입니다 JOIN.
카티 제품은 두 집합 A와 B를 받아 두 데이터 세트에서 주어진 쌍 레코드의 모든 가능한 순열을 생성한다.
예를 들어, 다음과 같은 순위와 정장 데이터베이스 테이블을 가지고 가정 :
그리고 순위는 다음과 같은 행이 있습니다 :
| name | symbol | rank_value | |-------|--------|------------| | Ace | A | 14 | | King | K | 13 | | Queen | Q | 12 | | Jack | J | 11 | | Ten | 10 | 10 | | Nine | 9 | 9 |
정장 동안 테이블에는 다음과 같은 기록을 포함 :
| name | symbol | |---------|--------| | Club | ♣ | | Diamond | ♦ | | Heart | ♥ | | Spade | ♠ |
CROSS으로 다음과 같은 쿼리를 가입 :
SELECT r.symbol AS card_rank, s.symbol AS card_suit FROM ranks r CROSS JOIN suits s
계급과 스위트 룸 쌍의 모든 가능한 순열을 생성합니다 :
| 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 | ♠ |
반면에, INNER 두 합류 데이터 세트의 직교 제품을 반환하지 않습니다 가입하세요.
대신, 내부 조인 왼쪽 테이블의 모든 요소를 소요하고 그래서 오른쪽 테이블에 기록에 대해 그들과 일치 :
예를 들어, 우리는 부모 후 다음과 같이 보이는 것을 자식 post_comment 테이블 간의 일대 테이블 관계를 가지고 가정 :
이제, 포스트 테이블은 다음과 같은 기록이있는 경우 :
| id | title | |----|-----------| | 1 | Java | | 2 | Hibernate | | 3 | JPA |
그리고 post_comments 테이블이 행이 있습니다 :
| id | review | post_id | |----|-----------|---------| | 1 | Good | 1 | | 2 | Excellent | 1 | | 3 | Awesome | 2 |
내부는 다음과 같은 쿼리를 가입 :
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_comments과 함께 모든 포스트 기록을 포함하는 것입니다 :
| post_id | post_title | review | |---------|------------|-----------| | 1 | Java | Good | | 1 | Java | Excellent | | 2 | Hibernate | Awesome |
-
==============================
8.레코드가 두 테이블에서 내부 사용 페치를 쿼리합니다 조인 쓰는 동안 경우 두 테이블에 만족 상태, 두 테이블의 공통 열 즉 정확히 일치합니다.
레코드가 두 테이블에서 내부 사용 페치를 쿼리합니다 조인 쓰는 동안 경우 두 테이블에 만족 상태, 두 테이블의 공통 열 즉 정확히 일치합니다.
사용하여 쿼리를 작성하는 동안 십자가는 결과가 두 테이블의 레코드 없음의 직교 제품과 같은 조인. 예는 표 2 개 레코드를 포함하는 경우 및 표 2는 (3 개) 기록 후, 조회 결과가 포함되어 2 * 3 = 6 개 레코드이다.
당신이 필요 때까지 그래서 십자가에 대한 해달라고 이동 가입.
-
==============================
9.십자가에 가입하고 내부는 내부 조인에서 우리가 booleanly 직교 제품의 결과의 일부를 필터링하는 유일한 차이 동일 가입
십자가에 가입하고 내부는 내부 조인에서 우리가 booleanly 직교 제품의 결과의 일부를 필터링하는 유일한 차이 동일 가입
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
우리는 우리가 조인에 사용하는 필드의 한 경우가 결정할 곳은 우리의 데이터의 디자인에 있습니다. 크로스 두 테이블을 조인 만 가입 특별한 부울 표현식을 달성에만 라인을 얻을.
참고 필드 경우 우리가하고있는 것을 우리는 우리가 필터를 통과 할 두 테이블에 널 (null)이 될 것입니다에 결합합니다. 그것은 피하거나 허가 널 (null)에 추가 규칙을 추가하기 위해 우리 또는 데이터베이스 업체까지입니다. 기본 사항을 준수 그냥 필터 다음에 조인 십자가이다.
-
==============================
10.내부는 십자가 가입으로 두 테이블 사이에 당신에게 가능한 조합을 제공합니다 어디에 두 테이블 사이에 일치하는 기록의 결과를 줄 것이다 가입 할 수 있습니다.
내부는 십자가 가입으로 두 테이블 사이에 당신에게 가능한 조합을 제공합니다 어디에 두 테이블 사이에 일치하는 기록의 결과를 줄 것이다 가입 할 수 있습니다.
-
==============================
11.그것은 당신이 기대하는 출력에 따라 달라집니다.
그것은 당신이 기대하는 출력에 따라 달라집니다.
크로스는 다른 테이블의 모든 행에 하나 개의 테이블에 일치하는 모든 행을 조인합니다. 내부는 필드 또는 필드에 일치 가입 할 수 있습니다. 하나 개 10 행 테이블과 10 개의 행과 다른 경우 다음이 다르게 동작합니다 합류했다.
십자가는 100 개 행이 반환 것 가입하고 그들이 관련되지 않습니다, 데카르트 제품이라고 그냥 뭐. 내부는 서로에 대한 기록과 일치합니다 가입 할 수 있습니다. 하나를 가정하면 기본 키를 가지고 있으며, 그것은 당신이 10 개 행을 반환받을 것 다른의 외래 키입니다.
크로스 일반 유틸리티를 제한하지만 완전성을 위해 존재하고 쿼리에 추가없는 관계로 테이블을 조인의 결과를 설명하고있다 조인. 당신은 십자가 단어 또는 이와 유사한 조합의 목록을 만들기 위해 가입 사용할 수 있습니다. 내부는 다른 한편으로는 가장 일반적인 조인에 가입 할 수 있습니다.
from https://stackoverflow.com/questions/17759687/cross-join-vs-inner-join-in-sql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 자동 증분 테이블 열 (0) | 2020.03.10 |
---|---|
[SQL] 오라클 SQL 피벗 쿼리 (0) | 2020.03.10 |
[SQL] "LIKE"및 SQL의 "IN"의 조합이 있습니까? (0) | 2020.03.10 |
[SQL] 내가 사용해야! = 또는 <> T-SQL에서 동일하지 하시나요? (0) | 2020.03.10 |
[SQL] 두 개의 서로 다른 곳 조항과 두 데이터 집합을 반환해야 (0) | 2020.03.10 |