programing

SQL/MySQL에서 Join 스테이트먼트의 "ON"과 "WHERE"의 차이점은 무엇입니까?

javaba 2022. 10. 27. 23:37
반응형

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먼저 매칭을 하고 나서wheresecondary 필터링이 되나요?아니면 더 일반적인 규칙이라도 있나요?onwhere감사합니다.

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

보시는 바와 같이, 실제 일치사항은NULLsentgifts.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.giftIDON 조건에서는, 순열을 작성하는 데 사용되는 컬렉션은 다음과 같습니다.

{ '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

반응형