SQL Frage
Geizhals » Forum » Programmierung » SQL Frage (55 Beiträge, 680 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
......
Re(6): SQL Frage
02.11.2011, 16:43:32
Wielange schon?


Seit 1992.

Bzw. scheinbar fand er die "standard Joins" halt nicht böse und somit die
andere nicht von Interesse..


Das ist es ja, Theta-Style ist nicht nach dem ANSI Standard. Deswegen ist es ja so schiach.

Könnte auch sein, dass er sich dachte, wenn bei beiden das gleiche rauskommt,
warum 2 Sachen lernen


Es hätte gereicht nach dem SQL-Standard zu lernen. Den Theta-Mist braucht keine Sau.

Ist von DB zu DB verschieden und auch von den Daten.. Warum komplette Tabellen
joinen, wenn man eigentlich nur eine Spalte will...


Was verstehst du unter "komplette Tabellen joinen"? Ein Sub-Select macht so angewandt auch nichts anderes, nur ineffizienter. Du hast irgendwie eine falsche Vorstellung davon, wie eine Datenbank arbeitet.

Wenn die Tabelle indexed ist, isses wieder was anderes und der Inner Join wäre
sowieso schneller (nur dann brauche ich auch keinen Subselect :P).


Ehmm... ich dachte wir reden hier von einem gscheiten Datenbankdesign und nicht von irgendeinem zusammengebastelten Pfusch, wo man zu blöd war Indexe zu setzen.

Und es kommt auf den Query Optimiser auch an...


Ja, das ist klar. Ich sag ja auch nicht, dass Joins immer der beste Weg sind. Aber genauso falsch ist es konsequent auf Sub-Selects zu setzen. Das wäre so, wie mit einem Auto immer im 1. Gang zu fahren, weil man nicht schalten will. Das mag unter bestimmten Bedingungen sinnvoll sein (zB. beim Einparken) aber großteils ist das einfach nur Quatsch.

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
.......
Re(7): SQL Frage
thE
03.11.2011, 09:47:29
Seit 1992.

Gut, das hätte der Prof wissen müssen ;)

Das ist es ja, Theta-Style ist nicht nach dem ANSI Standard. Deswegen ist es
ja so schiach.

Wußte ich auch nicht ;)

Was verstehst du unter "komplette Tabellen joinen"? Ein Sub-Select macht so
angewandt auch nichts anderes, nur ineffizienter. Du hast irgendwie eine
falsche Vorstellung davon, wie eine Datenbank arbeitet.

Also wir haben es so gelernt, dass bei nem Join (zumindest bei dem Theta) alles mit allem verknüpft wird und temporär gespeichert wird und nachher mit where nur das selektiert wird, was man braucht..

Ist der left oder right join da viel performanter?

Ehmm... ich dachte wir reden hier von einem gscheiten Datenbankdesign und
nicht von irgendeinem zusammengebastelten Pfusch, wo man zu blöd war Indexe zu
setzen.

Ach, solche Designs werden sooft über Board geworfen...

Ja, das ist klar. Ich sag ja auch nicht, dass Joins immer der beste Weg sind.
Aber genauso falsch ist es konsequent auf Sub-Selects zu setzen. Das wäre so,
wie mit einem Auto immer im 1. Gang zu fahren, weil man nicht schalten will.
Das mag unter bestimmten Bedingungen sinnvoll sein (zB. beim Einparken) aber
großteils ist das einfach nur Quatsch.

Ist mir auch klar, ich bin halt nur ein größerer Fan von Subselects als von Joins, aber ich benutze auch joins (und nicht die Theta ;))


Achja, der Theta Join entspricht nicht dem Left Join!

SELECT a.name, b.txt
FROM newtable a
RIGHT JOIN notizen b ON ( b.id = a.id );
= 1: 1 wie Theta

Und der LEFT JOIN = 1:1 wie der Subselect..

Hat man nämlich in newtable eine id, was es in der notizen Tabelle nicht gibt, so wird beim Theta und Right Join der name + txt nicht aufgeführt (weil in der anderen Tabelle nicht gefunden).

Beim Left join oder subselect steht der name und beim txt halt NULL...

Wieder was gelernt und das schon in der Früh :P
...
:P
Apple User sind wie Zeugen Jehovas. Es ist sinnlos mit ihnen zu reden..

Why not ZOIDBERG? (V)_(°,,,°)_(V)
             (-.(-.(-.(-.-).-).-).-)
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
........
Re(8): SQL Frage
03.11.2011, 10:03:23
Also wir haben es so gelernt, dass bei nem Join (zumindest bei dem Theta)
alles mit allem verknüpft wird und temporär gespeichert wird und nachher mit
where nur das selektiert wird, was man braucht..


Ein Theta-Join ist ja im Prinzip ein CROSS JOIN. Cross Joins sind eigentlich ganz böse, weil sie alles mit allem verknüpfen. Also wenn du pro Tabelle 1000 Datensätze hat, hat das Ergebnis (ohne WHERE-Bedingungen) 1000000 Datensätze.

Ist der left oder right join da viel performanter?


Am performantesten ist der Inner Join. Aber darum geht es nicht. Man entscheidet sich ja zu einem Join anhand der Aufgabenstellung. Was bringt mir ein Inner Join, wenn ich für das Ergebnis ein Left Join brauche? Right Joins sind eher unüblich, weil man bei uns von Links nach Rechts und nicht von Rechts nach Links "denkt".

Die Performance ist auch nicht der Grund, warum ich vom Theta-Style abrate. Das größte Problem ist diese umständliche und unübersichtliche Schreibweise. Je größer die Abfrage ist, umso unübersichtlicher wird das Ganze.

Achja, der Theta Join entspricht nicht dem Left Join!

SELECT a.name, b.txt
FROM newtable a
RIGHT JOIN notizen b ON ( b.id = a.id );
= 1: 1 wie Theta


Was weiß ich. Bei dieser kryptischen Benennung ("newtable", wtf?) wollte ich nicht unnötig meine Gehirnzellen anstrengen.

Tabellen- und Spaltenname sollten immer so gewählt werden, dann man möglichst am ersten Blick versteht, welche Daten sie enthalten. Irgendwelche kryptischen Abkürzungen sind eigentlich nur ein Hindernis.



Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
.........
Re(9): SQL Frage
thE
03.11.2011, 11:21:38
Also wenn du pro Tabelle 1000 Datensätze hat, hat das Ergebnis (ohne
WHERE-Bedingungen) 1000000 Datensätze.

Eben, das habe ich auch so gelernt...

Und beim Left oder Right Join ist das nicht so?


Das größte Problem ist diese umständliche und unübersichtliche Schreibweise.
Je größer die Abfrage ist, umso unübersichtlicher wird das Ganze.

Gut, das mag Geschmacksache sein..

Zb in meinem Bsp kann ich den Theta Join ganz normal lesen.. Gut wir haben den auch lange genug gelernt...


Was weiß ich. Bei dieser kryptischen Benennung ("newtable", wtf?) wollte ich
nicht unnötig meine Gehirnzellen anstrengen.

Hehe.. War halt ein Quick and Dirty Beispiel mit JerbyDB.. Da waren mir die Namen egal...

Right Joins sind eher unüblich, weil man bei uns von Links nach Rechts und
nicht von Rechts nach Links "denkt".

Naja, kommt auf die Aufgabe drauf an..

Würde ich zuerst von Notizen selektieren und den left join nach newTable machen, dann wäre das Ergebnis auch so wie beim Theta Join oder halt beim Right Join..


Am performantesten ist der Inner Join.

Weiß ja nicht wiefern man Wiki hier vertrauen kann, aber siehe hier:
http://en.wikipedia.org/wiki/Join_(SQL )#Inner_join

Da ist zuerst ein Inner Join und nachher ist ein Theta join was das gleiche Ergebnis liefert... (dann wäre der Theta Join ja gleich schnell, nur die Schreibweise ist halt nicht "schön").

Dort ist der Theta Join eigentlich mit einem Equi-join gleichgesetzt und nicht mit dem Inner Join..


Ich bin jetzt nur noch verwirrt :P
...
:P
Apple User sind wie Zeugen Jehovas. Es ist sinnlos mit ihnen zu reden..

Why not ZOIDBERG? (V)_(°,,,°)_(V)
             (-.(-.(-.(-.-).-).-).-)
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..........
Re(10): SQL Frage
03.11.2011, 11:36:08
Eben, das habe ich auch so gelernt...

Und beim Left oder Right Join ist das nicht so?


Nein, bei Left und Inner Join wird nur das gejoint, bei dem die ON-Bedingung zutrifft.

Gut, das mag Geschmacksache sein..


Ja, es gibt den falschen und den richtigen Geschmack.

Zb in meinem Bsp kann ich den Theta Join ganz normal lesen..


Ja, weils eine Mini-Fuzzi-Abfrage ist. Abfragen können schon mal über mehrere Bildschirmseiten gehen.

Naja, kommt auf die Aufgabe drauf an..

Würde ich zuerst von Notizen selektieren und den left join nach newTable
machen, dann wäre das Ergebnis auch so wie beim Theta Join oder halt beim
Right Join..


Dann würde man die Reihenfolge der Tabellen umdrehen und einen Left Join machen. Also einen Right Join hab ich in den letzten 5 Jahren ein einziges mal gemacht, und das nur weil ich zu faul war nachträglich zwei Tabellen auszutauschen.

Da ist zuerst ein Inner Join und nachher ist ein Theta join was das gleiche
Ergebnis liefert... (dann wäre der Theta Join ja gleich schnell, nur die
Schreibweise ist halt nicht "schön").


Richtig. Man kann durch Where-Bedingungen aus einem Cross Join ein Inner oder Left Join machen. Aber warum nicht gleich den richtigen Join verwenden, den man auch sofort erkennt und sich die Informationen nicht aus der Where-Bedingung rausklauben muss?

Ich bin jetzt nur noch verwirrt :P


Mach einfach normale Joins und vergiss den Rest. Hätte euer Professor euch das gleich richtig beigebracht, gäbs diese Verwirrung jetzt nicht.

In 99,9% der Fälle kommst mit LEFT und INNER JOIN aus. Alles andere ist so speziell dass du dich sowieso tiefer mit der Materie auseinander setzen musst.

03.11.2011, 11:38 Uhr - Editiert von hellbringer, alte Version: hier
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
...........
Re(11): SQL Frage
thE
03.11.2011, 12:53:32
Nein, bei Left und Inner Join wird nur das gejoint, bei dem die ON-Bedingung
zutrifft.

Na dann isses besser ;)

Ja, es gibt den falschen und den richtigen Geschmack.

Naja, bei Mini-Selects isses egal.. Da isses wirklich nur der Geschmack...


Ja, weils eine Mini-Fuzzi-Abfrage ist. Abfragen können schon mal über mehrere
Bildschirmseiten gehen.

In meinen "großen" Selects die > 400 Zeichen haben, ist ne Mischung aus Left Join und/oder subselects..
Je nachdem was halt gebraucht wird.

Außerdem sind das SQL-Befehle die einmal logisch durchdacht worden sind und dann dynamisch von einem Programm zusammengebaut werden...
Da ist die Lese-Schreibweise sowas von egal.. (wenns halt gut dokumentiert ist)

Richtig. Man kann durch Where-Bedingungen aus einem Cross Join ein Inner oder
Left Join machen. Aber warum nicht gleich den richtigen Join verwenden, den
man auch sofort erkennt und sich die Informationen nicht aus der
Where-Bedingung rausklauben muss?

Wie gesagt, ich kann die Theta joins genauso schnell lesen/erklären, aber wenn der andere performanter ist, dann werde ich auch bei Mini-Selects den nicht mehr verwenden ^^

In 99,9% der Fälle kommst mit LEFT und INNER JOIN aus. Alles andere ist so
speziell dass du dich sowieso tiefer mit der Materie auseinander setzen musst.

Tja, leider hatte ich damals schon oft solche Fälle..

Gut da sind auch bei DBs (Oracle) aufeinmal Indizes verschwunden (oder ein Admin hats gelöscht und dann wars wieder keiner) und man hat sich aufeinmal gewundert, warum der Select solange braucht...
...
:P
Apple User sind wie Zeugen Jehovas. Es ist sinnlos mit ihnen zu reden..

Why not ZOIDBERG? (V)_(°,,,°)_(V)
             (-.(-.(-.(-.-).-).-).-)
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung