SQL


hab doch noch ne Frage dazu.
und zwar zu dem Fremdschlüssel. Wieso lautete der Bestellung[Bestellung] ? müsste de nicht id[bestellung] lauten?


Fremdschlüssel darfst du anders bennen wenn es Sinn macht. Ein Typischer Falls ist zB bei den Relationen

Mensch (Name, Alter, …)

Spieler (Name, Verein, Name[Mensch], …)

(hier jetzt der Künstler Name vom Spieler, sonst ist das ganze wieder ein bisschen sehr redundant… :D)

Die Tabelle Spieler hat jetzt zwei mal das Attribut Name → doof → anders bennen :smiley:


achso.

Aber es is auf jedenfall sehr verwirrend!

Danke dir!

und nochwas:

Listen Sie alle Produkte auf, die am 7. April 2007 (‘07.04.07’) im Zuge einer
Lagerbestellung bestellt wurden. Die Ausgabe soll nach Einkaufspreis absteigend sortiert
werden.

SELECT produkt.produktbeschreibung
, produkt.einkaufspreis
FROM produkt_lager_lagerbestellung
JOIN produkt
USING(artikelnummer)
WHERE produkt_lager_lagerbestellung.datum = ‘07.04.07’
ORDER BY produkt.einkaufspreis DESC;

geht das auch ohne JOIN ?

also so, dass man quasi einfach:FROM produkt_lager_lagerbestellung, produkt macht?


Ja, dann kommt aber noch was ins where. Das ganze ist dann trotzdem ein JOIN nur ohne das Wort join :>

SELECT p.produktbeschreibung, p.einkaufspreis
FROM produkt_lager_lagerbestellung pll, Produkt p
WHERE pll.datum = ‘07.04.07’ AND pll.artikelnummer = p.artikelnummer
ORDER BY p.einkaufspreis DESC;

kP ob die PK jetzt bei p und pll so heissen.


Ja das geht immer,

FROM produkt_lager_lagerbestellung
JOIN produkt
USING(artikelnummer)

entspricht

From produkt_lager_lagerbestellung pl, produkt p
where pl.artikelnummer = p.artikelnummer

/edit

bzw der Unterschied liegt darin dass du bei dem join „Artikelnummer“ nur einmal in deiner Tabelle hast und bei dem Kreuzprodukt „Artikelnummer“ zwei mal hast.


also ich hatte es so wie du jetz geschrieben hast pr0wl aber ohne “pll.artikelnummer = p.artikelnummer”

Wieso muss das denn dahin, was macht das denn für nen Unterschied?

EDIT: Also gehts doch nicht ohne das JOIN? okay. ich versteh nur nicht wieso manchmal JOIN benutzt wird und manchmal einfach bei das FROM 2 Sachen geschrieben werden.


Wie coMar geschrieben hat:

FROM produkt_lager_lagerbestellung
JOIN produkt
USING(artikelnummer)

entspricht

From produkt_lager_lagerbestellung pll, produkt p
where pll.artikelnummer = p.artikelnummer

das ist das (gleiche|selbe) :>

beim join hängst du ja die tupel mit den gleichen artikelnummern zusammen ( aus beiden tabellen)

das selbe machst du doch bei where auch. erst kreuzprodukt mit from und danach mit where die raussuchen wo die artikelnummern gleich sind.


Wenn du hinschreibst:
FROM tableA, tableB
, dann heißt das für sqlite z.B.: “Nimm dir mal tableA und tableB her.”
Weil sqlite aber nicht weiß, wie die beiden tables miteinander verknüpft werden sollen, macht sqlite das Kreuprodukt daraus, also ALLE möglichen Kombinationen.

Was aber damit gemacht werden soll ist unklar. Anders wäre es, wenn da stünde:
FROM tableA JOIN tableB USING(attributC)
, dann wüsste sqlite: “Ah, ich soll also tableA nehmen und tableB und die beiden dann über attributC vernknüpfen - geht klar, Chef!”

Um aber an das Beispiel oben anzuknüpfen: Jetzt musst du sqlite noch sagen, dass du eigentlich gar nicht das Kreuzprodukt haben willst, sondern nur die Einträge von tableA sollen mit tableB verknüpft sein, die das gleiche attributC haben. Deswegen schränkst du ein mit:
WHERE tableA.attributC = tableB.attributC


Erstellen Sie eine Liste aller Kunden und dem zugehörigen Gewinn, den der Kunde uns
gebracht hat. Die Liste ist nach Gewinn absteigend zu sortieren. Gewinn ist bei uns die
Differenz zwischen Verkaufspreis und Einkaufspreis (je Artikel gedacht; für den Kunden
als ganzes kommt die Menge aller Artikel und die jeweilig bestellte Anzahl in die
Verrechnung hinzu). Erstellen Sie zuerst eine View, welche alle Produkte mit
Artikelnummer und Gewinn beinhaltet. Nutzen Sie diese View dann für die eigentliche
Aufgabe. Ausgabe sollen Kundendaten und der Gewinn sein. Am Ende sollten Sie die
angelegte View wieder löschen, da diese nur temporär der Vereinfachung dient.

vorname nachname strasse hausnummer plz stadt gewinn

CREATE VIEW gewinn AS
SELECT artikelnummer
, preis - einkaufspreis AS gewinn
FROM produkt;
SELECT vorname
, nachname
, strasse
, hausnummer
, plz
, stadt
, SUM(anzahl * gewinn) AS gewinn
FROM gewinn g
, kunde k
, bestellung b
, bestellung_produkt bp
WHERE k.kreditkartennummer = b.kunde
AND b.id = bp.bestellung
AND bp.artikelnummer = g.artikelnummer
GROUP BY kreditkartennummer –- weil es der PK ist!
– Der Rest kommt in die Projektion:
, vorname
, nachname
, strasse
, hausnummer
, plz
, stadt
ORDER BY gewinn DESC;

Versth ich das hier richtig? Geht es hier bei dem GROUP BY darum, dass da alles dabei geschrieben wird, was nacher in die Tabelle soll?

und die Kreditkartennummer weil die primärschlüssel von Kunde ist?

Wofür braucht man denn hier die Relation “bestellung” (FROM bestellung) ?
man kriegt doch alles aus kunde und produkt oder nich?

aus kunde kriegt man:

vorname
, nachname
, strasse
, hausnummer
, plz
, stadt

aus produkt:
einkaufspreis
preis

und aus bestellung_produkt die anzahl

aber produkt wird gar nicht benutzt ? ! :confused:


Ganz einfach:

Du brauchst bestellung, weil du kunde und Produkt nicht miteinander verbinden kannst. Schön, du weißt alles über deinen Kunden, und du weißt alles über ein Produkt, aber du hast keine Ahnung, welche Produkte welcher Kunde gekauft hat.


Kunden Rechnungen (mit Fremdschlüssel auf Kunden Name)
Name | Umsatz rNr | Betrag | Name
aa | 100 01 | 20 | aa
bb | 200 02 | 20 | bb
cc | 300 03 | 30 | aa
dd | 400

from Kunden k, Rechnungen r

aa | 100 | 01 | 20 | aa
aa | 100 | 02 | 20 | bb
aa | 100 | 03 | 30 | aa
bb | 200 | 01 | 20 | aa
bb | 200 | 02 | 20 | bb
bb | 200 | 03 | 30 | aa
cc | 300 | 01 | 20 | aa
cc | 300 | 02 | 20 | bb
cc | 300 | 03 | 30 | aa
dd | 400 | 01 | 20 | aa
dd | 400 | 02 | 20 | bb
dd | 400 | 03 | 30 | aa

where k.name = r.name

aa | 100 | 01 | 20 | aa
aa | 100 | 03 | 30 | aa
bb | 200 | 02 | 20 | bb

hier wurde zuerst das Kreuzprodukt gebildet und dann selektiert


from kunden join rechnungen USING (name)

aa | 100 | 01 | 20
aa | 100 | 03 | 30
bb | 200 | 02 | 20

hier wurde nur nach passenden Paaren aus beiden Tabellen gesucht und der gemeinsame/gleichnamige Fremdschlüssel einfach weggelassen


from kunden k join rechnungen r ON k.name = r.name

aa | 100 | 01 | 20 | aa
aa | 100 | 03 | 30 | aa
bb | 200 | 02 | 20 | bb

hier wurde wieder nach passenden Paaren aus beiden Tabellen gesucht. Das benutzt man typischer weise wenn der Fremdschlüssel einen anderen Namen besitzt als der referenzierte Primärschlüssel, deshalb existiert auch die gleiche Spalte wie beim Kreuzprodukt noch zwei mal.


das kenn ich doch woher :smiley:


krass :smiley: jetz gibt es einen Sinn. thx!!

also sag ich dem quasi nochmal im Where was ich überhaupt sehen will.

aber wenn ichs über JOIN USING attribut blubb dann muss ich es nicht im WHERE erst sagen, was ich haben will, weil es dann gleich das richtige tut?


okay dann gibt bestellung schon mal nen Sinn :wink: aber wieso fehlt FROM produkt? woher kriegen die die Info über den gewinn? etwa schon aus dem view und deswegen braucht man das nich mehr?



Ja su dem View:
SELECT artikelnummer
preis - einkaufspreis AS GEWINN (<—)

/edit meh hatte sich ja schon erledigt, ich soll eh mitm Hund raus :slight_smile:


oh sorry leute,
ich wollte den thread jetz nich zu meiner privatnachhilfe machen :blush:

Trotzdem nochmal vielen dank an euch!


warum denn nich?


weiß ned :slight_smile:

is ja auch ned unbedingt sinn und zweck der sache euch da so mit meinen probs zu belagern ^^

EDIT:
ich hoff SQL is das schlimmste bei der Klausur


doch, das ist der sinn des forums