MySQL Funktionen: Zeichenfolge, Numerisch, Benutzerdefiniert, Gespeichert

⚡ Intelligente Zusammenfassung

MySQL Funktionen transformieren Daten vor dem Speichern oder Abrufen und geben ein einzelnes berechnetes Ergebnis zurück. Dieser Artikel erläutert integrierte Funktionen für Zeichenketten, Zahlen und Datumsangaben und zeigt anschließend, wie gespeicherte und benutzerdefinierte Funktionen die Datenbank-Engine erweitern.

  • 🔤 Zeichenkettenfunktionen: UCASE, LCASE und CONCAT formen den Text zur Abfragezeit um; die berechnete Spalte wird mit AS aliasiert, sodass das Ergebnis-Set eine lesbare Kopfzeile enthält.
  • 🔢 Numerisch OperaTore: DIV führt eine Ganzzahldivision durch, / gibt einen Dezimalquotienten zurück und % (oder MOD) gibt den Rest einer Division zurück.
  • 📅 Datumsfunktionen: DATE_FORMAT wandelt den gespeicherten YYYY-MM-DD-Wert in ein beliebiges Anzeigemuster, z. B. %d-%m-%Y, um, ohne dass eine einzige Zeile Anwendungscode geändert werden muss.
  • Gespeicherte Funktionen: CREATE FUNCTION registriert wiederverwendbare Logik innerhalb des Servers; deklarieren Sie sie als NOT DETERMINISTIC, wenn der Funktionskörper CURDATE() oder NOW() aufruft.
  • ⚙️ Benutzerdefinierte Funktionen: Externe Routinen, die in C geschrieben sind oder C++ werden in den Server kompiliert und verhalten sich dann genau wie native Funktionen.
  • 🚀 Auswirkungen auf die Leistung: Durch das Auslagern von Berechnungen in die Datenbank wird die doppelte Logik aus jeder Clientanwendung entfernt und die Anzahl der Netzwerkumläufe reduziert.

Was sind MySQL Funktionen?

MySQL kann viel mehr als nur Daten speichern und abrufen. Es kann auch Manipulationen an den Daten vornehmen bevor es abgerufen oder gespeichert wird. Dort MySQL Funktionen kommen ins Spiel. Funktionen sind einfach Codeabschnitte, die eine Operation ausführen und anschließend ein Ergebnis zurückgeben. Manche Funktionen akzeptieren Parameter, andere hingegen keine.

Betrachten wir kurz ein Beispiel. Standardmäßig gilt: MySQL Speichert Datumsdatentypen im Format „JJJJ-MM-TT“. Angenommen, wir haben eine Anwendung entwickelt und unsere Benutzer wünschen die Datumsrückgabe im Format „TT-MM-JJJJ“. Wir können die MySQL Die integrierte Funktion DATE_FORMAT ermöglicht dies. DATE_FORMAT ist eine der am häufigsten verwendeten Funktionen in MySQLWir werden das später in dieser Lektion genauer betrachten.

Unabhängig von der Art der Funktion Gibt immer einen einzelnen Wert zurück, kann null oder mehr Parameter akzeptieren innerhalb von Klammern, kann überall dort verwendet werden, wo ein Ausdruck zulässig ist. — in einer SELECT-Liste, einer WHERE-Klausel oder einer ORDER BY-Klausel.

Warum verwenden MySQL Funktionen?

Nachdem wir nun wissen, was eine Funktion ist, stellt sich die Frage, warum wir diese Arbeit überhaupt in die Datenbank auslagern sollten.

Warum  MySQL Funktionen

Wie das obige Diagramm zeigt, nimmt eine Funktion einen Eingabewert entgegen, wendet die Logik einmal innerhalb der Datenbank-Engine an und gibt ein einzelnes Ergebnis an jede Anwendung zurück, die danach fragt.

Programmierer mögen sich fragen: „Warum sich die Mühe machen?“ MySQL Funktionen? Derselbe Effekt lässt sich mit einer Skript- oder Programmiersprache erzielen.“ Es stimmt, dass wir dies erreichen können, indem wir eine Prozedur im Anwendungsprogramm schreiben.

