SQL/MySQL에서 Join 스테이트먼트의 "ON"과 "WHERE"의 차이점은 무엇입니까?
다음 문장은 동일한 결과를 제공합니다(사용 중인 경우).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;
이 경우 첫 번째 사용법입니다.on
,그리고 나서.where
.가?on
먼저 매칭을 하고 나서where
secondary 필터링이 되나요?아니면 더 일반적인 규칙이라도 있나요?on
대where
감사합니다.
그ON
절은 테이블 간의 관계를 정의합니다.
그WHERE
절은 관심 있는 행을 나타냅니다.
여러 번 교환해도 동일한 결과를 얻을 수 있지만, 왼쪽 외부 결합의 경우에는 항상 해당되지 않습니다.
- 이 경우,
ON
절이 실패하면 왼쪽 테이블에서 열이 있는 행이 계속 표시되지만 오른쪽 테이블에서 열에 Null이 있는 행이 표시됩니다.- 이 경우,
WHERE
절이 실패하면 해당 행은 전혀 얻을 수 없습니다.
WHERE
의 일부입니다.SELECT
전체적으로 쿼리합니다.ON
각 조인의 일부입니다.
ON
는 이전에 사용한 테이블의 필드만 참조할 수 있습니다.
왼쪽 테이블의 레코드와 실제로 일치하는 레코드가 없는 경우LEFT JOIN
오른쪽 테이블에서 모든 필드가 로 설정된 레코드를 1개 반환합니다.NULLS
.WHERE
그런 다음 절이 이를 평가하고 필터링합니다.
쿼리에서는 다음 레코드만gifts
'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
보시는 바와 같이, 실제 일치사항은NULL
에sentgifts.id
발송되지 않은 선물만 반송됩니다.
사용시INNER JOIN
,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'
이미 언급했듯이, 이것은 사용 시 해당되지 않습니다.OUTER JOIN
어떤 쿼리 플랜이 구축되는지는 데이터베이스 플랫폼에 따라 달라지며, 쿼리에 대한 자세한 내용은 변경될 수 있습니다.따라서 그 기준만으로는 쿼리 플랜을 보증할 수 없습니다.
경험으로 볼 때 테이블을 결합하는 열을 사용해야 합니다.ON
필터링에 사용되는 절 및 열WHERE
절을 참조하십시오.이것은 최고의 가독성을 제공합니다.
결과는 동일하지만 'ON'은 먼저 조인한 후 조인된 집합의 데이터를 가져옵니다.검색 속도가 빨라지고 로드가 줄어듭니다.그러나 'WHERE'를 사용하면 두 결과 세트를 먼저 가져온 다음 조건을 적용합니다.그럼 뭐가 더 좋은지 알겠네요.
- ON은 JOIN 작업의 일부로 각 레코드의 순열을 생성하는 데 사용되는 세트에 적용됩니다.
- Where는 JOIN 작업 후에 적용되는 필터를 지정합니다.
실제로 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
---
ON 조건이 없는 경우 LEFT JOIN 순열은 다음 수집에 대해 계산됩니다.
{ 'Teddy bear': {'ALICE', 'Bob'}, 'Flowers': {'ALICE', 'Bob'} }
g.giftID = sg.giftID
ON 조건에서는, 순열을 작성하는 데 사용되는 컬렉션은 다음과 같습니다.
{ 'Teddy bear': {'ALICE', 'Bob'}, 'Flowers': {NULL, NULL} }
즉, 다음과 같습니다.
{ 'Teddy bear': {'ALICE', 'Bob'}, 'Flowers': {NULL} }
따라서 왼쪽 결합은 다음과 같은 결과가 됩니다.
Teddy bear Alice
Teddy bear Bob
Flowers NULL
풀 아우터 조인에는 다음과 같은 기능이 있습니다.
{ 'Teddy bear': {'ALICE', 'Bob'}, 'Flowers': {NULL} }
및 왼쪽 »{ 'ALICE': {'Teddy bear', NULL}, 'Flowers': {'Teddy bear', NULL} }
JOIN의 :
Teddy bear Alice
Teddy bear Bob
Flowers NULL
에게도 그런 ON g.giftID = 1
그럴 것이다.
{ NULL: {'ALICE', 'Bob'}, 'Flowers': {NULL} }
왼쪽 조인(LEFT JOIN)의 경우
Flowers NULL
FULL OUTER JOIN이 .{ NULL: {'ALICE', 'Bob'}, 'Flowers': {NULL} }
및 왼쪽 »{ 'ALICE': {NULL, NULL}, 'Flowers': {NULL, NULL} }
RIGHT
NULL Alice
NULL Bob
Flowers NULL
주의: MySQL에는 완전한 외부 결합이 없습니다.왼쪽 결합과 오른쪽 결합에 UNION을 적용해야 합니다.
JOIN을 사용하는 경우 가입 조건을 지정해야 합니다.이 목록은 ON 절에 들어갑니다.WHERE 절은 쿼리 내의 임의의 위치에 대한 데이터를 조건화하는 데 사용됩니다.
언급URL : https://stackoverflow.com/questions/2722795/in-sql-mysql-what-is-the-difference-between-on-and-where-in-a-join-statem
'programing' 카테고리의 다른 글
최대 크기 readwritesplit에 동일한 연결 수가 표시됨 (0) | 2022.10.27 |
---|---|
Firebase apiKey를 공개해도 안전한가요? (0) | 2022.10.27 |
2행에서 파일을 읽거나 헤더 행을 건너뜁니다. (0) | 2022.10.27 |
어레이를 셔플하려면 어떻게 해야 하나요? (0) | 2022.10.27 |
업데이트 시 입력 키 중복 방지 방법 (0) | 2022.10.27 |