Mysql
 sql >> Datenbank >  >> RDS >> Mysql

INNER JOIN-Bedingung in WHERE-Klausel oder ON-Klausel?

Für innere Verknüpfungen wie diese sind sie logisch äquivalent. Es kann jedoch vorkommen, dass eine Bedingung in der Join-Klausel etwas anderes bedeutet als eine Bedingung in der Where-Klausel.

Stellen Sie sich zur einfachen Veranschaulichung vor, Sie führen eine Linksverknüpfung wie folgt aus:

select x.id
from x
       left join y
         on x.id = y.id
;

Hier nehmen wir alle Zeilen von x, unabhängig davon, ob es eine passende ID in y gibt. Nehmen wir nun an, unsere Join-Bedingung wächst - wir suchen nicht nur nach Übereinstimmungen in y basierend auf der ID, sondern auch auf dem ID_Typ.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Auch dies ergibt alle Zeilen in x, unabhängig davon, ob es eine Übereinstimmung (id, id_type) in y gibt.

Dies ist jedoch sehr unterschiedlich:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

In dieser Situation wählen wir alle Zeilen von x aus und versuchen, die Zeilen von y abzugleichen. Nun ist für Zeilen, für die es keine Übereinstimmung in y gibt, y.id_type null. Aus diesem Grund ist y.id_type ='some type' nicht erfüllt, sodass die Zeilen, in denen es keine Übereinstimmung gibt, verworfen werden, wodurch dies effektiv zu einem Inner Join wurde.

Um es kurz zu machen:Für Inner Joins spielt es keine Rolle, wohin die Bedingungen gehen, aber für Outer Joins schon.