Um auf unser DATUM-Beispiel zurückzukommen: Damit unsere Benutzer die Daten im gewünschten Format erhalten, müsste die Geschäftsschicht die notwendige Verarbeitung selbst durchführen.

Dies wird zu einem Problem, wenn die Anwendung in andere Systeme integriert werden muss. Wenn wir verwenden MySQL Funktionen wie DATE_FORMAT sind in die Datenbank eingebettet, und jede Anwendung, die die Daten benötigt, erhält sie im erforderlichen Format. reduziert Nacharbeiten in der Geschäftslogik und verringert Dateninkonsistenzen..

Ein weiterer Grund zum Nachdenken MySQL Eine ihrer Funktionen besteht darin, dass sie dazu beitragen können, den Netzwerkverkehr in Client/Server-Anwendungen zu reduzieren.Die Geschäftslogikschicht muss lediglich die gespeicherte Funktion aufrufen, ohne Rohdatensätze über das Netzwerk abzurufen und zu bearbeiten. Im Durchschnitt kann die Verwendung von Funktionen die Gesamtleistung des Systems erheblich verbessern.

Arten von MySQL Funktionen

Nachdem wir das „Was“ und das „Warum“ geklärt haben, können wir uns nun die drei Funktionsfamilien ansehen. MySQL Bietet: integrierte Funktionen, gespeicherte Funktionen und benutzerdefinierte Funktionen.

Eingebaute Funktionen

MySQL Es enthält eine Reihe integrierter Funktionen – Funktionen, die bereits in der MySQL Server. Sie ermöglichen uns viele Arten der Datenmanipulation und lassen sich in die folgenden häufig verwendeten Gruppen einteilen.

  • String-Funktionen – mit String-Datentypen arbeiten
  • Numerische Funktionen – mit numerischen Datentypen arbeiten
  • Datumsfunktionen – mit Datumsdatentypen arbeiten
  • Aggregierte Funktionen – Bearbeiten Sie alle oben genannten Datentypen und erstellen Sie zusammengefasste Ergebnissätze.
  • Weitere Funktionen - MySQL Unterstützt auch andere Arten von integrierten Funktionen, aber wir beschränken diese Lektion auf die oben genannten Gruppen.

Betrachten wir nun jede der oben genannten Gruppen im Detail. Wir werden die am häufigsten verwendeten Funktionen anhand unserer Beispieldatenbank „Myflixdb“ erläutern.

String-Funktionen

Zeichenkettenfunktionen arbeiten mit Textwerten. In unserer Filmtabelle sind die Titel in Groß- und Kleinbuchstaben gespeichert. Angenommen, wir möchten eine Abfrage, die die Titel in Großbuchstaben zurückgibt. Die Funktion „UCASE“ nimmt eine Zeichenkette als Parameter und wandelt jeden Buchstaben in einen Großbuchstaben um, wie das folgende Skript zeigt.

SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;

HIER KLICKEN

  • UCASE(`title`) ist die eingebaute Funktion, die den Titel als Parameter entgegennimmt und ihn in Großbuchstaben zurückgibt.
  • AS `upper_case_title` weist der berechneten Spalte einen Alias ​​zu, sodass das Ergebnis-Set anstelle des Rohausdrucks eine lesbare Kopfzeile enthält.

Ausführen des obigen Skripts in MySQL Der Vergleich von Workbench mit Myflixdb liefert die unten dargestellten Ergebnisse.

movie_id Titel Titel in Großbuchstaben
16 67 % schuldig 67 % SCHULDIG
6 Engel und Dämonen ENGEL UND DÄMONEN
4 Code Name Black CODENAME SCHWARZ
5 Papas kleine Mädchen DADDY'S LITTLE TIRLS
7 Davinci Code DAVINCI-CODE
2 Sarah Marshal vergessen Sarah Marshal vergessen
9 Honey moonERS HONIG MOONERS
19 Film 3 FILM 3
1 Fluch der Karibik 4 FLUCH DER KARIBIK 4
18 Beispielvideo BEISPIELFILM
17 Der große Diktator DER GROSSE DIKTATOR
3 X-Men X-MEN

Neben UCASE sollte man sich zwei weitere Personen merken: LCASE wandelt eine Zeichenkette in Kleinbuchstaben um, und CONCAT Verbindet zwei oder mehr Zeichenketten zu einer einzigen. Die vollständige Liste finden Sie in der MySQL Referenz auf eine Zeichenkettenfunktion.

