Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Unterschied zwischen WHERE und ON (https://www.delphipraxis.net/151665-unterschied-zwischen-where-und.html)

idefix2 27. Mai 2010 11:28

Datenbank: Firebird • Zugriff über: DBX

Unterschied zwischen WHERE und ON
 
Hallo,

ich würde gerne wissen, was der Unterschied zwischen der WHERE und der ON Klausel in einem SELECT Statement ist. Die beiden bewirken doch genau das gleiche. Und dann gibt es noch HAVING, das nur in Verbindung mit einer GROUP Klausel verwendet werden kann und eigentlich auch nichts anderes macht?

chaosben 27. Mai 2010 11:33

Re: Unterschied zwischen WHERE und ON
 
[schlecht fundiertes Halbwissen]

Wenn ich mir recht erinnere hat der Holger Klemmt mal gesagt, das die ON-Bedingung intern letztendlich genauso wie eine inhaltlich gleiche WHERE-Bedingung gehandelt wird.
Insofern: Kein Unterschied (imho).

[/schlecht fundiertes Halbwissen]

fkerber 27. Mai 2010 11:45

Re: Unterschied zwischen WHERE und ON
 
Hi!

Meinst du den Unterschied zwischen

SQL-Code:
SELECT *
FROM table1, table2
WHERE table1.id = table2.id
und

SQL-Code:
SELECT *
FROM table1 JOIN table2 ON table1.id = table2.id
?

Falls ja, dann gibt es im Endeffekt (aufgrund des Anfrageoptimierers der das erste intern quasi in das 2. umwandelt) keinen Unterschied.
Von der Sache her, ist der Unterschied aber riesig. Das erste macht ein Kreuzprodukt der beiden Tabellen und filtert dann nur die raus, die du eigentlich haben willst - im Zwischenschritt hast du also Unmengen Tupel, die du gar nicht willst.


HAVING ist nochmal ne andere Baustelle.
WHERE stellt Bedingungen an einzelne Tupel wohingegen HAVING Bedingungen an ganze Gruppen stellt (daher auch nur mit GROUP BY zu verwenden.


Grüße, Frederic

mkinzler 27. Mai 2010 11:52

Re: Unterschied zwischen WHERE und ON
 
Das on ist Teil eines (expliziten) Joins. Das where schränkt die Ergebnismenge ein (wirkt, wie Frederic schon geschrieben hat, auf Satzebene) Das HAVING gehört zur Gruppierung

borwin 27. Mai 2010 11:57

Re: Unterschied zwischen WHERE und ON
 
Hallo

bei der ON Kausel wird die Beziehung zweier Tabellen dagestellt die durch das JOIN festgelegt wurden. Man Könnte es auch in der WHERE Klausel definieren, das ist richtig. Aber durch diese Schreibweise wird das SQL besser strukturiert. So kann man genauer erkennen was die Datensicht in der Abfrage einschränkt (WHERE) und wie die Beziehungen der Relationen zu einander (ON) sind.

Bei HAVING ist das ein bischen anders. Hier erfolgt die Einschränkung auf Basis von Aggregatfunktionen. Z.B. zum finden doppelter Datensätze

SQL-Code:
SELECT NAME, VORNAME
FROM KUNDEN
GROUP BY NAME, VORNAME
HAVING COUNT(*) > 1
Das wäre so in einer WHERE Klausel nicht so einfach möglich.

Aber wie heißt es so schön viele Wege führen nach Rom. Das gilt auch für SQL Abfragen

Gruß
Borwin

fkerber 27. Mai 2010 12:04

Re: Unterschied zwischen WHERE und ON
 
[OT]

Zitat:

Zitat von mkinzler
... (wirkt wie Frederic auf Satzebene) ...

Ich wirke auf Satzebene?! :lol:

[/OT]

idefix2 27. Mai 2010 12:12

Re: Unterschied zwischen WHERE und ON
 
Offenbar bist Du Dir Deiner Wirkung gar nicht bewusst :)
Das können nämlich nur wenige.

mkinzler 27. Mai 2010 12:22

Re: Unterschied zwischen WHERE und ON
 
Zitat:

Zitat von fkerber
[OT]

Zitat:

Zitat von mkinzler
... (wirkt wie Frederic auf Satzebene) ...

Ich wirke auf Satzebene?! :lol:

[/OT]

:oops: da habe ich einen Teil des Satzes nur in Gedanken formuliert und nicht getippt

hoika 27. Mai 2010 14:19

Re: Unterschied zwischen WHERE und ON
 
Hallo,

Zitat:

Das erste macht ein Kreuzprodukt der beiden Tabellen und filtert dann nur die raus, die du eigentlich haben willst - im Zwischenschritt hast du also Unmengen Tupel, die du gar nicht willst.
Der Optimierer sorgt natürlich dafür,
dass im "1. Schritt" keine Unmenge an Tupeln vorhanden ist.

Was du vielleicht meinst, ist, dass die DB's der Vorzeit ... ;)
einen "angesagten" Join besser optimieren konnten als ein Where.
Das ist aber lange her.

Richtig ist einfach (wie schon gesagt),
dass durch die explizite Join-Syntax
die Abfrage strukturierter und damit besser lesbar ist
(Joins stehen als Join da und nicht "versteckt" als Where).


Heiko

fkerber 27. Mai 2010 14:32

Re: Unterschied zwischen WHERE und ON
 
Hi!

Ich hatte doch oben geschrieben, dass der Anfrageoptimierer das wieder wettmacht und es behandelt wie einen JOIN.
Aber von der Bedeutung des Hingeschriebenen ist es ein Kreuzprodukt aus dem nachher was rausgefiltert wird.


Grüße, Frederic

HeZa 27. Mai 2010 15:59

Re: Unterschied zwischen WHERE und ON
 
Zitat:

Zitat von idefix2
Hallo,

ich würde gerne wissen, was der Unterschied zwischen der WHERE und der ON Klausel in einem SELECT Statement ist. Die beiden bewirken doch genau das gleiche. Und dann gibt es noch HAVING, das nur in Verbindung mit einer GROUP Klausel verwendet werden kann und eigentlich auch nichts anderes macht?

Ein paar weiter Argumente:

Das Handling von INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER Joins wird dadurch vereinheitlicht und das sogar Datenbank übergreifend.

Damit lassen sich OUTER Joins definieren die mit den proprietären Erweiterungen der Datenbank Hersteller nicht möglich sind (evt. dann aber ganz anders doch noch gelöst werden können :-) )

