[SQL] SQL / MySQL의에서 "ON"과 "WHERE"의 차이는 문을 조인 무엇입니까?
SQLSQL / MySQL의에서 "ON"과 "WHERE"의 차이는 문을 조인 무엇입니까?
다음 명령문은 (하나에 사용하고, 다른 하나는 어디에 사용) 동일한 결과를 제공합니다 :
mysql> select * from gifts INNER JOIN sentGifts ON gifts.giftID = sentGifts.giftID;
mysql> select * from gifts INNER JOIN sentGifts WHERE gifts.giftID = sentGifts.giftID;
난 단지 "타의 추종을 불허하는"경우를 찾는 왼쪽 외부 조인의 경우에서 볼 수있다 : (누군가가 보낸 적이없는 선물을 찾을 수)
mysql> select name from gifts LEFT OUTER JOIN sentgifts
ON gifts.giftID = sentgifts.giftID
WHERE sentgifts.giftID IS NULL;
이 경우에 먼저 사용하고 곳이다. 는에 먼저 일치 하는가, 그리고 어디에 "차"는 필터링합니까? 또는 어디에 대에 사용하는 일반적인 규칙이있다? 감사.
해결법
-
==============================
1.전체 SELECT 쿼리의 일부이고, ON은 각 개인이 가입의 일부입니다.
전체 SELECT 쿼리의 일부이고, ON은 각 개인이 가입의 일부입니다.
ON은 이전에 사용 된 테이블의 필드를 참조 할 수 있습니다.
왼쪽 테이블의 레코드에 대한 실제 경기가없는 경우, LEFT는 반환에게 NULLS에 설정된 모든 필드 오른쪽 테이블에서 하나 개의 레코드 가입하세요. 절은 다음과 평가 WHERE이를 필터링 할 수 있습니다.
쿼리에서 'sentgifts'에 일치하지 않고 선물 만 레코드가 반환됩니다.
여기에 예제가있다
gifts 1 Teddy bear 2 Flowers sentgifts 1 Alice 1 Bob --- SELECT * FROM gifts g LEFT JOIN sentgifts sg ON g.giftID = sg.giftID --- 1 Teddy bear 1 Alice 1 Teddy bear 1 Bob 2 Flowers NULL NULL -- no match in sentgifts --- SELECT * FROM gifts g LEFT JOIN sentgifts sg ON g.giftID = sg.giftID WHERE sg.giftID IS NULL --- 2 Flowers NULL NULL -- no match in sentgifts
당신이 볼 수 있듯이, 실제 경기는 sentgifts.id에서 지금까지 반환 된 전송되지 않은 그래서 단지 선물에 NULL을 남길 수 있습니다.
-
==============================
2.ON 절은 테이블 간의 관계를 정의합니다.
ON 절은 테이블 간의 관계를 정의합니다.
WHERE 절은 관심있는 행을 설명합니다.
당신은 여전히 그들을 교환 할 수 많은 시간 그러나이 항상 왼쪽 외부 조인을 가진 경우가 아니라, 같은 결과를 얻을.
-
==============================
3.내부 조인 사용하는 경우, ON과 WHERE이 같은 결과를해야합니다. 그래서,
내부 조인 사용하는 경우, ON과 WHERE이 같은 결과를해야합니다. 그래서,
select * from Table1 t1 inner join Table2 t2 on t1.id = t2.id where t1.Name = 'John'
동일한 출력으로이있을 것이다
select * from Table1 t1 inner join Table2 t2 on t1.id = t2.id and t1.Name = 'John'
당신이 언급 한 것처럼 외부 조인을 사용하는 경우, 이것은 사실이 아니다. 어떤 쿼리 계획이 내장됩니다 것은 그래서 혼자 기초가 보장 된 쿼리 계획을 포기하지 않을에 결정, 데이터베이스 플랫폼뿐만 아니라 쿼리 특성에 따라 달라집니다, 변경 될 수 있습니다.
엄지 손가락의 규칙으로, 당신은 WHERE 절에 필터링에 사용되는 조항과 열 ON에서 테이블을 조인 열을 사용합니다. 이것은 최선의 가독성을 제공합니다.
-
==============================
4.결과는 동일 있지만, 'ON'은 처음 가입하게 한 후 결합 된 세트의 데이터를 검색 할 수 있습니다. 검색은 빠른 부하가 적다. 그러나 사용 'WHERE'개의 결과 세트는 제 페치 될 다음 조건을 적용시킬. 그래서 당신은 선호가 뭔지 알아.
결과는 동일 있지만, 'ON'은 처음 가입하게 한 후 결합 된 세트의 데이터를 검색 할 수 있습니다. 검색은 빠른 부하가 적다. 그러나 사용 'WHERE'개의 결과 세트는 제 페치 될 다음 조건을 적용시킬. 그래서 당신은 선호가 뭔지 알아.
-
==============================
5.실제로, ON은 NULL과의 조건을 만족하지 않는 각 필드를 대체합니다. @Quassnoi으로 예를 감안할 때
실제로, ON은 NULL과의 조건을 만족하지 않는 각 필드를 대체합니다. @Quassnoi으로 예를 감안할 때
gifts 1 Teddy bear 2 Flowers sentgifts 1 Alice 1 Bob --- SELECT * FROM gifts g LEFT JOIN sentgifts sg ON g.giftID = sg.giftID ---
왼쪽은 조건에는이 있다면 순열은 다음 컬렉션에 대해 계산되어 있지 않은 것 가입 :
{ '테디 베어'{ '앨리스', '밥'}, '꽃'{ '앨리스', '밥'}}
g.giftID sg.giftID = ON 상태로,이 순열을 생성하는 데 사용되는 컬렉션이다 :
{ '테디 베어'{ '앨리스', '밥'}, '꽃': {NULL, NULL}}
이는 적용됩니다 :
{ '테디 베어'{ '앨리스', '밥'}, '꽃': {NULL}}
왼쪽에서 결과의 가입 있도록 :
Teddy bear Alice Teddy bear Bob Flowers NULL
그리고 FULL OUTER에 대해 당신이 가진 것 가입 :
{ '테디 베어'{ '앨리스', '밥'}, '꽃': {NULL}} LEFT에 대한이 가입하고 { '앨리스'{ '테디 베어', NULL}, '꽃'{ '테디 베어 'RIGHT에 대한 NULL}}이 (가) 가입 :
Teddy bear Alice Teddy bear Bob Flowers NULL
당신은 또한 ON g.giftID 같은 조건 = 1이 있다면 그것은 것
{NULL : { '앨리스', '밥'}, '꽃': {NULL}}
초래 가입 왼쪽에있는
꽃 NULL
그리고 FULL OUTER에 대한 초래 가입 {NULL : { '앨리스', '밥'}, '꽃': {NULL}} LEFT은 가입과 { '앨리스': {NULL, NULL} '꽃': {NULL, NULL}} 권리는 가입
NULL Alice NULL Bob Flowers NULL
참고 MySQL은 전체 외부 조인이없는 당신은 왼쪽에 UNION을 적용해야 가입 및 RIGHT가 가입
-
==============================
6.당신이이 가입 사용하는 경우, 당신은 당신이에 가입하는 조건을 지정해야합니다. 그 목록은 ON 절에 간다. 절 쿼리에 어디 대한 상태 데이터를 저장하는 데 사용되는.
당신이이 가입 사용하는 경우, 당신은 당신이에 가입하는 조건을 지정해야합니다. 그 목록은 ON 절에 간다. 절 쿼리에 어디 대한 상태 데이터를 저장하는 데 사용되는.
from https://stackoverflow.com/questions/2722795/in-sql-mysql-what-is-the-difference-between-on-and-where-in-a-join-statem by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] OUTFILE로 MySQL의 수출 : CSV 탈출 문자 (0) | 2020.04.18 |
---|---|
[SQL] 고유 값의 발생을 카운트 (0) | 2020.04.18 |
[SQL] PL / SQL의 기능과 절차의 차이점은 무엇입니까? (0) | 2020.04.18 |
[SQL] PostgreSQL의에서 누적 합계를 계산 (0) | 2020.04.18 |
[SQL] MySQL의 : 저장 프로 시저 내에서 트랜잭션 (transaction) (0) | 2020.04.18 |