Numerische Funktionen

Wie bereits erwähnt, arbeiten numerische Funktionen mit numerischen Datentypen. Wir können mathematische Berechnungen mit numerischen Daten auch direkt in unseren SQL-Anweisungen durchführen.

Rechenzeichen

MySQL Unterstützt die folgenden arithmetischen Operatoren, die zur Durchführung von Berechnungen in SQL-Anweisungen verwendet werden können.

Name Beschreibung
DIV Ganzzahlige Division
/ Anwendungen
- SubtracProduktion
+ Zusatz
* Vervielfältigen
% oder MOD Modul

Es folgen Beispiele für jeden Operator.

Ganzzahldivision (DIV) — DIV verwirft den Nachkommateil und gibt nur die ganze Zahl zurück.

SELECT 23 DIV 6;

Die Ausführung des obigen Skripts ergibt Folgendes: 3.

Divisionsoperator (/) — Im Gegensatz zu DIV behält der Divisionsoperator den Dezimalteil des Ergebnisses bei.

SELECT 23 / 6;

Die Ausführung des obigen Skripts ergibt Folgendes: 3.8333.

Subtractionsoperator (-)

SELECT 23 - 6;

Die Ausführung des obigen Skripts ergibt Folgendes: 17.

Additionsoperator (+)

SELECT 23 + 6;

Die Ausführung des obigen Skripts ergibt Folgendes: 29.

Multiplikationsoperator (*)

SELECT 23 * 6 AS `multiplication_result`;

Ergebnis:

multiplication_result
138

Modulo-Operator (% oder MOD)

Der Modulo-Operator teilt N durch M und liefert den Rest. Betrachten wir das Beispiel des Modulo-Operators mit denselben Werten wie in den vorherigen Beispielen.

SELECT 23 % 6;
-- OR, equivalently:
SELECT 23 MOD 6;

Die Ausführung eines der beiden Skripte ergibt Folgendes: 5.

Schauen wir uns nun einige der häufigsten numerischen Funktionen an MySQL.

FLOOR Diese Funktion entfernt die Dezimalstellen einer Zahl und rundet sie auf die nächste ganze Zahl ab. Das unten stehende Skript veranschaulicht ihre Verwendung.

SELECT FLOOR(23 / 6) AS `floor_result`;

Ergebnis:

floor_result
3

ROUND Diese Funktion rundet eine Zahl auf die nächste ganze Zahl. Da 23 / 6 den Wert 3.8333 ergibt, gibt ROUND 4 zurück, während FLOOR 3 zurückgibt – die beiden Funktionen sind nicht austauschbar.

SELECT ROUND(23 / 6) AS `round_result`;

Ergebnis:

Rundenergebnis
4

RAND Diese Funktion generiert eine Zufallszahl. Ihr Wert ändert sich bei jedem Funktionsaufruf. Das unten stehende Skript veranschaulicht ihre Verwendung.

SELECT RAND() AS `random_result`;

Datumsfunktionen

Datumsfunktionen arbeiten mit Datums- und Datums-/Uhrzeit-Datentypen. Die Funktion DATE_FORMAT löst das in der Einleitung beschriebene Problem „JJJJ-MM-TT versus TT-MM-JJJJ“.

DATUMSFORMAT Das Skript benötigt zwei Parameter: das zu formatierende Datum und eine Formatzeichenfolge aus Platzhaltern. Das folgende Skript gibt jedes Veröffentlichungsdatum im gewünschten Format Tag-Monat-Jahr zurück.

SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date`
FROM `movies`;

Die am häufigsten verwendeten Formatplatzhalter sind unten aufgeführt.

Platzhalter Bedeutung Beispielausgabe
%d Tag des Monats, zweistellig 04
%m Monat, zweistellig 08
%Y Jahr, vierstellig 2012
%M vollständiger Monatsname August
%Sein Hours, Minuten, Sekunden 14:35:09

Drei weitere Datumsfunktionen tauchen ständig im Arbeitsalltag auf:

  • CURDATE () Gibt das aktuelle Datum im Format JJJJ-MM-TT zurück.
  • JETZT() gibt das aktuelle Datum zurück und Zeit.
  • DATEDIFF(d1, d2) Gibt die Anzahl der Tage zwischen zwei Daten zurück – die Grundlage jeder Mahnung wegen überfälliger Miete.

Die vollständige Liste finden Sie unter MySQL Referenz zur Datums- und Zeitfunktion.

Gespeicherte Funktionen

Die integrierten Funktionen decken die häufigsten Anwendungsfälle ab. Wenn eine Geschäftsregel spezifischer ist, schreiben wir unsere eigene – und genau dafür sind gespeicherte Funktionen da.

Gespeicherte Funktionen verhalten sich genau wie integrierte Funktionen, nur dass Sie sie selbst definieren. Nach ihrer Erstellung kann eine gespeicherte Funktion in SQL-Anweisungen genauso verwendet werden wie jede andere Funktion. Die grundlegende Syntax ist unten dargestellt.

CREATE FUNCTION sf_name ([parameter(s)])
RETURNS data_type
[DETERMINISTIC | NOT DETERMINISTIC]
BEGIN
    -- procedural statements
END

HIER KLICKEN

  • “CREATE FUNCTION sf_name ([Parameter(s)])” ist obligatorisch und teilt die MySQL Der Server soll eine Funktion namens `sf_name` mit optionalen Parametern erstellen, die in Klammern definiert sind.
  • „GIBT DATENTYP ZURÜCK“ ist obligatorisch und gibt den Datentyp an, den die Funktion zurückgibt.
  • „DETERMINISTISCH“ deklariert, dass die Funktion immer denselben Wert zurückgibt, wenn dieselben Argumente übergeben werden. „NICHT DETERMINISTISCH“ behauptet das Gegenteil.
  • „ANFANG … ENDE“ umschließt den prozeduralen Code, den die Funktion ausführt.

Angenommen, wir möchten wissen, welche Leihfilme überfällig sind. Wir können eine gespeicherte Funktion erstellen, die das Rückgabedatum als Parameter entgegennimmt und es mit dem aktuellen Datum auf dem Server vergleicht. Ist das aktuelle Datum nach dem Rückgabedatum, ist der Film überfällig und wir geben „Ja“ zurück; andernfalls geben wir „Nein“ zurück.

DELIMITER |
CREATE FUNCTION sf_past_movie_return_date (return_date DATE)
RETURNS VARCHAR(3)
NOT DETERMINISTIC
BEGIN
    DECLARE sf_value VARCHAR(3);
    IF CURDATE() > return_date THEN
        SET sf_value = 'Yes';
    ELSEIF CURDATE() <= return_date THEN
        SET sf_value = 'No';
    END IF;
    RETURN sf_value;
END|
DELIMITER ;

⚠️ Warnung — Diese Funktion darf nicht als DETERMINISTISCH bezeichnet werden. Der Funktionskörper ruft CURDATE() auf, daher kann dasselbe Argument heute „Nein“ und morgen „Ja“ zurückgeben. Die Deklaration einer zeitabhängigen Funktion als DETERMINISTIC führt den Optimierer in die Irre und ist unsicher für die anweisungsbasierte Replikation. NICHT DETERMINISTISCH immer dann, wenn der Funktionskörper CURDATE(), NOW() oder RAND() aufruft.

Durch Ausführen des obigen Skripts wird die gespeicherte Funktion `sf_past_movie_return_date` erstellt. Testen wir sie nun.

SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(),
       sf_past_movie_return_date(`return_date`) AS `is_overdue`
FROM `movierentals`;

Ausführen des obigen Skripts in MySQL Die Workbench-Analyse von myflixdb liefert folgende Ergebnisse.

movie_id Mitgliedsnummer Rückflugdatum CURDATE () ist überfällig
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Ja
2 3 25-06-2012 04-08-2012 Ja
2 2 25-06-2012 04-08-2012 Ja
3 3 NULL 04-08-2012 NULL

Beachten Sie die beiden NULL-Zeilen. Wenn `return_date` NULL ist, ergeben beide Vergleiche NULL anstatt TRUE oder FALSE, sodass keiner der IF-Zweige ausgeführt wird und die Funktion NULL zurückgibt – das erwartete Ergebnis, da ein nicht zurückgegebener Film kein Rückgabedatum zum Vergleichen hat.

Benutzerdefinierte Funktionen

Wenn SQL allein nicht schnell genug ist, MySQL ermöglicht eine dritte Option. Benutzerdefinierte Funktionen (UDFs) werden in einer kompilierten Sprache wie z. B. geschrieben. C or C++UDFs werden in eine gemeinsam genutzte Bibliothek eingebunden und beim Server registriert. Nach dem Hinzufügen werden sie wie jede andere Funktion aufgerufen. Da eine UDF als nativer Code innerhalb des Serverprozesses ausgeführt wird, eignet sie sich für rechenintensive Aufgaben – ein Fehler in einer UDF kann jedoch zum Absturz des Servers führen. Daher werden UDFs deutlich seltener verwendet als gespeicherte Funktionen.

Integrierte, gespeicherte und benutzerdefinierte Funktionen: Welche sollten Sie verwenden?

Alle drei Familien liefern einen einzelnen Wert zurück und können von jeder SQL-Anweisung aufgerufen werden. Sie unterscheiden sich jedoch darin, wer sie entwickelt hat, wo sie ausgeführt werden und welches Risiko damit verbunden ist. Die folgende Tabelle fasst diese Unterschiede zusammen.

Kriterium Eingebaute Funktionen Gespeicherte Funktionen Benutzerdefinierte Funktionen (UDFs)
Wer schreibt es Versand mit MySQL Sie in SQL Sie, in C oder C++
Wo es lebt Innerhalb des Servers Innerhalb der Datenbank, erstellt mit CREATE FUNCTION Kompilierte, gemeinsam genutzte Bibliothek, die vom Server geladen wurde
Typische Verwendung Formatierung, Mathematik, Aggregation Wiederverwendbare Geschäftsregeln wie beispielsweise ein überfälliger Scheck CPU-intensive oder spezialisierte Logik, die SQL nicht ausdrücken kann
Hauptrisiko Keine Präsentation Langsam, wenn die Abfrage zeilenweise über eine große Tabelle erfolgt. Ein Absturz der Bibliothek kann den Server lahmlegen.

Als Faustregel gilt: Beginnen Sie mit einer integrierten Funktion. Falls keine passt, schreiben Sie eine benutzerdefinierte Funktion, damit die Regel zentral definiert ist. Greifen Sie erst dann auf eine benutzerdefinierte Funktion zurück, wenn eine integrierte Funktion nachweislich zu langsam ist.

Häufig gestellte Fragen

Eine Funktion muss genau einen Wert zurückgeben und kann innerhalb eines SELECT-, WHERE- oder ORDER BY-Ausdrucks verwendet werden. Eine gespeicherte Prozedur gibt null oder mehrere Ergebnismengen zurück, kann nicht in einen Ausdruck eingebettet werden und wird mit der CALL-Anweisung aufgerufen.

Führen Sie DROP FUNCTION IF EXISTS sf_name aus; erstellen Sie es anschließend neu. MySQL hat keine CREATE OR REPLACE FUNKTION, und ALTER FUNKTION ändert nur Merkmale wie den Kommentar oder den Sicherheitstyp, niemals den Textkörper.

Das ist möglich. Eine Funktion, die eine indizierte Spalte in einer WHERE-Klausel umschließt, verhindert dies. MySQL Um dies zu vermeiden, wird ein vollständiger Scan erzwungen. Filtern Sie nach der Rohdatenspalte und wenden Sie die Funktion nur auf die SELECT-Liste an.

Ja. KI-Assistenten können CREATE FUNCTION-Code anhand einer einfach verständlichen Regel erstellen. Überprüfen Sie den generierten Code vor der Ausführung auf einem Produktivserver stets auf die korrekte DETERMINISTIC-Eigenschaft, die korrekte Behandlung von NULL-Werten und die korrekten Parameterdatentypen.

Nein. KI-Modelle können Funktionsnamen erfinden, NULL-Werte übersehen oder Versionsunterschiede ignorieren. Testen Sie jede generierte Funktion mit einer Kopie der Daten und überprüfen Sie die Ergebnisse anhand einer von Ihnen selbst erstellten und verifizierten Abfrage.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: