Zum Inhalt springen

Diskussion:Einführung in SQL: Nützliche Erweiterungen

Seiteninhalte werden in anderen Sprachen nicht unterstützt.
Abschnitt hinzufügen
Aus Wikibooks
Letzter Kommentar: vor 14 Jahren von Juetho in Abschnitt Zeilennummerierung im ANSI-SQL

Beschränkung auf eine Anzahl Zeilen

[Bearbeiten]

LIMIT und Oracle

[Bearbeiten]

Das gibt es, wie ich aus der Dokumentation entnommen habe: http://download.oracle.com/docs/cd/B19188_01/doc/B15917/sqcmd.htm#sthref612 Es sollte also an dieser Stelle wieder aufgenommen werden. (Ich habe es aber nur aus der Doku entnommen, nicht aus der Praxis.) -- Juetho 09:27, 30. Sep. 2009 (CEST)Beantworten

ROWNUM, ROW_NUMBER u.a.

[Bearbeiten]

Die gleiche oder ähnliche Funktionalität wie ROWNUM unter Oracle gibt es auch bei anderen DBMS. Da es aber unterschiedlich abläuft, ob es zu einem normalen SELECT gehört oder innerhalb einer SP o.ä. benutzt wird, schlage ich einen eigenen Abschnitt erster Ebene "Die Zeilennummer" vor. -- Juetho 09:27, 30. Sep. 2009 (CEST)Beantworten

Zeilennummerierung im ANSI-SQL

[Bearbeiten]

Im Text steht der Satz Der SQL-Standard hat dafür (noch) kein Verfahren festgelegt. Im letzten Release wurden die Window-Funktionen ergänzt. Ich glaube, sie gehören zum Bereich der Datawarehouse-Extensions. Es ist - glaube ich - das Release 2003. Leider werden diese Extensions noch nicht von allen Datenbank-Herstellern umgesetzt. In DB2 V9 und Oracle 10g kann man sie schon verwenden. Die Syntax ist diese:

SELECT ID, Name, Vorname, Abteilung_ID AS Abt,
ROWNUM() OVER (ORDER BY ID DESC) R
FROM Mitarbeiter

Es wird eine zusätzliche Spalte R generiert, die bei einer absteigenden Sortierung nach der Spalte ID eine fortlaufende Nummerierung generiert. Man kann auch andere Nummerierungen generieren:

SELECT ID, Name, Vorname, Abteilung_ID AS Abt,
ROWNUM() OVER (ORDER BY ID DESC) R_id
ROWNUM() OVER (ORDER BY Name) R_Name
FROM Mitarbeiter

... und damit ist es nun auch möglich, nur die 10. Zeile auszugeben:

SELECT ID, Name, Vorname, Abteilung_ID AS Abt
FROM Mitarbeiter
WHERE ROWNUM() OVER (ORDER BY ID DESC) = 10

Eine Nummerierung der ausgegebenen Sätze in einer zufälligen Reigenfolge wie in Firebird (SELECT FIRST 10) oder Oracle (WHERE rownum < 10) ist damit nicht möglich. Und das ist auch gut so, denn wenn sich der Zugriffspfad mal ändert, ober die Sätze mal reorganisiert werden und dadurch in einer anderen Reihenfolge gespeichert sind, dann kann es sein, dass ganz andere 10 Sätze ausgegeben werden. Eine elementare Forderung vom ANSI-SQL ist ja, dass die Ergebnissmenge eindeutig ist und von der physischen Implementierung unabhängig ist. Das ist mit dieser neuen Funktion nun gegeben.

Die einzelnen Datenbabnkhersteller werden vermutlich in ihren nächsten Releasen diese Funktion einbauen.

Es gibt noch eine ganze Reihe von anderen ähnlich nützliche Erweiterungen aus dem DWH-Extender. Hier einige Beispiele:

Summe bilden pro Abteilung ohne explizite Gruppierung:

SELECT Name
, Abteilung
, Gehalt
, SUM(Gehalt) OVER (PARTITION BY Abteilung) Abteilungs_Summe
FROM Mitarbeiter

Nur die Mitarbeiter ausgeben, die mehr verdienen als der Durchschnitt in ihrer Abteilung - ohne diese neuen Funktionen musste man sich da schon ganz schön anstrengen, um so etwas mit SQL zu formulieren:

SELECT Name
, Abteilung
, Gehalt
FROM Mitarbeiter
WHERE Gehalt > AVG(Gehalt) OVER (PARTITION BY Abteilung) 

Tagesumsätze ausgeben und in einer weiteren Spalte den Umsatz von vor 7 Tagen mitausgeben zum Vergleich. Mit diesen Funktionen kann mal auch gleich die Umsatzsteigerung im Vergleich zur vorangegangenen Woche berechnen und mit ausgeben:

SELECT Datum, Umsatz
, LAG(Umsatz, 7) OVER (ORDER BY Datum) Umsatz_vor_einer_woche
, ( Umsatz - LAG(Umsatz, 7) OVER (ORDER BY Datum))
  / LAG(Umsatz, 7) OVER (ORDER BY Datum) Umsatz_Steigerung
FROM Umsatztabelle

--Julius-m 18:13, 19. Dez. 2009 (CET)Beantworten

Bereits in Einführung in SQL: Einleitung habe ich erläutert, was ich für dieses Buch als SQL-Standard ansehe, nämlich SQL-2003 nach ISO/IEC 9075. Es ist deshalb meine bewusste Entscheidung, nur das darzustellen, was auf dieser Grundlage in mehr als einem DBMS (möglichst mindestens dreimal) zu finden ist. Ich weiß, dass das eine starke Einschränkung ist; aber eine "Einführung" sollte nicht zu früh in zu viele Richtungen gehen. Insbesondere die Datawarehous-Extensions gehören IMHO nicht zum eigentlichen SQL-Standard (schließlich heißen sie immer noch "Extensions").
Aber hier handelt es sich um ein Wiki-Projekt. Jeder darf seine eigenen Vorstellungen einbringen und im Buch umsetzen. Ich bitte dich lediglich, die Gliederung und die Struktur der Kapitel zu beachten. -- Juetho 12:20, 20. Dez. 2009 (CET)Beantworten
Hallo Juetho, hast Du eigentlich frei zugängliche Quellen, wo man den SQL-2003 oder den ISO/IEC 9075 Standard nachschlagen kann? So weit ich weiß, sind diese Dokumente überhaupt nicht frei zugänglich und nur gegen Gebühr zu haben. Außerdem sind Teile davon, die ich schon mal gesehen habe, äußerst kompliziert und schwer lesbar - finde ich. Meine Frage ist: Gehören denn die DWH-Extensions nicht zum SQL-2003 - Standard? Kannst Du das wirklich belegen? Vielleicht sind das ja nur Syntax-Formulierungenm an die man sich erst noch gewöhnen muss. --Julius-m 16:56, 26. Dez. 2009 (CET)Beantworten
Siehe mein letzter Hinweis. Unter Einführung in SQL: Einleitung#Geschichte von SQL steht, was für mich SQL-Standard ist. Diese pdf-Dateien habe ich heruntergeladen, sie sind also frei verfügbar. DWH ist dort unbekannt. -- Juetho 20:24, 26. Dez. 2009 (CET)Beantworten