Lerninhalte finden
Features
Entdecke
© StudySmarter 2024, all rights reserved.
In einer Datenbank für ein E-Commerce-System gibt es die folgenden Tabellen:
Erstelle eine SQL-Abfrage, die den Namen und die Email-Adresse aller Kunden zusammen mit der Anzahl ihrer Bestellungen ausgibt. Verwendet inner Joins zwischen den Tabellen Kunden und Bestellungen.
Lösung:
Um den Namen und die E-Mail-Adresse aller Kunden zusammen mit der Anzahl ihrer Bestellungen zu erhalten, kannst Du eine SQL-Abfrage mit einem INNER JOIN zwischen den Tabellen Kunden und Bestellungen verwenden. Die Anzahl der Bestellungen wird durch die Verwendung der Aggregatfunktion COUNT ermittelt.
Hier ist die SQL-Abfrage:
SELECT k.name, k.email, COUNT(b.bestellungsID) AS anzahl_bestellungen FROM Kunden k INNER JOIN Bestellungen b ON k.kundenID = b.kundenID GROUP BY k.name, k.email;
In dieser Abfrage wird:
Schreibe eine SQL-Abfrage, die den Artikelname, Kategorie, und die Summe der verkauften Menge für jeden Artikel ausgibt. Verwende hierfür Joins zwischen den Tabellen Bestellpositionen und Artikel sowie eine Aggregatfunktion.
Lösung:
Um den Artikelname, die Kategorie und die Summe der verkauften Menge für jeden Artikel zu erhalten, kannst Du eine SQL-Abfrage mit einem JOIN zwischen den Tabellen Bestellpositionen und Artikel verwenden. Die Summe der verkauften Menge wird mittels der Aggregatfunktion SUM ermittelt.
Hier ist die SQL-Abfrage:
SELECT a.name, a.kategorie, SUM(bp.menge) AS gesamt_menge FROM Artikel a INNER JOIN Bestellpositionen bp ON a.artikelID = bp.artikelID GROUP BY a.name, a.kategorie;
In dieser Abfrage wird:
Erzeuge eine SQL-Abfrage, die die Namen der Kunden und die Gesamtpreise ihrer Bestellungen enthält. Nutze dabei eine verschachtelte Sub-Abfrage, um den Gesamtpreis jeder Bestellung zu berechnen.
Lösung:
Um die Namen der Kunden und die Gesamtpreise ihrer Bestellungen zu erhalten, kannst Du eine verschachtelte Sub-Abfrage verwenden, um den Gesamtpreis jeder Bestellung zu berechnen. Anschließend verknüpfst Du diese Resultate mit den Kundendaten.
Hier ist die SQL-Abfrage:
SELECT k.name, (SELECT SUM(bp.menge * bp.preis) FROM Bestellpositionen bp WHERE bp.bestellungsID = b.bestellungsID) AS gesamtpreis_bestellung FROM Kunden k INNER JOIN Bestellungen b ON k.kundenID = b.kundenID;
In dieser Abfrage wird:
Formuliere eine SQL-Abfrage, die Artikel identifiziert, die nicht in Bestellungen enthalten sind. Verwende hierzu eine Sub-Abfrage, um alle Artikel zu finden, die keine Verknüpfung zu einer Bestellposition haben.
Lösung:
Um Artikel zu identifizieren, die nicht in Bestellungen enthalten sind, kannst Du eine Sub-Abfrage verwenden, um alle Artikel zu finden, die keine Verknüpfung zu einer Bestellposition haben. Dies kann mit der Verwendung von NOT IN oder LEFT JOIN und IS NULL erreicht werden. Hier zeige ich beide Ansätze.
Ansatz mit NOT IN:
SELECT a.name, a.kategorie FROM Artikel a WHERE a.artikelID NOT IN (SELECT bp.artikelID FROM Bestellpositionen bp);
In dieser Abfrage wird:
Ansatz mit LEFT JOIN und IS NULL:
SELECT a.name, a.kategorie FROM Artikel a LEFT JOIN Bestellpositionen bp ON a.artikelID = bp.artikelID WHERE bp.artikelID IS NULL;
In dieser Abfrage wird:
Erstellung und Verwaltung von Datenbankobjekten: Du arbeitest als Datenbankadministrator für ein Online-Shop-System. Das System benötigt verschiedene Datenbankobjekte wie Tabellen, Views, Indizes, Prozeduren und Trigger, um die Daten effizient zu speichern, zu verarbeiten und darauf zuzugreifen. Dabei sollst Du auch sicherstellen, dass nur autorisierte Benutzer Zugriff auf bestimmte Daten oder Aktionen haben. Entwickle zu diesem Kontext mehrere DDL- und DML-Anweisungen und zeige, wie Benutzerrechte verwaltet werden.
Tabellen und Indizes:Erstelle eine Tabelle namens Produkte
mit den folgenden Spalten:
ProduktID
(Primärschlüssel, Ganzzahl, automatisch inkrementiert)Name
(Text, maximal 100 Zeichen)Preis
(Dezimal)Lagerbestand
(Ganzzahl)Name
, um die Suche nach Produkten zu beschleunigen.\rCREATE TABLE Produkte(\r ProduktID INT AUTO_INCREMENT PRIMARY KEY,\r Name VARCHAR(100),\r Preis DECIMAL(10, 2),\r Lagerbestand INT\r);\r\rCREATE INDEX idx_name ON Produkte(Name);\r
Lösung:
Erstellung und Verwaltung von Datenbankobjekten: Du arbeitest als Datenbankadministrator für ein Online-Shop-System. Das System benötigt verschiedene Datenbankobjekte wie Tabellen, Views, Indizes, Prozeduren und Trigger, um die Daten effizient zu speichern, zu verarbeiten und darauf zuzugreifen. Dabei sollst Du auch sicherstellen, dass nur autorisierte Benutzer Zugriff auf bestimmte Daten oder Aktionen haben. Entwickle zu diesem Kontext mehrere DDL- und DML-Anweisungen und zeige, wie Benutzerrechte verwaltet werden.Tabellen und Indizes:Erstelle eine Tabelle namens Produkte
mit den folgenden Spalten:
ProduktID
(Primärschlüssel, Ganzzahl, automatisch inkrementiert)Name
(Text, maximal 100 Zeichen)Preis
(Dezimal)Lagerbestand
(Ganzzahl)Name
, um die Suche nach Produkten zu beschleunigen.CREATE TABLE Produkte( ProduktID INT AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(100), Preis DECIMAL(10, 2), Lagerbestand INT);CREATE INDEX idx_name ON Produkte(Name);
Views and Prozeduren:Erstelle eine View namens ProduktDetails
, die alle Produkte mit einem Lagerbestand von weniger als 10 Zeilen anzeigt. Implementiere anschließend eine gespeicherte Prozedur VerkaufeProdukt
, die den Lagerbestand eines Produkts um eine bestimmte Menge reduziert.
\rCREATE VIEW ProduktDetails AS\rSELECT * FROM Produkte WHERE Lagerbestand < 10;\r\rDELIMITER //\rCREATE PROCEDURE VerkaufeProdukt(\r IN p_ProduktID INT,\r IN p_Menge INT\r)\rBEGIN\r UPDATE Produkte\r SET Lagerbestand = Lagerbestand - p_Menge\r WHERE ProduktID = p_ProduktID;\rEND;//\rDELIMITER ;\r
Lösung:
Erstellung und Verwaltung von Datenbankobjekten: Du arbeitest als Datenbankadministrator für ein Online-Shop-System. Das System benötigt verschiedene Datenbankobjekte wie Tabellen, Views, Indizes, Prozeduren und Trigger, um die Daten effizient zu speichern, zu verarbeiten und darauf zuzugreifen. Dabei sollst Du auch sicherstellen, dass nur autorisierte Benutzer Zugriff auf bestimmte Daten oder Aktionen haben. Entwickle zu diesem Kontext mehrere DDL- und DML-Anweisungen und zeige, wie Benutzerrechte verwaltet werden.Views und Prozeduren:Erstelle eine View namens ProduktDetails
, die alle Produkte mit einem Lagerbestand von weniger als 10 Zeilen anzeigt. Implementiere anschließend eine gespeicherte Prozedur VerkaufeProdukt
, die den Lagerbestand eines Produkts um eine bestimmte Menge reduziert.
CREATE VIEW ProduktDetails ASSELECT * FROM Produkte WHERE Lagerbestand < 10;DELIMITER //CREATE PROCEDURE VerkaufeProdukt( IN p_ProduktID INT, IN p_Menge INT)BEGIN UPDATE Produkte SET Lagerbestand = Lagerbestand - p_Menge WHERE ProduktID = p_ProduktID;END//DELIMITER ;
Trigger und Zugriffsrechte:Implementiere einen Trigger namens CheckLagerbestand
, der ausgeführt wird, wenn ein Produkt verkauft wird, um sicherzustellen, dass der Lagerbestand nicht negativ wird. Setze dann Zugriffsrechte so, dass nur Benutzer mit dem Namen Manager
die Prozedur VerkaufeProdukt
ausführen dürfen.
\rDELIMITER //\rCREATE TRIGGER CheckLagerbestand\rBEFORE UPDATE ON Produkte\rFOR EACH ROW\rBEGIN\r IF NEW.Lagerbestand < 0 THEN\r SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Lagerbestand darf nicht negativ sein';\r END IF;\rEND;//\rDELIMITER ;\r\rGRANT EXECUTE ON PROCEDURE VerkaufeProdukt TO 'Manager';\rREVOKE EXECUTE ON PROCEDURE VerkaufeProdukt FROM PUBLIC;\r
Lösung:
Erstellung und Verwaltung von Datenbankobjekten: Du arbeitest als Datenbankadministrator für ein Online-Shop-System. Das System benötigt verschiedene Datenbankobjekte wie Tabellen, Views, Indizes, Prozeduren und Trigger, um die Daten effizient zu speichern, zu verarbeiten und darauf zuzugreifen. Dabei sollst Du auch sicherstellen, dass nur autorisierte Benutzer Zugriff auf bestimmte Daten oder Aktionen haben. Entwickle zu diesem Kontext mehrere DDL- und DML-Anweisungen und zeige, wie Benutzerrechte verwaltet werden.Trigger und Zugriffsrechte:Implementiere einen Trigger namens CheckLagerbestand
, der ausgeführt wird, wenn ein Produkt verkauft wird, um sicherzustellen, dass der Lagerbestand nicht negativ wird. Setze dann Zugriffsrechte so, dass nur Benutzer mit dem Namen Manager
die Prozedur VerkaufeProdukt
ausführen dürfen.
\rDELIMITER //CREATE TRIGGER CheckLagerbestandBEFORE UPDATE ON ProdukteFOR EACH ROWBEGIN IF NEW.Lagerbestand < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Lagerbestand darf nicht negativ sein'; END IF;END//DELIMITER ;GRANT EXECUTE ON PROCEDURE VerkaufeProdukt TO 'Manager';REVOKE EXECUTE ON PROCEDURE VerkaufeProdukt FROM PUBLIC;
Gegeben sei folgendes ER-Diagramm einer Universität, das die Beziehung zwischen Professoren, Studenten und Kursen beschreibt. Ein Professor kann mehrere Kurse unterrichten, und ein Kurs kann von mehreren Professoren unterrichtet werden (N:M Beziehung). Studenten können an mehreren Kursen teilnehmen und ein Kurs hat viele Studenten (N:M Beziehung). Die Entitäten Professor, Student und Kurs haben jeweils die Attribute Name, Matrikelnummer und Kursnummer als Primärschlüssel. Das ER-Diagramm sieht wie folgt aus:
Erstelle ein relationales Modell basierend auf dem gegebenen ER-Diagramm. Definiere die Tabellenstrukturen, indem Du alle Primärschlüssel, Fremdschlüssel und Attribute angibst. Nutze folgende Darstellungsform:
'Tabelle (Attribut1, Attribut2, ...)'
Lösung:
Um das gegebene ER-Diagramm der Universität in ein relationales Modell zu überführen, müssen wir die Tabellenstrukturen definieren, die alle Primärschlüssel, Fremdschlüssel und Attribute beinhalten. Folgende Tabellen sind notwendig:
Professor (Name)
Student (Matrikelnummer)
Kurs (Kursnummer)
Unterrichtet (Name, Kursnummer)
Teilnimmt (Matrikelnummer, Kursnummer)
Hierbei sind:
Angenommen, ein neuer Kurs wird eingeführt und dieser Kurs wird von zwei neuen Professoren unterrichtet. Zudem melden sich fünf Studenten für diesen Kurs an. Erstelle zu diesem Szenario eine SQL-Anweisung, die die entsprechenden Datensätze in die relationalen Tabellen einfügt. Gehe davon aus, dass alle neuen Einträge gültige Werte und passende Primär- und Fremdschlüssel besitzen. Nutze folgende Darstellungsform für die SQL-Befehle:
'INSERT INTO ... VALUES ...;'
Lösung:
Um die angegebenen Daten in die relationalen Tabellen einzufügen, nutzen wir SQL INSERT
-Anweisungen. Dabei gehen wir davon aus, dass die notwendigen Primär- und Fremdschlüssel korrekt gesetzt sind.
Hier sind die SQL-Befehle für das beschriebene Szenario:
INSERT INTO Professor (Name) VALUES ('Prof. Dr. Müller');
INSERT INTO Professor (Name) VALUES ('Prof. Dr. Schmidt');
INSERT INTO Kurs (Kursnummer) VALUES ('KURS1001');
INSERT INTO Unterrichtet (Name, Kursnummer) VALUES ('Prof. Dr. Müller', 'KURS1001');
INSERT INTO Unterrichtet (Name, Kursnummer) VALUES ('Prof. Dr. Schmidt', 'KURS1001');
INSERT INTO Student (Matrikelnummer) VALUES ('S1234');
INSERT INTO Student (Matrikelnummer) VALUES ('S1235');
INSERT INTO Student (Matrikelnummer) VALUES ('S1236');
INSERT INTO Student (Matrikelnummer) VALUES ('S1237');
INSERT INTO Student (Matrikelnummer) VALUES ('S1238');
INSERT INTO Teilnimmt (Matrikelnummer, Kursnummer) VALUES ('S1234', 'KURS1001');
INSERT INTO Teilnimmt (Matrikelnummer, Kursnummer) VALUES ('S1235', 'KURS1001');
INSERT INTO Teilnimmt (Matrikelnummer, Kursnummer) VALUES ('S1236', 'KURS1001');
INSERT INTO Teilnimmt (Matrikelnummer, Kursnummer) VALUES ('S1237', 'KURS1001');
INSERT INTO Teilnimmt (Matrikelnummer, Kursnummer) VALUES ('S1238', 'KURS1001');
Für eine Universitätsdatenbank müssen wir eine Struktur entwerfen, um Informationen über Studenten (Student), Kurse (Kurs) und Einschreibungen (Einschreibung) zu verwalten.
Annahmen:
(a) Entwerfe ein relationales Schema für die Universitätsdatenbank einschließlich aller relevanten Tabellen und ihrer Attribute. Bestimme und kennzeichne die Primärschlüssel, Fremdschlüssel und weitere Constraints (wie \texttt{NOT NULL}, \texttt{UNIQUE} und \texttt{DEFAULT}).
'CREATE TABLE Student ( Matrikelnummer INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, Geburtsdatum DATE NOT NULL);CREATE TABLE Kurs ( Kursnummer INT PRIMARY KEY, Kursname VARCHAR(50) NOT NULL, Dozent VARCHAR(50) NOT NULL);CREATE TABLE Einschreibung ( Matrikelnummer INT, Kursnummer INT, Einschreibungsdatum DATE DEFAULT CURRENT_DATE, PRIMARY KEY (Matrikelnummer, Kursnummer), FOREIGN KEY (Matrikelnummer) REFERENCES Student(Matrikelnummer), FOREIGN KEY (Kursnummer) REFERENCES Kurs(Kursnummer));'
Lösung:
Für die Gestaltung des relationalen Schemas der Universitätsdatenbank können wir folgende Tabellen und Attribute verwenden:
Hier ist das entwerfene relationale Schema:
'CREATE TABLE Student ( Matrikelnummer INT PRIMARY KEY, Name VARCHAR(50) NOT NULL, Geburtsdatum DATE NOT NULL);CREATE TABLE Kurs ( Kursnummer INT PRIMARY KEY, Kursname VARCHAR(50) NOT NULL, Dozent VARCHAR(50) NOT NULL);CREATE TABLE Einschreibung ( Matrikelnummer INT, Kursnummer INT, Einschreibungsdatum DATE DEFAULT CURRENT_DATE, PRIMARY KEY (Matrikelnummer, Kursnummer), FOREIGN KEY (Matrikelnummer) REFERENCES Student(Matrikelnummer), FOREIGN KEY (Kursnummer) REFERENCES Kurs(Kursnummer));'
Hier sind die Details zu den Primärschlüsseln, Fremdschlüsseln und weiteren Constraints:
(b) Prüfe, ob das von Dir entworfene Schema in der dritten Normalform (3NF) ist. Begründe Deine Antwort.
Lösung:
Die dritte Normalform (3NF) besagt, dass eine Relation in der zweiten Normalform (2NF) sein muss und zusätzlich keinerlei transitive Abhängigkeiten zwischen Nicht-Schlüsselattributen bestehen dürfen. Damit eine Relation in der zweiten Normalform (2NF) ist, muss sie zunächst in der ersten Normalform (1NF) sein, d.h., alle Attribute müssen atomar sein, und sie darf keine Einfüge-, Lösch- oder Änderungsanomalien aufweisen.
Gehen wir unser entworfenes Schema durch, um zu prüfen, ob es die Anforderungen der dritten Normalform erfüllt:
Daher ist das entworfene Schema in der dritten Normalform (3NF).
(c) Betrachte das Attribut 'Einschreibungsdatum' in der Tabelle Einschreibung. Welche Rolle spielt der \texttt{DEFAULT}-Constraint in Bezug auf dieses Attribut und wie könnte dies in einem praktischen Anwendungsfall nützlich sein? Erläutere Dein Beispiel in einem Szenario.
Lösung:
Der DEFAULT-Constraint in der Datenbank wird verwendet, um einen Standardwert für ein Attribut festzulegen, wenn kein Wert angegeben wird. In unserem Fall wurde für das Attribut Einschreibungsdatum in der Tabelle Einschreibung der Standardwert CURRENT_DATE gesetzt. Dies bedeutet, dass wenn ein neuer Datensatz in die Tabelle Einschreibung eingefügt wird und kein Wert für Einschreibungsdatum angegeben wird, das heutige Datum standardmäßig als Wert verwendet wird.
Angenommen, ein Student, Max Mustermann, meldet sich am 12. Oktober 2023 für den Kurs „Datenbanken“ an. Der Eintrag in die Tabelle Einschreibung erfolgt durch die Verwaltungssoftware, die folgenden SQL-Befehl ausführt:
INSERT INTO Einschreibung (Matrikelnummer, Kursnummer) VALUES (12345, 101);
Dank des DEFAULT-Constraints wird das Einschreibungsdatum automatisch auf das heutige Datum gesetzt, also den 12. Oktober 2023, ohne dass dieses spezifisch angegeben werden muss.
Der Vorteil dieses Ansatzes ist:
Der DEFAULT-Constraint für das Attribut Einschreibungsdatum stellt sicher, dass Eingaben, die ohne ein explizit angegebenes Einschreibungsdatum erfolgen, dennoch mit dem aktuellen Datum versehen werden. Dies ist besonders nützlich in Szenarien wie automatischen Einschreibungsprozessen, bei denen eine sofortige und korrekte Datenspeicherung entscheidend ist.
Mit unserer kostenlosen Lernplattform erhältst du Zugang zu Millionen von Dokumenten, Karteikarten und Unterlagen.
Kostenloses Konto erstellenDu hast bereits ein Konto? Anmelden