2010-04-27 3 views
34

Die folgenden Aussagen geben das gleiche Ergebnis (eine ist mit on und den anderen where verwenden):In SQL/MySQL, was ist der Unterschied zwischen "ON" und "WHERE" in einer Join-Anweisung?

mysql> select * from gifts INNER JOIN sentGifts ON gifts.giftID = sentGifts.giftID; 
mysql> select * from gifts INNER JOIN sentGifts WHERE gifts.giftID = sentGifts.giftID; 

kann ich nur in einem Fall eines links außen sieht die „unvergleichlichen“ Fälle beitreten zu finden:
(um die Geschenke herausfinden, die nie von jemandem geschickt wurden)

mysql> select name from gifts LEFT OUTER JOIN sentgifts 
      ON gifts.giftID = sentgifts.giftID 
      WHERE sentgifts.giftID IS NULL; 

In diesem Fall wird zunächst on verwenden und dann where. Trifft die on zuerst die Übereinstimmung und dann where die "sekundäre" Filterung? Oder gibt es eine allgemeinere Regel der Verwendung von on gegenüber where? Vielen Dank.

+0

Sehr ähnlich zu http://stackoverflow.com/questions/2559194/difference-between-and-and-where-in-joins –

+1

Diese Frage hat den besseren Titel der beiden. – ripper234

Antwort

38

WHERE ist ein Teil der SELECT Abfrage als Ganzes, ON ist ein Teil jeder einzelnen Join.

ON kann nur auf die Felder der zuvor verwendeten Tabellen verweisen. Wenn keine Übereinstimmung mit einem Datensatz in der linken Tabelle vorhanden ist, gibt LEFT JOIN einen Datensatz aus der rechten Tabelle zurück, wobei alle Felder auf NULLS festgelegt sind. WHERE Klausel dann wertet und filtert dies.

In Ihrer Abfrage werden nur die Datensätze aus gifts ohne Übereinstimmung in 'sendgifts' zurückgegeben.

Hier ist das Beispiel

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 

Wie Sie sehen können, kein tatsächliches Spiel ein NULL in sentgifts.id verlassen kann, so dass nur die Gaben, die nicht immer hatten gesendet zurückgegeben werden.

0

Wenn Sie einen JOIN verwenden, müssen Sie die Bedingungen angeben, denen Sie beitreten. Diese Liste gehört zu einer ON-Klausel. Eine WHERE-Klausel wird verwendet, um Daten für eine beliebige Stelle in der Abfrage zu konditionieren.

2

Obwohl die Ergebnisse gleich sind, wird der Join zuerst durch den 'ON' gesetzt und dann werden die Daten des verbundenen Sets abgerufen. Der Abruf ist schneller und die Belastung ist geringer. Wenn Sie jedoch 'WHERE' verwenden, werden zuerst die beiden Ergebnismengen abgerufen und anschließend die Bedingung angewendet. Sie wissen also, was bevorzugt wird.

11

Wenn INNER JOIN verwendet wird, haben ON und WHERE das gleiche Ergebnis. So

select * 
from Table1 t1 
inner join Table2 t2 on t1.id = t2.id 
where t1.Name = 'John' 

wird genau die gleiche Ausgabe wie

haben
select * 
from Table1 t1 
inner join Table2 t2 on t1.id = t2.id 
    and t1.Name = 'John' 

Wie Sie bemerkt haben, ist dies nicht der Fall, wenn OUTER JOIN verwenden. Welcher Abfrageplan erstellt wird, hängt sowohl von der Datenbankplattform als auch von den spezifischen Anforderungen der Abfrage ab und kann sich ändern. Daher kann das Treffen von Entscheidungen auf dieser Grundlage keinen garantierten Abfrageplan ergeben.

Als Faustregel sollten Sie Spalten verwenden, die Ihre Tabellen in ON Klauseln und Spalten, die für die Filterung in WHERE Klauseln verwendet werden. Dies bietet die beste Lesbarkeit.

+0

Ist es richtig, "ON" mit etwas komplexeren als field1 = field2 zu verwenden? – skan

+0

Ja, es gibt oft mehrspaltige ON-Klauseln. – RedFilter

+0

Ich meinte, Können Sie komplexe Ausdrücke über Spaltenvergleich hinaus verwenden? – skan

40

Die ON-Klausel definiert die Beziehung zwischen den Tabellen.

Die WHERE Klausel beschreibt, welche Zeilen Sie interessiert sind.

Viele Male Sie sie tauschen können und immer noch das gleiche Ergebnis erhalten, aber diese kommen nicht immer der Fall mit einem linken Außen ist.

  • Wenn die ON-Klausel fehlschlägt, erhalten Sie immer noch eine Zeile mit Spalten aus der linken Tabelle, aber mit Nullen in den Spalten aus der rechten Tabelle.
  • Wenn die WHERE-Klausel fehlschlägt, werden Sie diese Zeile überhaupt nicht erhalten.
  • +0

    Upvote für die letzten beiden Aussagen einschließen – Sekai