SQL SQL 'INNER JOIN' Frage

cookz

Ensign
Registriert
Dez. 2009
Beiträge
245
Hallo,

ich würde gerne wissen, ob man eine bestimmte SQL-Anfrage unterschiedlich schreiben kann.

Nehmen wir an, wir hätten 2 Tabellen (Kunde und Auftrag) und ein Attribut, das sie gemeinsam haben (Kundennummer). Nun möchte man diese 2 Tabellen via INNER JOIN miteinander verknüpfen, um den Auftragsdatum anzuzeigen. Ich möchte nur wissen, ob beide Schreibweisen korrekt sind oder nicht.

1. ) SELECT Name,Vorname,Auftragsdatum FROM Kunde INNER JOIN Auftrag ON
Kunde.Kundennummer=Auftrag.Kundennummer;

2.) SELECT Name,Vorname,Auftragsdatum FROM Auftrag INNER JOIN Kunde ON
Auftrag.Kundennummer=Kunde.Kundennummer;

Ich habe lediglich die Position von Tabelle 1 und 2 bei der INNER JOIN Funktion vertauscht. Wäre aber auch beides korrekt oder würde man in Microsoft Access ein Fehler bekommen? Habe die Datenbank leider nicht, sonst würde ich es selber probieren.

Danke!:)
 
Meine Datenbankvorlesung ist zwar ein paar Jährchen her, aber ich würde behaupten das ist wurscht (99.9%) ;)
 
Bei einem Inner Join ist die Reihenfolge der Tabellen egal, da er nur die Daten zusammenstellt, die aufgrund der Verknüpfung in BEIDEN Tabellen vorhanden sind.

Dein Beispiel liefert nur Kunden und deren Auftragsdaten - keine Kunden ohne Auftragsdaten und auch keine Auftragsdaten ohne Kunden.

Bei einem Left Join ist das anders - hier nimmt er die Daten der linken Tabelle und erweitert die hier gefundenen Datensätze um die Daten aus der rechten Tabelle, falls die Verknüpfung passt. Passt die Verknüpfung nicht, bekommt man einen Datensatz aus der linken Tabelle und alle Felder der rechten Tabelle werden mit NULL geliefert.

Dein Beispiel würde sowohl Kunden ohne, als auch mit Auftragsdaten liefern. Auftragsdaten ohne Kunde würde weiterhin weggelassen werden.
 
Zuletzt bearbeitet: (erweitert)
Danke für schnellen Antworten!:) Ich mache zzt. nur Inner Join.
 
nuja ganz so wurst ist das bei einem join noch nicht. ansonst solltest du immer die richtung gehen, dass du zuerst die tabelle mit den geringsten daten hernimmst und dann dich wieterhangelst.
beispiel

automarke 5 einträge
autoname 200 einträge
autoeinzelteile 1000000 einträge

wenn du jetzt von "hinten" anfängst, verknüpfst du zuerst 1mio einträge mit 200 autonamen, wovon du aber nur eine marke haben willst. so hab ich das mal gelernt, also ist es sinvoller, erst den weg von der automarke zu dem namen und dann zu den einzelteilen zu gehen, da du die ergebnisse vorher schon ordentlich siebst (das gilt für interne in der datenbank geschehende prozesse, ich weis aber nicht ob solche problematiken immernoch aktuell sind oder die datenbanksysteme da schon "schlauer" geworden sind)
 
hier stand quatsch. Die Reihenfolge der Tabellen ist nicht egal. Die Basismenge ist die 1. Tabelle gegen die verglichen wird.
 
Zuletzt bearbeitet:
@easteregg
SQL ist eine deklarative Sprache. Man gibt an WAS ausgeführt werden soll. WIE das Ganze ausgeführt wird ist Datenbankspezifisch und jede halbwegs gescheite Datenbank hat einen Query Optimizer der das für dich übernimmt.
 
@ Enigma
Das Beispiel mit der Mengelehre ist nicht ganz korrekt - bei einem INNER JOIN macht er aus 1 Automarke und 10.000 Zubehörteilen immerhin aus dem 1 Automarken-Datensatz 10.000, da ja ein Datensatz am Ende immer aus beiden Tabellen bestehen muss...
 
easteregg schrieb:
ich weis aber nicht ob solche problematiken immernoch aktuell sind

Sind nicht mehr aktuell :) MySQL erstellt vor der Ausführung eines Queries einen Execution Plan. Diesen kannst du mit EXPLAIN [query] anzeigen lassen. Hierbei optimiert MySQL das Query nach vorhandenen Indizes und den erwarteten Zeilen einer Operation sowie der Zugriffsoperation (SCAN, SEEK). Das ganze passiert rekursiv und das Ergebnis ist in der Regel ziemlich gut. Problematisch wirds nur bei duzenden Tabellen ;)

Manuell kannst du in den Prozess eingreifen indem du der MySQL sagst, welchen Index sie verwenden soll (z.B. FORCE INDEX X)
 
Zurück
Oben