it-swarm.com.de

Warum liefert MySQLs LEFT JOIN mit der WHERE-Klausel "NULL" -Datensätze zurück?

Heute habe ich einige komplexere MySQL-Abfragen ausprobiert und festgestellt, dass MySQLs LEFT JOIN nicht mit der WHERE-Klausel funktioniert. Ich meine, es gibt einige Datensätze zurück, aber nicht diejenigen, die auf der rechten Seite leer sind.

Nehmen wir zum Beispiel an, wir haben Tabellen:

alben; albums_rap 
 id artist title tracks; ID Künstler Titel Rang 
 ---- -------- ---------- ---------------; ---- --------- ----- -------------- 
 1 John Doe Mix CD 20; 3 Markiere CD # 7 15 
 2 Markiere CD # 7 35;

Und wenn ich diese Abfrage ausführen:

SELECT 
    t1.artist as artist,
    t1.title as title,
    t1.tracks as tracks,
    t2.rank as rank,
FROM
    albums as t1
LEFT JOIN
    albums_rap as t2
ON 
    t1.artist LIKE t2.artist
AND
    t1.title LIKE t2.title
WHERE
    t2.rank != 17

Ich bekomme das:

interpret Titel Tracks Rang 
 ------ ----- ------ ----- 
 Mark CD # 7 35 15

aber wenn ich in dieser Abfrage "WO" durch "UND" ersetze, erhalte ich:

interpret Titel Tracks Rang 
 ------ --------- ------ ----- 
 Mark CD # 7 35 15 
 John Doe Mix CD 20 NULL

Warum der erste keine Datensätze mit "NULL" zurückgibt (null ist nicht gleich 17 ...)

Ich hoffe du hast verstanden was ich meinte und du wirst mir irgendwie den Unterschied erklären. Entschuldigung für mein schlechtes Englisch, es ist nicht meine Muttersprache.

8
simivar

Eine Link-Join-Bedingung und ein Condition-Filter, bei dem der Condition-Filter nicht identisch ist. Die Daten werden durch die where-Klausel gefiltert, nachdem der physische Join abgeschlossen ist. Wenn Sie nach einem Left-Join suchen, wird normalerweise jede Zeile aus Ihrer linken Tabelle zurückgegeben. Sobald Sie jedoch eine Where-Klausel haben, wird die Ausgabe des Joins so gefiltert, dass das Ergebnis einem inneren Join ähnelt. Sie sollten sich auf die beiden Diagramme links im Bild unten konzentrieren.

enter image description here

29
akhila vangala

Erster Fall:

Nach dem Beitritt werden die Datensätze von der (WHERE-Klausel) gefiltert. Also nur 1 Ergebnis.

Zweiter Fall (wenn Sie WHERE durch AND ersetzen)

Gibt alle Join-Einträge + Einträge zurück, die in der zweiten Bedingung erfüllt sind (t2.rank! = 17). Deshalb erhalten Sie hier 2 Datensätze (einen von join + einen von der AND-Klausel)

2
Infra DBA

"Das Schlüsselwort LEFT JOIN gibt alle Zeilen aus der linken Tabelle (table1) mit den übereinstimmenden Zeilen in der rechten Tabelle (table2) zurück. Das Ergebnis ist NULL auf der rechten Seite, wenn es keine Übereinstimmung gibt ."

Das obige Zitat stammt von w3schools.com

Wenn Sie jedoch eine WHERE-Klausel auf einem LEFT JOIN platzieren, behandelt SQL dies nun als INNER JOIN und:

"Das Schlüsselwort INNER JOIN wählt alle Zeilen aus beiden Tabellen aus, solange die Spalten in beiden Tabellen übereinstimmen."

Auch zitiert von w3schools.com

TLDR;

Die Einführung der WHERE-Klausel in ein LEFT OUTER JOIN gibt dem Join das Verhalten eines INNER JOIN

0
David Zehr

Die Lösung dieser Frage wird recht intuitiv, sobald Sie die Ausführungsreihenfolge oder die Phasen der logischen Abfrageverarbeitung der SQL-Anweisung kennen. Die Reihenfolge ist: -

1. FROM
2. ON
3. OUTER
4. WHERE
5. GROUP BY
6. CUBE | ROLLUP
7. HAVING
8. SELECT
9. DISTINCT
10. ORDER BY
11. TOP

Da ON vor dem OUTER (LINKS/RECHTS) -Teil (Hinzufügen von Zeilen mit NULL-Wert) des JOIN ausgeführt wird, enthält der 1. Fall Zeilen mit NULL-Werten in der Rangspalte. Im zweiten Fall werden die Zeilen basierend gefiltert auf die Werte der Rangspalte nach dem OUTER JOIN (LEFT JOIN here) wird ausgeführt. Daher werden die Zeilen mit NULL-Werten in der Rangspalte herausgefiltert.

Eine sehr wichtige Sache, die in Ihrer SQL-Abfrage bemerkt werden kann, ist der Vergleich mit NULL Dieser Bereich erfordert besondere Aufmerksamkeit als NULL-Werte, wenn NULL/NON-NULL-Werte mit den normalen arithmetischen Operatoren verwendet werden result NULL (es ist weder TRUE noch FALSE), weil NULL bedeutet, dass kein Wert zum Vergleich verfügbar ist. Dieses Verhalten ist im ANSI SQL-92-Standard definiert. (Dies kann durch Drehen des Parameters ansi null (der tatsächliche Name kann variieren) in einigen SQL-Prozessoren deaktiviert werden.) Ihre SQL-Abfrage Mit where-Klausel werden Zeilen mit NULL-Wert in der Rangspalte herausgefiltert, was aufgrund von "17! = NULL" möglicherweise kontraintuitiv erscheint. TRUE ex-

NULL = NULL führt zu NULL/UNBEKANNT

17 = NULL führt zu NULL/UNBEKANNT

17! = NULL ergibt NULL? UNBEKANNT

Einige interessante Beiträge/Blogs als Referenz sind:

http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/http://blog.sqlauthority.com/2009/03/15/sql-server-interesting-observation-of-on-clause-on-left-join-how-on-clause-effects-resultset-in-left- join /http://www.xaprb.com/blog/2006/05/18/why-null-never-compares-false-to-anything-in-sql/

0
Aditya Guru