PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL Joins


Mr.Fency Pants
2005-05-31, 15:12:17
Hi,

bin anwendungsmässig absoluter noob und hätte einige Fragen bezüglich SQL Joins.

Wofür genau werden die angewendet? Wann benutzt man Inner, outer, right, left Joins?

Wäre super, wenn jemand das Ganze an einem Beispiel veranschaulichen könnte.

Danke

darph
2005-05-31, 16:11:15
Nehmen wir an du hast zwei Tabellen

Weinliste: Id, Jahrgang, Name
1, 1980, Riesling
2, 1991, Merlot
3, 1995, Riesling


und Bestand: Id, Anzahl
1, 5
2, 10
3, 3

Wenn du jetzt den Bestand aller Riesling Weine haben wills:

SELECT Weinliste.Name, Bestand.Anzahl
FROM Weinliste, Bestand
WHERE Weinliste.Name = Riesling
AND Weinliste.Id = Bestand.Id

Das Fette ist der Join - so kannst du eine Information anhand der Daten einer anderen Tabelle filtern.

Railer
2005-05-31, 18:09:14
Ich würde an deiner Stelle ein SQL-Buch lesen. SQL ist im prinzip sehr einfach, nur wenn du komplexe Datenmengen mit einander verbinden willst, wird es ecklig. Ansonsten kannst du auch im Internet umfassende Informationen dazu finden.

Joins sind, wie der Name schon sagt, dazu da mehere Tabellen miteinander zu verbinden. Dies geschieht mithilfe von Primär- und Fremdschlüsseln. INNER- Joins verbinden dabei jeden Datensatz der Tabellen, während OUTER-Joins auch leere Datensätze mit entsprechenden nicht leeren Datensätzen verbinden. Ob Right oder Left joins ist egal, es kommt darauf an welche Tabelle du links bzw. rechts auflistest, sie lassen sich also austauschen. Der generelle Unterschied besteht zwischen inner- und outerjoins.

Das Beispiel von darph ist nicht ganz zu gebrauchen, weil zum einen keine Outerjoins demonstriert werden und zum anderen die WHERE-Klausel auch zum Join gehört genau wie die AND-Anweisung und ausserdem wurde auch keine Join-Anweisung benutzt (so wie sie in einer Access-DB erstellt werden) mit der lässt sich besser nachvollziehen, wie ein Join funktioniert (sind aber schwerer im Umgang)

Es ist ein recht Umfangreiches Thema, daher empfehle ich es dir etwas zu googeln.

grakaman
2005-05-31, 21:26:56
Bsp.:

discount stores

store_id discounttype discount store_id store_name
---------- ---------------- ----------- -------- --------------
1 Initial Customer 10.50 1 Bookbeat
2 Volume Discount 6.70 2 Fricative Bookshop
9 Customer Discount 5.00 3 Doc-U-Mat
4 News&Brews
5 Barnum's
6 Eric the Read Books


Inner Join

Verknüpft zwei Tabellen über eine Spalte. Resultset enthält alle Daten aus beiden Tabellen, bei denen jeweils der Wert in der Verknüpfungsspalte übereinstimmt.

SELECT d.discounttype, d.discount, s.store_name
FROM discount d
JOIN stores s
ON d.store_id = s.store_id


discounttype discount store_name
--------------------- ---------- ------------------------
Inital Customer 10.50 Bookbeat
Volume Discount 6.70 Fricative Bookshop


Left Outer Join:

Verknüpft zwei Tabellen über eine Spalte. Enthält alle Daten aus der Tabelle auf der linken Seite und füllt ggf. die fehlenden Spalten auf der rechten Seite mit NULLen. Das Schlüsselwort Outer kann man zumindest beim SQL Server weglasse und ist nur optional.

SELECT discounttype, discount s.store_name
FROM discounts d
LEFT OUTER JOIN stores s
ON d.store_id = s.store_id


discounttype discount store_name
--------------------- ---------- ------------------------
Inital Customer 10.50 Bookbeat
Volume Discount 6.70 Fricative Bookshop
Customer Discount 5.00 NULL


Right Outer Join:

Verknüpft zwei Tabellen über eine Spalte. Enthält alle Daten aus der Tabelle auf der rechten Seite und füllt ggf. die fehlenden Spalten auf der linken Seite mit NULLen. Das Schlüsselwort Outer kann man zumindest beim SQL Server weglasse und ist nur optional.

SELECT discounttype, discount s.store_name
FROM discounts d
RIGHT OUTER JOIN stores s
ON d.store_id = s.store_id


discounttype discount store_name
--------------------- ---------- ------------------------
Inital Customer 10.50 Bookbeat
Volume Discount 6.70 Fricative Bookshop
NULL NULL Doc-U-Mat
NULL NULL News&Brews
NULL NULL Barnums
NULL NULL Eric the Read Book


Full Join:

Verknüpft alle Spalten beider Tabellen miteinander und füllt ggf. Spalten mit NULLen.


Address VendorAddress

AddressID Address AddressID
--------------------------------- --------------
1 1234 Anywhere 1
2 567 Main St. 2
3 999 1st St.
4 1212 Smith Ave
5 364 Westin


// entspricht in dem Bsp. einen Right Outer Join
SELECT a.Address, va.AddressID
FROM VendorAddress va
FULL JOIN Address a
ON va.AddressID = a.AddressID


Address AddressID
-------------------- ---------------
1234 Anywhere 1
567 Main St. 2
999 1st St. NULL
1212 Smith Ave NULL
364 Westin NULL


Cross Join:

Verknüpft jede Zeile der einen Tabelle mit jeder Zeile der anderen Tabelle. Kann man z.B. zur Erstellung von Testdaten verwenden

Bsp.:
SELECT fn.Name + ', ' + ln.Name
FROM FirstName fn
CROSS JOIN LastName ln

Wenn in beiden jeweils 50 Datensätze sind, habe ich also 2500 Datensätze im Resultset.

Nachtrag:
In einer SQL Anweisung kann man dann natürlich mehrer Joins haben, wobei sich der nachfolgende Join auf das Resultset des vorhergehenden Joins bezieht.
Beim SQL Server kann man dann z.B. auch neben der ANSI Notation alternative Notationen verwenden. Bsp.:

Left Join:

SELECT discounttype, discount s.store_name
FROM discounts d, stores s
WHERE d.store_id *= s.store_id

RIGHT JOIN:

SELECT discounttype, discount s.store_name
FROM discounts d, stores s
WHERE d.store_id =* s.store_id

Cross Join:

SELECT fn.Name + ', ' + ln.Name
FROM FirstName fn, LastName ln

Achja, und für den Inner Join kann man auch das schreiben:
SELECT d.discounttype, d.discount, s.store_name
FROM discount d, stores s
WHERE d.store_id = s.store_id

Hoffe, dass das etwas Klarheit gebracht hat.

Gruß,
grakaman


edit: Wie bekommt man das denn mit den Leerzeichen hin :confused:

grakaman
2005-05-31, 22:55:14
Vielleicht kann ja ma bitte n Mod mein Post bearbeiten, die Tabellen sind vollkommen verhunzt :(

Aqualon
2005-05-31, 23:12:14
Kannst du doch selber machen, für feste Abstände gibt es den [code]-Tag.

Aqua

grakaman
2005-06-01, 08:09:59
Kannst du doch selber machen, für feste Abstände gibt es den [code]-Tag.

Aqua

Ok, sollte jetzt halbwegs aussehen.