Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

23.04.2014, 16:12

SQL Joins Verständnisfrage

Ich nutze SQL schon ewig.
Aber bisher habe ich nie den effektiven Unterschied zwischen INNER, LEFT und RIGHT JOIN verstanden.
Grundsätzlich kann man sich das doch als Teilmengen vorstellen.

INNER JOIN gibt mir die Schnittmenge
LEFT JOIN die Daten der linken Tabelle und die Schnittmenge
RIGHT JOIN die Daten der rechten Tabelle und die Schnittmenge

Aber ich bekomme kein Beispiel hin bei dem das tatsächlich einen Unterschied machen würde.

Mein Beispiel:

Quellcode

1
2
Kunden(id, Name, Alter)
Kauf(id, Kunde, ArtikelNr)


Kunde in Kauf ist dabei die ID des Kunden.
Folgendes gibt mir dann immer das selbe Ergebnis:

Quellcode

1
2
3
SELECT * FROM Kunden INNER JOIN Kauf ON Kunden.id = Kauf.Kunde
SELECT * FROM Kunden LEFT JOIN Kauf ON Kunden.id = Kauf.Kunde
SELECT * FROM Kunden RIGHT JOIN Kauf ON Kunden.id = Kauf.Kunde


Kann mir das mal jemand erläutern?

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

23.04.2014, 16:21

Naja du hast auch sehr simple Beispiele. Outer Joins werden bei Verkettungen bzw. Subselects interessant, weil dich dann manchmal auch die größere Menge interessiert, als das was du von der anderen Seite anforderst. Prinzipiell sind Outer Joins auch langsamer, weil mehr Daten gesucht werden. Konkretes Beispiel habe ich aber gerad auch nicht zur Hand.

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

23.04.2014, 16:22

Unterschiede macht es dann, wenn Daten optional sind. Hat man bspw. ein Shopping-Portal, wird man dem Benutzer die Möglichkeit bieten wollen, min. 1 Adresse anzugeben. Auf Amazon ist es so, dass man mehrere Adressen für sich speichern kann, damit man bei einer Bestellung nur noch auswählen muss, welche Adresse als Versandziel verwendet werden soll.
Da man nicht gleich bei der Accounterstellung eine Adresse angeben wird (man muss ja erstmal seine E-Mail-Adresse verifizieren), kann es sein, dass für Benutzer keine Adressen angegeben sind.
In einem solchen Fall würde es einen Unterschied machen, ob man sich alle Benutzer in Kombination mit ihren Adressen holt, für die mindestens eine Adresse angegeben ist (inner join) oder ob man sich alle Kunden zuzüglich aller diesen zugehörigen Adressen holt, sofern eine solche Adresse vorhanden ist (sonst Leerfelder für die Adresse, left join bzw. right join).

Interessant könnten natürlich noch der (full) outer join (eine Kombination aus right und left join), der cross join (alle Kombinationsmöglichkeiten der beiden Tabellen) und ein union select (2 Abfragen, die nicht "nebeneinander" sondern "untereinander" zurückgeliefert werden, die gelieferten Spalten beider Abfragen müssen gleich sein) sein.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

23.04.2014, 22:05

Hmm ja ich glaube so wie Sacaldur das erklärt kann ich es mir vorstellen.
Also ist es im Grunde doch vom Anwendungsfall abhängig.

Ich schreib mir hier mal noch ein anderes Beispiel.
Aber danke schon mal.

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

24.04.2014, 01:45

Würde es nicht mehr Sinn machen wenn sie nicht null sein dürfen?
Ich teste das mal "morgen" ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

24.04.2014, 06:37

Das hängt eben von Deinem Anwendungsfall ab, das hat doch Sacaldur schon schön erklärt. Es kann durchaus Sinn machen, die eine Zeile aus der einen Tabelle im Ergebnis zu haben, auch wenn die in der anderen eben keine Verknüpfung liefert.
Beispiele: Gib mir alle Kunden mit ihrer (optionalen) Adresse. Du willst hier alle Kunden. Wenn sie keine Adresse haben, sind diese Infos eben null. Du willst hier nicht nur die Kunden, die eine Adresse haben. Das wäre wieder eine ganz andere Anforderung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

24.04.2014, 11:32

Jup so dachte ich mir das auch.
Klang nur bei LetsGo etwas so als müsse eine der Bedingungen null sein.

Aber ich glaube ich probiers einfach in zukünftigen Projekten :)
Danke.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

24.04.2014, 11:51

Muss nicht, darf aber. Bei einem Inner Join darf es eben nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

9

25.04.2014, 09:10

Left Join:

Selektiere alles von der linken Tabelle, auch wenn in der rechten kein übereinstimmender Wert vorhanden ist.

Right Join:

Selektiere alles von der rechten Tabelle, auch wenn in der linken kein übereinstimmender Wert vorhanden ist.

Inner Join
Selektiere alles von der linken Tabelle, nur wenn in der rechten ein übereinstimmender Wert vorhanden ist.

Werbeanzeige