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

Lösung zu Beispiel 15 mit Oracle

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Die Erläuterung für den Einsatz von Unterabfragen in der WHERE-Klausel für Oracle-Anwender ist in diesem Video zu finden. Zusätzlich erfahren Sie, wie Sie eine eigene Funktion programmieren!

Transkript

Ich zeige Ihnen in diesem Video, wie Sie die Lösung für das 15. Beispiel mit Oracle realisieren. Die Aufgabenstellung war ja, alle Mitarbeiter herauszufiltern, die jünger als der Durchschnitt Ihrer Abteilung sind. Im Vorfeld bei der Angabe habe ich Ihnen schon gezeigt, wie Sie das Alter berechnen. Dies ist ja im Vergleich zu den anderen beiden Systemen die einfachste Syntax unter Oracle. Mit diesem Ausdruck können wir exakt das Alter berechnen. Und jetzt wollen wir alle, die jünger sind als der Durchschnitt. Das heißt, ihr Alter muss kleiner sein, jünger, ist ein späteres Datum, das ist kleiner, als das errechnete Durchschnittsalter. Das Durchschnittsalter müssen wir also in einer Unterabfrage berechnen. Dazu muss ich diesen Berechnungsausdruck für das Alter in diese Unterabfrage kopieren und sagen SELECT AVERAGE, damit berechnen wir den Mittelwert für dieses Alter, FROM Personal WHERE. So und was steht jetzt hier in der WHERE Klausel? Wir wollen jetzt filtern auf die Abteilung, die zum gerade geprüften Mitarbeiter passt. Das heißt, man nennt das eine korrelierte Unterabfrage, wenn wir in der Unterabfrage auf einen Wert der Hauptabfrage verweisen. Da die Haupt- und Unterabfrage auf der gleichen Tabelle basieren, müssen wir diese unterscheidbar machen. Das machen wir dadurch, indem wir in der Hauptabfrage mit ha und in der Unterabfrage mit ua einen unterschiedlichen Tabellenaliasnamen für diese beiden Tabellen vergeben. Daher weiß die Unterabfrage, wenn ich hier sage ua.abteilung, also die eigene Abteilung oder das eigene Abteilungskürzel gemeint ist, und mit ha.abteilung auf die Abteilung in der Hauptabfrage verwiesen wird. Jetzt muss ich hier leider diesen Ausdruck mehrmals in der Anweisung hineinkopieren. Die Berechnung des Alters hier einmal in der SELECT Klausel, damit ich es im Ergebnis sehe. Dann ein zweites Mal brauche ich sie in der WHERE Klausel für den Vergleich, und dann ein drittes mal hier in der Unterabfrage für die Berechnung des Durchschnittsalters. Das macht jetzt natürlich das Ganze etwas unübersichtlich. Auch wenn es nicht so unübersichtlich ist, wie bei den anderen beiden Systemen, wo der Ausdruck für die Berechnung deutlich umfangreicher ausfällt. Ich starte mal diese Anweisung und wir bekommen jetzt hier jene 11 Zeilen zurückgeliefert. Das sind also die Personen, die jünger sind als der Durchschnitt in ihrer Abteilung. Aus dem Controlling finden wir hier nur einen. Zwei aus dem Einkauf und so weiter. Also das ist das jeweils berechnete Alter. Ich möchte Ihnen jetzt noch einen Tipp mitgeben. Immer wieder kann es vorkommen, dass man sehr komplexe Ausdrücke immer wieder verwenden muss in Anweisungen. Und gerade das Kopieren von mehrmals dem gleichen Ausdruck kann hier sehr unübersichtlich wirken. Und vor allem, je umfangreicher der Ausdruck ist, desto schlechter lesbar wird das Ergebnis. Praktisch wäre es, hätten wir dann eine fixfertige Funktion die man statt des Ausdrucks hier verwenden kann. Und das kann ich mit den meisten Datenbankmanagement- systemen umsetzen, wenn man sich eine eigene Funktion programmiert. Bei Oracle passiert das über PLSQL. Das ist eine Spracherweiterung zu SQL. die eine, PL steht für Procedure Language, eine prozedurale Sprache bietet. Allerdings ist das keine Standardsprache, so wie SQL eine Standardsprache ist. Deshalb ist die Syntax bei allen Systemen unterschiedlich. Ich hab hier diese Funktion hineinkopiert. Weil der Editor mit der Kombination von mehreren Anweisungen im Editor ein Problem macht, habe ich sie auskommentiert. und noch einmal in ein eigenes Editorfenster hineinkopiert. Eine Funktion kann ich mit der Anweisung CREATE OR REPLACE FUNCTION generieren. CREATE OR REPLACE ist sehr praktisch, wenn es die Funktion noch nicht gibt. Mit CREATE wird sie erzeugt. Wenn Sie schon vorhanden ist, kann ich sie dann mit der neuen, geänderten oder editierten Variante quasi überschreiben. CREATE OR REPLACE ersetzt mir also die Varianten mit CREATE einerseits und ALTER andererseits bei anderen Systemen. Ich brauche hier nicht umschreiben. Das ist sehr praktisch. Ich habe dieser Funktion den Namen fn_alter gegeben und sie in meinem wawi Schema abgelegt. Außerdem muss ich der Funktion natürlich einen Parameter mit übergeben. v_datum, v für Variable, habe ich hier vergeben. IN date. Das heißt, es ist ein Input Parameter, den bekommt die Funktion hinein mit übergeben und diese hat den Datentyp date, ein Datum. Mit RETURN number legen wir fest, dass diese Funktion als Ergebnis eine Zahl zurück liefert. Und hinter dem Schlüsselwort AS kommt der eigentliche Berechnungsteil der Funktion. Im so genannten Deklarationsteil vor dem Beginn werden einige Variablen angegeben oder kann ich Variablen definieren. Hier brauchen wir nur eine, nämlich v_alter. Diese Variable dient dazu, das Ergebnis der Berechnung aufzunehmen. Diese hat ebenso den Datentyp Number. und jede Zeile muss hier mit einem Semikolon beendet werden. Mit BEGIN leite ich den Berechnungsblock ein, der hier nur aus einer Anweisung besteht nämlich in diese Variable Alter schreibe ich den Wert, das ist hier der Ausdruck so wie wir ihn verwendet haben. Mit := erfolgt die Wertzuweisung an die Variable. Einerseits wird jetzt für die Berechnung das aktuelle Datum und das beim Aufruf übergebene v_datum Geburtsdatum, verwendet. Sonst gleicht der Ausdruck dem, was wir vorhin in der Anweisung verwendet haben. Mit RETURN v_alter wird der Inhalt dieser Variable zurückgegeben. Ich erzeuge nun diese Funktion. Ich lege sie jetzt hier an in der Datenbank. Die ist jetzt erzeugt und kompiliert. Die sehen wir jetzt hier zum Beispiel auch im Editor hier unter Functions FN_ALTER und auch das der Rückgabewert eine Zahl ist und dass v_datum als Datum als Wert übergeben werden muss. Was kann ich nun machen? Ich kann diese Funktion nun in meinem SQL Statement wie jede andere interne Funktion einbauen. Und dieses Statement wird nun deutlich kürzer, denn anstelle dieses langen Ausdrucks, zugegeben, bei Microsoft SQL Server und MYSQL ist er noch viel länger da ist der Effekt noch wesentlich stärker, kann ich jetzt diesen Funktionsnamen einbauen und das Ganze wird kurz und übersichtlich. wawi.fn_alter, der Name meiner Funktion und gebdatum wird als Parameter übergeben. Das Gleiche habe ich jetzt hier in der WHERE Klausel und auch hier in der Unterabfrage für die Berechnung. Das heißt drei Mal die Funktion statt drei Mal diesen Monsterausdruck, wie wir ihn vorher hatten, liefert uns das selbe Ergebnis, aber in einer wesentlich übersichtlicheren Form. Und damit haben wir nun eine Funktion programmiert. Das als Sondertipp. Sollten Sie diese Funktion irgendwann einmal nicht mehr benötigen, dann können Sie diese mit der Anweisung DROP FUNCTION fn_alter auch wieder löschen. Generell haben wir also in diesem Beispiel gesehen, nicht nur, wie wir eine Funktion einbauen sondern auch, wie wir eine korrelierte Unterabfrage in der WHERE Klausel verwenden. Diese verweist auf einen Wert in der Hauptabfrage. Wenn diese Hauptabfrage auf der selben Tabelle basiert, wie die Unterabfrage, dann müssen Sie die beiden über einen unterschiedlichen Aliasnamen unterscheidbar machen.

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!