Lösungen

Werbung
Introduction to
Data and Knowledge Engineering
Sommersemester 2014
Tobias Freudenreich
Tutorium 6: SQL
Lösungsvorschlag
Aufgabe T-6.1: Multiple Choice
Gegeben ist folgende SQL-Anfrage für die Tabellen A und B: SELECT * FROM A,B
Welche der folgenden Operationen wird hier ausgeführt?
o
o

o
o
o
Equijoin
Left Join
Kartesisches Produkt
Full Outer Join
Natural Join
Right Join
Begründung:
SELECT * FROM A, B kann auch geschrieben werden als SELECT A.*, B.* FROM A, B Dabei werden
also alle Spalten der Tabellen A und B in die Ergebnistabelle projiziert und keine weiteren
Selektionsbedingungen angewendet.
Um ein Equijoin zu erhalten muss zusätzlich in der WHERE-Klausel bestimmt werden, welche Spalten
gleich sein müssen. Bsp.: SELECT * FROM A, B WHERE A.id = B.id
Aufgabe T-6.2: SQL als DDL
Die Datenbank eines Schuh-Versandhauses besteht aus verschiedenen Tabellen. Für vier von ihnen
sind im Folgenden die Relationen-Schemata angegeben. Weitere Relationen wie etwa Kunde oder
Warenkorb gehören ebenfalls dazu, werden hier aber ausgelassen.
Hersteller
Name
PK
X
FK
Land
Stadt
Lager
ProduktName Größe Anzahl
PK
X
X
FK Produkt.Name
Stand: 04.06.2014 12:52
Produkt
Name
PK
X
FK
Hersteller
Preis
Hersteller.Name
Bestellposten
Bestellung Name
PK
X
X
FK
Produkt.Name
Größe Anzahl
X
1
a) Legen Sie mittels SQL Tabellen für diese vier Schemata an. Überlegen Sie selbst welche
Wertebereiche die Attribute jeweils erhalten.
Lösungsvorschlag:
CREATE TABLE Hersteller (
Name varchar(20) NOT NULL,
Land varchar(20) NOT NULL,
Stadt varchar(20) NOT NULL,
PRIMARY KEY (Name)
);
CREATE TABLE Produkt (
Name varchar(20) NOT NULL,
Hersteller varchar(20) NOT NULL,
Preis decimal(6,2) NOT NULL,
PRIMARY KEY (Name),
FOREIGN KEY ( Hersteller ) REFERENCES Hersteller ( Name )
);
CREATE TABLE Lager (
ProduktName varchar(20) NOT NULL,
Groesse int NOT NULL, Anzahl int NOT NULL,
PRIMARY KEY (ProduktName,Groesse),
FOREIGN KEY ( ProduktName ) REFERENCES Produkt( Name )
);
CREATE TABLE Bestellposten (
Bestellung int NOT NULL, Name varchar(20) NOT NULL,
Groesse int NOT NULL, Anzahl int NOT NULL,
PRIMARY KEY (Bestellung,Name,Groesse),
CONSTRAINT fk_ProduktName FOREIGN KEY ( Name ) REFERENCES
Produkt( Name )
);
Hinweis: Die Klausel CONSTRAINT vor FOREIGN KEY ist optional und erlaubt eine interne
Benennung des Fremdschlüssels (genauer gesagt sind Fremndschlüssel eine spezielle Form von
Constraints und man benennt den Constraint).
Stand: 04.06.2014 12:52
2
b) Entfernen Sie die Attribute des Primary-Key der Tabelle Bestellposten und legen Sie sie
anschließend wieder an
Lösungsvorschlag:
FK entfernen, PK entfernen, Attribute entfernen:
ALTER TABLE Bestellposten DROP FOREIGN KEY fk_ProduktName
ALTER TABLE Bestellposten DROP PRIMARY KEY
ALTER TABLE Bestellposten DROP COLUMN Bestellung
ALTER TABLE Bestellposten DROP COLUMN Name
ALTER TABLE Bestellposten DROP COLUMN Groesse
Attribute, PK, FK wieder anlegen:
ALTER TABLE Bestellposten ADD Bestellung INT NOT NULL
ALTER TABLE Bestellposten ADD Name VARCHAR( 20 ) NOT NULL
ALTER TABLE Bestellposten ADD Groesse INT NOT NULL
ALTER TABLE Bestellposten ADD PRIMARY KEY ( Bestellung , Name , Groesse)
ALTER TABLE Bestellposten ADD CONSTRAINT fk_ProduktName FOREIGN
KEY ( Name ) REFERENCES Produkt( Name )
Hinweis: ADD … NOT NULL ohne DEFAULT ist eigentlich nicht erlaubt (welcher Wert soll denn sonst
in den hinzugefügten „Zellen“ stehen?). Da es sich allerdings um das Hinzufügen des Primärschlüssels
handelt, muss man davon ausgehen, dass die Tabelle leer ist (sonst könnte man nämlich auch nicht
NULL Werte einfügen oder mit DEFAULT arbeiten).
Stand: 04.06.2014 12:52
3
Aufgabe T-6.3: SQL als DML
Die angelegten Tabellen des Online-Schuhgeschäfts enthalten nun folgende Daten:
Hersteller
Name
Bally
Camper
Reebok
Mephisto
Land
Schweiz
Spanien
USA
Frankreich
Lager
ProduktName
Kaisy 8200
Kaisy 8200
Evaluate Trainer
Evaluate Trainer
CA 226130990
Dianetten
Dianetten
Edesio 1965
Edesio 1965
Edesio 1965
Paris Runner
Delarosa
Delarosa
Delarosa
Größe
37
38
41
43
39
45
44
41
42
43
42
36
37
38
Stadt
Caslano
Inca
Canton MA
Sarrebourg
Anzahl
9
16
47
11
28
22
42
57
63
74
7
66
87
85
Produkt
Name
Kaisy 8200
Evaluate Trainer
CA 226130990
Dianetten
Edesio 1965
Paris Runner
CA 22225090
Delarosa
Bestellposten
Bestellung
3297
3297
7982
7982
Name
Evaluate Trainer
Dianetten
Kaisy 8200
Delarosa
Hersteller
Mephisto
Reebok
Camper
Bally
Mephisto
Reebok
Camper
Bally
Preis
99,90
49,95
135,00
220,00
135,00
74,95
139,90
350,00
Größe
43
44
37
37
Anzahl
1
1
1
1
Formulieren Sie in SQL folgende Anfragen:
a) Alle Produkte des Herstellers Reebok mit der Schuhgröße 42
SELECT P.* FROM Produkt P, Lager L WHERE L.ProduktName = P.Name AND P.Hersteller =
’Reebok’ AND L.Größe = 42
b) Schuhgrößen aller Produkte, von denen weniger als 12 Exemplare im Lager vorhanden sind.
SELECT DISTINCT Größe FROM Lager WHERE Anzahl < 12
c) Namen aller Hersteller, die nur Produkte unter 125 EUR anbieten (alle Preise werden in EUR
angegeben)
SELECT Hersteller FROM Produkt
GROUP BY Hersteller HAVING MAX(Preis) < 125
Stand: 04.06.2014 12:52
4
Aufgabe T-6.4: SQL als DML
Gegeben sind folgende Ergebnisse von SQL-Anfragen. Geben Sie die entsprechenden Anfragen in SQL
an, mit denen die Ergebnisse erzeugt werden können.
a)
ProduktName
Dianetten
Edesio 1965
Edesio 1965
Edesio 1965
Delarosa
Delarosa
Delarosa
Größe
44
41
42
43
36
37
38
b)
Name
Evaluate Trainer
Paris Runner
Hersteller
Reebok
Reebok
c)
Name
CA 226130990
Dianetten
Edesio 1965
CA 22225090
Delarosa
Preis
135,00
220,00
135,00
139,90
350,00
Anzahl
42
57
63
74
66
87
85
Preis
49,95
74,95
Lösungsvorschlag:
SELECT * FROM Lager
WHERE Anzahl > 30
AND ProduktName <> ’Evaluate Trainer’
Lösungsvorschlag:
SELECT * FROM Produkt
WHERE Preis < 80
Lösungsvorschlag:
SELECT Name, Preis FROM Produkt
WHERE Preis > 100
Hinweis: Die Lösungen sind keinesfalls eindeutig.
Aufgabe T-6.5: SQL als DML: Aggregation
Formulieren Sie in SQL folgende Anfragen:
a) Namen aller Produkte, gruppiert nach Hersteller
SELECT Name, Hersteller
FROM Produkt ORDER BY Hersteller
b) Gesamtwert aller verfügbaren Waren im Lager
SELECT SUM(L.Anzahl * P.Preis) AS LagerSumme
FROM Lager L, Produkt P
WHERE L.ProduktName = P.Name
c) Name aller Produkte, von denen mehr als zwei Größen lagern
SELECT ProduktName
FROM Lager
GROUP BY ProduktName
HAVING COUNT (DISTINCT Größe) > 2
Stand: 04.06.2014 12:52
5
Herunterladen