Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

SQL Grundkurs 2: Aufgaben und Lösungen

Beispiel 14: Kriterien über Unterabfrage

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Löschen Sie alle Bestellungen, die noch nicht abgeschlossen wurden. Das sind jene, die noch den Statuswert 1 aufweisen. Zuvor müssen allerdings die Positionen dieser Bestellungen gelöscht werden.

Transkript

In diesem Beispiel möchten wir Bestellungen, die noch nicht abgeschlossen sind, wieder aus unseren Tabellen löschen. Nicht abgeschlossene Bestellungen, das sind jene, die in der Spalte "Status" noch den Wert "1" aufweisen. Auch hier müssen wir allerdings in der zweiten Tabelle, der Tabelle "Bestellpositionen", die entsprechenden Positionen zuerst löschen, denn sonst würde die referenzielle Integrität das Löschen dieser Bestellungen verhindern. Allerdings müssen wir hier die entsprechenden Bestellnummern, die gelöscht werden sollen in den Bestellpositionen, iüber eine Unterabfrage herausfinden. Denn in den Bestellpositionen finden wir den Status ja nicht. Das heißt, wir müssen in der "WHERE"-Klausel für das Löschen auf Informationen zurückgreifen, die wir in einer anderen Tabelle finden. Da es beim Löschen von Daten bei der Delete-Anweisung keinen Join gibt, müssen wir hier auf eine Unterabfrage zurückgreifen. Löschen Sie also zuerst all jene Bestellpositionen, die Bestellungen angehören, die den Status "1" aufweisen. Danach, im zweiten Schritt, können die Bestellungen mit dem Status "1" selber gelöscht werden. (Musik läuft) Pausieren Sie nun das Video und lösen Sie die Aufgabe. Wenn Sie damit fertig sind, fahren Sie mit dem Video fort und sehen Sie sich meine Musterlösung an. Betrachten wir uns nun die Lösung der Aufgabe zuerst einmal hier mit dem Microsoft SQL Server. Ich starte hier wieder eine explizite Transaktion und hier finden wir die Anweisung, mit der wir zuerst einmal die Bestellpositionen löschen können. Die Unterabfrage liefert uns die Bestellnummern der Bestellungen mit dem Status "1". Ich führe diese Unterabfrage hier noch separat aus, damit wir sehen, das sind die zwei Bestellungen. Das liefert uns die Unterabfrage und das wiederum ist das Kriterium, das sich an meine Delete-Anweisung zurückgebe. "DELETE FROM wawi.bestellpositionen", das heißt, das ist die Tabelle, in der wir löschen wollen. "WHERE bestnr IN" und hier wird das Ergebnis der Unterabfrage zugewiesen. Mit dieser Anweisung leeren wir also vorweg die Positionen der betroffenen Bestellungen. In unserem Fall habe ich jetzt hier sieben Zeilen gelöscht. Erst jetzt kann ich im zweiten Schritt die Bestellungen selber löschen. Das waren zwei. Das heißt, ich musste hier über eine Unterabfrage die Kriterien zum Löschen herauslesen. Zur Kontrolle ein "SELECT" auf die Tabelle, ob es noch welche mit dem Status "1" gibt, das darf hier natürlich nicht der Fall sein. Und nachdem das Löschen erfolgreich war und ich es auch bestätigen möchte, schließe ich mit der Anweisung "COMMIT" ab. Von der Anweisung ident her ist die Lösung unter MySQL. Einen kleinen Unterschied möchte ich natürlich dennoch hervorstreichen. Damit meine ich jetzt nicht, wenn wir einen Blick in die Tabelle hineinwerfen, dass jetzt hier drei statt wie beim SQL Server zwei Zeilen betroffen sind, da ist einfach zwischendurch beim Einfügen irgendwas schiefgelaufen, deshalb sind manche Dinge, so wie diese hier, doppelt in der Tabelle drin. Aber genau das ist der Sinn und Zweck dieses Beispiels, hier aufzuräumen und das herauszulöschen, was sozusagen fälschlich erfasst wurde mit dem Status "1" und nie abgeschlossen worden ist. Prinzipiell benötigen wir dieselbe Unterabfrage, um jene Bestellnummern auszulesen, deren Positionen gelöscht werden sollen. Jetzt bringt MySQL – und das macht den Unterschied hier aus – manchmal eine Fehlermeldung, dass das Löschen nicht möglich ist, wenn der Safe Mode aktiviert ist und nicht über den Schlüssel, über die Key-Spalte, gelöscht wird oder die Limit-Klausel verwendet wird. Ich bin generell nicht so ein Fan von diesem Safe Mode, da ich ja weiß, was ich tue, und auch gegebenenfalls mit einem Rollback Daten wiederherstellen kann. Deshalb deaktiviere ich den typischerweise. Das funktioniert unter dem Menübefehl "Edit", "Preferences". Hier muss "SQL Editor" gewählt werden und hier ganz unten finden wir die Einstellung zu "Safe Updates". Ich deaktiviere diese. Wichtig ist, dass nach einer Änderung hier neu verbunden werden muss. Das heißt, Sie müssen sich abmelden und neu hier bei der MySQL Workbench im Server anmelden. Oder Sie verwenden hier den Zusatz "LIMIT" 10". Achten Sie darauf, wenn Sie das machen, dass das Semikolon hier am Ende entfernt gehört. Ich führe nun nochmal diese Anweisung aus und wir sehen, dass ich jetzt hier 13 Zeilen gelöscht habe. Eben ein paar mehr, weil es hier eine Bestellung doppelt gegeben hat. Mit dieser Anweisung lösche ich nun noch die drei Bestellungen und nun die Kontrolle hier über diese Select-Anweisung. Wir sehen, dass tatsächlich keine Bestellungen mehr vorhanden sind. Mit einem "COMMIT" bestätige ich das Löschen und damit sind die Daten entfernt. Wir finden eine idente Lösung hier wieder unter Oracle auch vorher zum Abschluss. Dieselben zwei Einträge, die wir mit diesen beiden Anweisungen, die ich ausführe, löschen können. Und auch hier die Kontrolle, die mir sagt, die Daten sind nicht mehr da und mit einem "COMMIT" bestätige ich den Löschvorgang. Wenn wir also Daten löschen möchten, und die Kriterien zum Löschen in einer anderen Tabelle finden, dann müssen wir das über eine Unterabfrage lösen. Die Unterabfrage liefert uns die Informationen, welche Daten zu löschen sind. Die SQL Syntax sieht nämlich keinen Join bei einer Delete-Anweisung vor. und deshalb muss die Unterabfrage dafür verwendet werden. In unserem Fall mussten wir zuerst die Positionen löschen, da aufgrund von referenziellen Integritäten das anders nicht möglich gewesen wäre.

SQL Grundkurs 2: Aufgaben und Lösungen

Vertiefen Sie Ihre SQL-Kenntnisse. In diesem Workshop erhalten Sie zahlreiche Beispielaufgaben, die Sie selbst lösen können. Anschließend zeigt Ihnen der Trainer die Lösung.

7 Std. 41 min (61 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieses Training setzt SQL-Kenntnisse voraus, wie sie beispielsweise in „SQL lernen und anwenden“ vermittelt werden.

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!