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
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 ? !
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
krass 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 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
oh sorry leute,
ich wollte den thread jetz nich zu meiner privatnachhilfe machen
Trotzdem nochmal vielen dank an euch!
warum denn nich?
weiß ned
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