mkinzler 27. Mai 2010 16:15

Re: Unterschied zwischen WHERE und ON
 
Zitat:

Damit lassen sich OUTER Joins definieren die mit den proprietären Erweiterungen der Datenbank Hersteller nicht möglich sind
Bei Oracle schon.

idefix2 27. Mai 2010 16:16

Re: Unterschied zwischen WHERE und ON
 
Zitat:

Das Handling von INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER Joins wird dadurch vereinheitlicht und das sogar Datenbank übergreifend
Das habe ich jetzt nicht verstanden :?

mkinzler 27. Mai 2010 16:25

Re: Unterschied zwischen WHERE und ON
 
Implizite Joins ( mit Hilfe der Where clause) sind immer inner Joins (Ausser bei Oracle mit '(+)' Notatation)
Outer Joins sind sonst nur mit den neueren expliziten Joins möglich.

idefix2 27. Mai 2010 16:30

Re: Unterschied zwischen WHERE und ON
 
Natürlich. Das heißt also, daß sich ein Outer join ja überhaupt nur mit on und gar nicht mit where realisieren läßt, weil beim where die Gegenseite für den Vergleich fehlt, wenn es in der gejointen Tabelle keinen passenden Datensatz gibt.

HeZa 27. Mai 2010 16:44

Re: Unterschied zwischen WHERE und ON
 
Zitat:

Zitat von idefix2
Natürlich. Das heißt also, daß sich ein Outer join ja überhaupt nur mit on und gar nicht mit where realisieren läßt, weil beim where die Gegenseite für den Vergleich fehlt, wenn es in der gejointen Tabelle keinen passenden Datensatz gibt.

Vor dem ON hatten die Hersteller keine oder proprietäre Lösungen. Nun gibt es einen Standard. Lasst ihn uns nutzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz