Diskussion:Einführung in SQL: Funktionen

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Typen von Funktionen[Bearbeiten]

In diesem Kapitel sollte grundsätzlich zwischen skalaren Funktionen und Spaltenfunktionen unterschieden werden.

Skalare Funktionen werden hier bis jetzt überhaupt nicht beschrieben. Beispiel: to_date(...), day_of_week(...), month(...), year(...), round(...), trunc(...), substr(...), trim(...), random(...), nvl(...)

Bei Oracle gibt es noch die mächtigen REGEXP-Funktionen (siehe w:regexp und Awk: Grundlagen: Reguläre Ausdrücke), mit denen man mit wenigen Befehlen komplexe Suchalgorithmen implementieren kann. Dazu will ich demnächst mal ein par Beispiele beisteuern.

Skalare Funktionen haben einen Input aus einer einzigen Datenzeile und liefern einen bestimmten Output-Wert.

Spaltenfunktionen haben als Input immer eine ganze Spalte bestehend aus 0 einer oder mehreren Datenzeilen.

--Julius-m 10:15, 25. Jan. 2008 (CET)

Ich möchte die skalaren Funktionen noch weiter unterteilen und deshalb dieses Kapitel neu gliedern: Funktionen für Strings, Funktionen für Zahlen, Funktionen für Datums- und Zeitwerte, Spaltenfunktionen. -- Juetho 13:03, 13. Jul. 2009 (CEST)

Es gibt noch mehr Spaltenfunktionen[Bearbeiten]

Es gibt noch mehr Spaltenfunktionen:

  • Mittelwert ermitteln
  • Median ermiteln
  • XMLAGG-Funktionen, die alle Werte einer Spalte in einen XML-String konvertiert.

Ich will demnächst mal einige Beispiele beisteuern. --Julius-m 10:15, 25. Jan. 2008 (CET)

Gruppierung[Bearbeiten]

Es gibt noch ROLLUP, CUBE, HAVING.

In diesem Zusammenhang die ROWNUM-Funktion, die die Werte aus der Spalte nummerieren kann anhand einer bestimmten Sortierung. Das sind die sog. OLAP-Erweiterungen des SQL-Standards.

Wäre es nicht sinnvoll, für Gruppierungen ein eigenes Kapitel zu schreiben? --Julius-m 10:15, 25. Jan. 2008 (CET)

Das sehe ich genauso. Es ist inzwischen (?) ein Abschnitt "Abfragen mit Gruppierungen" vorgesehen; den Text werde ich von hier dorthin verschieben, wenn ich soweit bin. -- Juetho 13:00, 13. Jul. 2009 (CEST)

Dialekte[Bearbeiten]

Es mag sein, dass die eine oder andere Datenbank über sehr nützliche Funktionen verfügt, die man zur Gruppierung nutzen kann. Aber das sollte man dann ausdrücklich kennzeichnen. Sonst ist der Frust beim Leser vorprogrammiert. M.W. sind minimal nur SUM(), COUNT(), MIN(), MAX() und AVG() verfügbar. Für's Erklären der Syntax reicht das aus.

Selbst definierte Funktionen[Bearbeiten]

Hier sollten auch die selber definierten Funktionen mal kurz angesprochen werden.

CREATE FUNCTION xyz ... --Julius-m 22:54, 20. Sep. 2009 (CEST)

Das ist vermutlich richtig. Einzelheiten dazu würden zu "Prozeduren und Trigger" passen. Mal sehen, wie ich es noch einbaue (aber sicher erst, wenn die Gliederung geändert wurde). -- Juetho 08:45, 21. Sep. 2009 (CEST)
Ich denke, ich werde es so machen: (1) In der Einleitung bei den Funktionen einen kurzen Hinweis. (2) Das neue Kapitel wird "Funktionen, Prozeduren, Trigger" heißen. -- Juetho 09:39, 22. Sep. 2009 (CEST)
(1) erledigt. Sollte das bisherige Kapitel "Funktionen" dann besser "Interne Funktionen" oder "Funktionen des DBMS" oder "Eingebaute Funktionen" oder "Integrierte Funktionen" heißen? -- Juetho 12:33, 22. Sep. 2009 (CEST)
zu (2): Ich brauche Hilfe! Das Gerüst für Eigene Funktionen habe ich erstellt. Aber ich bin bereits bei den ersten Formulierungen gescheitert, da ich nur mit Firebird arbeite und es dort FUNCTION immer noch nicht gibt (nur als EXTERNAL über eine DLL). Ich könnte die Befehlsstrukturen aus den Dokumentationen von MySql, MS-SQL, Oracle übernehmen; aber wenn ich selbst nichts probieren kann, bin ich mir doch zu unsicher - das will ich den Lesern nicht zumuten. Mit StoredProcedures kenne ich mich aus; deshalb fange ich damit an. -- Juetho 17:02, 22. Sep. 2009 (CEST)

Datawarehouse-Extensions[Bearbeiten]

Es gibt im ANSI noch ein par super nützliche Erweiterungen für Funktionen: RANK, DENSE_RANK, ROW_NUMBER. Window-Definition. --Julius-m 22:54, 20. Sep. 2009 (CEST)

Es ist schön, wenn ANSI so etwas hat. Aber das hilft nur etwas, wenn es mehr als ein oder zwei DBMS anbieten. Übrigens: Kannst du mir die <window clause> erklären? Ich habe bisher nur mehr oder weniger unverständliche englische Erläuterungen - auch in der englischen Wikipedia - gefunden, weiß aber immer noch nicht, wozu die gut ist. -- Juetho 09:47, 22. Sep. 2009 (CEST)

CASE[Bearbeiten]

Hier sollte noch die CASE-Expression erwähnt werden. Es gibt sie in zwei Varianten:

  • CASE WHEN Boolean-Expression1 THEN Expression1 WHEN Boolean-Expression2 THEN Expression2 ELSE Expression3 END
  • CASE Expression1 WHEN Value1 THEN Expression11 WHEN Value2 THEN Expression21 ELSE Expression31 END

--Julius-m 22:44, 21. Sep. 2009 (CEST)

Ich finde, dieser Ausdruck passt nicht zu den Funktionen. Bei COALESCE und NULLIF habe ich CASE erwähnt mit dem Verweis auf Nützliche Erweiterungen. -- Juetho 09:44, 22. Sep. 2009 (CEST)

Und nur der Vollständigkeit halter sollte auch die schrechliche DECODE-Funktion erwähnt werden. Am besten gleich mit dem Hinweis, sie lieber nicht zu verwenden, sondern CASE einzusetzen. --Julius-m 22:44, 21. Sep. 2009 (CEST)

DECODE habe ich bewusst ignoriert: MS-SQL kennt es gar nicht, Firebird und Oracle benutzen es als spezielle CASE-Variante, MySql benutzt es zur Verschlüsselung. Ich finde, in diesem Kapitel gibt es schon genug Punkte, die den Leser verwirren. -- Juetho 09:44, 22. Sep. 2009 (CEST)