Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

SQL Grundkurs 2: Aufgaben und Lösungen

Lösung zu Beispiel 1 mit Oracle

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Oracle-Benutzer finden in diesem Film die Erläuterung der Lösung für das Beispiel 1.

Transkript

In diesem Video zeige ich Ihnen die Lösung für unser erstes DDL-Beispiel, das Erstellen der aktuellen "wawi.adressen" mit Oracle. Die Aufgabenstellung ist noch immer dieselbe, Betrachten wir uns hier die Lösung. Wenn wir Constraints auf Spaltenebene definieren, funktioniert das prinzipiell über dieselbe Logik, wie wir sie vom Microsoft SQL Server schon kennengelernt haben, nur wenn wir es eins zu eins so übernehmen, bekommen wir hier noch einen Fehler. Und zwar, wir sehen jetzt hier die Logik so definiert, wie wir sie beim SQL-Server verwendet haben. Vielleicht vorweg noch ganz kurz, die Datentypen, die ich hier verwendet habe, sind natürlich etwas abweichend. Die Spaltennamen sind dieselben, die wir beim Microsoft SQL Server verwendet haben. Ich habe jetzt hier "number" verwendet für die Adressnummer, Kunden und auch für aktuell, hier ohne Größenangabe bei aktuell bei "1, 0", das heißt, ich möchte hier einen Booleschen Wert true/false abbilden, da gibt es ja keinen eigenen Datentyp bei Oracle. Deshalb "number" lediglich einstellig und hier möchte ich '0' und '1' für 'wahr' und 'falsch' später speichern können. Prinzipiell habe ich hier auch die ausführliche Variante verwendet, um einen Primärschlüssel zu definieren. Name des Constraints, in dem Fall "pk_adressen", und vorangestelltes Schlüsselwort "CONSTRAINT". Jetzt sehen wir hier auch "NOT NULL" und dann in weiterer Folge das nächste Constraint im Fremdschlüssel. Diese Anweisung führt allerdings, wenn wir sie so ausführen, vorläufig zu einem Fehler. Was ist jetzt das Problem? Und zwar ist jetzt Folgendes: Beim Microsoft SQL Server war "NOT NULL" eine Spalteneigenschaft. Das ist jetzt hier bei Oracle anders, der "NOT NULL" ist auch ein Constraint. Wenn wir also ein "NOT NULL" und dann eine Constraint-Definition hier ergänzen, haben wir de facto zwei Constraints direkt hintereinander auf Spaltenebene definiert und das ist nicht möglich. Ich könnte das Problem jetzt beheben, indem ich hier zum Beispiel ein Komma einfüge. Wenn ich das mache, dann ist das ähnlich wie die Definition auf der Tabellenebene, das heißt, ich kann jetzt mehrere Constraints kommagetrennt definieren. Diese Variante entspricht eigentlich der verkürzten Syntax für ein Constraint "NOT NULL" und wie sich das auswirkt, werden wir gleich sehen. Ich lösche jetzt hier diese Fehlermeldung hier in der Ausgabe, bevor ich die Anweisung jetzt noch einmal ausführe, und jetzt hat es prinzipiell einmal funktioniert, das heißt, dadurch dass ich jetzt hier ein Komma eingefügt habe. Mit dieser Anweisung haben wir ja sehr viele Constraints jetzt erzeugt, da wir ja auch mit jeder "NOT-NULL"-Ergänzung hier in der Syntax ein Constraint erzeugt haben. Vergleichen wir das jetzt auch hier mit der Variante auf Tabellenebene. Auch dazu lösche ich mit der Anweisung "DROP TABLE" vorläufig die Tabelle noch einmal aus meiner Datenbank. und schreibe es jetzt so, wie wir es auch beim Microsoft SQL Server gesehen haben. Hier überall das "NOT NULL" ergänze ich schön brav, hier mein "DEFAULT". Der Unterschied ist jetzt hier, "DEFAULT" ist bei Oracle eine Spalteneigenschaft kein Constraint. deshalb darf ich hier auf keinen Fall Constraint ergänzen. Also "DEFAULT SYSDATE" definiert, dass das Anlagedatum als "NOT NULL" definiert wird. "DEFAULT 1" definiert mir für "aktuell", dass eben, so wie wir es definiert haben, "1" als Vorgabewert für diese Spalte definiert wird. Und jetzt kommen hier die einzelnen Constraints nach der letzten Spalte hier mit Komma getrennt. Der Primärschlüssen auch hier wieder angegeben welche Spalte betroffen ist, das Check-Constraint für die mindestens vierstellige Eingabe der Postleitzahl, der Fremdschlüssel zu den Kunden. Und beim Oracle Datenbankserver habe ich hier jetzt noch einen Check-Constraint ergänzt, da wir ja keinen Bit-Datentyp haben, der '0' und '1' aufnehmen kann. Da habe ich hier einen extra Check-Constraint, das festlegt, dass die Spalte "aktuell" eben nur die Werte "0" und "1" verwenden kann. Also das Check-Constraint "aktuell IN(0,1)" bewirkt eben genau das. Und damit erzeuge ich jetzt diese Tabelle. Betrachten wir uns, was eigentlich aus diesem "NOT-NULL"-Zusatz hier geworden ist. Wie schon erwähnt, werden das lauter einzelne Constraints. Das können wir auch mit dieser Anweisung auslesen, aus der Systemtabelle "USER_CONSTRAINTS". Mit der Einschränkung auf den Tabellennamen "adressen" geben wir uns jetzt einfach mal aus, welche Constraints hier zu finden sind. Und was sehen wir jetzt bei Oracle? Hier die Constraints mit den Namen, die wir hier sauber definiert haben. "C" für "Check", "P" für "Primary Key", "R" für "Referential", also den Fremdschlüssel, Und die anderen haben hier "SYS_C" und eine laufende Nummer bekommen. Das ist natürlich kein schöner Constraint-Name. Und das sind unsere "NOT-NULL"-Einschränkungen. Das heißt, eigentlich sind NOT NULL Constraints bei Oracle, wenn man sie sauber definiert, auch mit einem Namen und Constraints zu versehen. Deshalb habe ich Ihnen hier eine Variante unter dem Aspekt "besser" noch vorbereitet. Ich lösche noch einmal die Tabelle und wir sehen jetzt hier diese Anweisung. Was ändert sich jetzt? So, wie wir es bei den anderen Constraint-Typen schon gesehen haben, ergänze ich jetzt hier vor dem "NOT NULL" das Schlüsselwort "CONSTRAINT", "nn" für NOT NULL", also den Constraint-Typen, gefolgt vom Namen der Tabelle und vom Namen der Spalte. Also auf diese Art und Weise habe ich jetzt hier alle NOT NULL Constraints definiert. Alles andere ist hier gleich geblieben, habe ich hier nicht verändert. Ich führe jetzt diese Anweisung erneut aus und wenn wir jetzt wieder einen Blick in die Systemtabelle werden, dann sehen wir jetzt, dass jetzt hier die Constraint-Namen nicht mit "SYS_C", sondern mit einem sauberen Namen angezeigt werden. Ob Sie das letztendlich in der Praxis machen oder nicht, bleibt natürlich Ihre Entscheidung. Also für alle, die sagen, ich lege Wert darauf, dass das sehr sauber und ordentlich definiert ist, würde man natürlich diese Variante hier empfehlen. Und auch hier möchte ich Ihnen nun die dritte Variante nicht vorenthalten, nämlich das Ergänzen der Constraints im Anschluss an das Erstellen der Tabelle. Ich lösche sie daher ein weiteres Mal, um sie nun vorerst ohne meine Constraints zu erstellen. Die NOT NULL Constraints, das macht nicht wirklich Sinn, das im Anschluss zu vergeben, die lasse ich hier dabei stehen. Aber meinen Fremdschlüssel, meinen Check-Constraint und meinen Primärschlüssel möchte ich erst im Anschluss ergänzen. Ich habe jetzt gerade also diese leere Tabelle erstellt, und jetzt kommen wieder diese Alter-Table-Anweisungen. Da sehen wir keinen Unterschied zum Microsoft SQL Server, "ALTER TABLE", Name der Tabelle, "ADD" und dann wieder dieselbe Syntax, wie wir vorher auf Tabellenebene den Primärschlüssel und die anderen Constraints definiert haben. Also ich führe diese Anweisung aus, und habe jetzt den Primärschlüssel ergänzt. Das Gleiche mache ich für meinen Check-Constraint und auch für meinen Fremdschlüssel. Und abschließend noch das Sonder-Check-Constraint, das festlegt, dass die Spalte "aktuell" nur die Werte "0" und "1" aufnehmen kann. Damit ist die Tabelle fertig. Bevor wir die Testdatensätze einfügen, nachdem Sie hier bei Oracle nicht sowas, wie eine Identity oder ein Auto Increment gibt, müssen wir uns noch eine Sequence erstellen. Damit ich ein Reset machen kann, habe ich hier auch die Anweisung zum Löschen der Sequence vorbereitet. Die Anweisung muss ich jetzt natürlich nicht ausführen. Einfach eine einfache Sequence "CREATE SEQUENCE" als "adr_seq" für meine Adressen-Sequence, "START WITH 1" und "INCREMENT BY 1", um genau dasselbe Verhalten, wie vorhin beim Microsoft SQL Server nachzuempfinden. Ich erzeuge die Sequence, das habe ich jetzt gemacht. Und jetzt kann ich abschließend noch hier die drei Zeilen einfügen. Ich muss das hier in einzelnen Anweisungen machen. Das funktioniert bei dieser Version von Oracle, die hier im Einsatz ist, bei der 11er Express-Version, noch nicht, dass ich hier mit einem Insert mehrere Values einfüge. Das ist auch kein Problem. Was ich allerdings machen muss, ist die Adressnummer explizit hier als Ziel mit angeben und dann hier mit dem Verweis auf die Sequenz mit der Methode "nextval" den Wert auslesen und einfügen. Ich starte diese drei Anweisungen hier hintereinander, hätte ich auch auf einmal starten können, mache ich jetzt einzeln, und um das Einfügen festzuschreiben, führe ich noch die "COMMIT"-Anweisung aus und betrachte mir hier das Ergebnis. Und gleich, wie vorhin schon gesehen, habe ich jetzt hier diese drei Zeilen eingefügt. Kontrollieren wir das Ergebnis nun gejoint mit der Kundentabelle, sehen wir jetzt, dass hier zum Beispiel die Petra Deutschmann zwei und die Ursula Sauber eine abweichende Adresse, um sie später als Rechnungs- oder Lieferadresse oder was auch immer zu verwenden, erfasst hat. Wenn wir also bei Oracle Tabellen erstellen, müssen wir berücksichtigen, dass "NOT NULL" auch als Constraint implementiert ist, "DEFAULT" als Spalteneigenschaft, aber nicht als Constraint, das müssen wir also einfach so ergänzen. Prinzipiell haben wir auch die Möglichkeit, ein Constraint auf Spaltenebene zu definieren direkt beim Erfassen der entsprechenden Spalte oder eben auf Tabellenebene am Ende der Anweisung oder wir können Sie anschließend an das Erstellen der Tabelle mit einer Alter-Table-Anweisung ergänzen.

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!