MySQL Fonctions : chaîne, numérique, définie par l'utilisateur, stockée

⚡ Résumé intelligent

MySQL Les fonctions transforment les données avant leur stockage ou leur récupération, et renvoient un résultat unique. Cet article explique les fonctions intégrées pour les chaînes de caractères, les nombres et les dates, puis montre comment les fonctions stockées et définies par l'utilisateur étendent le moteur de base de données.

  • 🔤 Fonctions de chaînes de caractères : UCASE, LCASE et CONCAT remodèlent le texte au moment de la requête ; ils attribuent un alias à la colonne calculée avec AS afin que l’ensemble de résultats comporte un en-tête lisible.
  • (I.e. Numérique Operateurs : DIV effectue une division entière, / renvoie un quotient décimal et % (ou MOD) renvoie le reste d'une division.
  • 📅 Fonctions de date : DATE_FORMAT convertit la valeur YYYY-MM-DD stockée en n'importe quel format d'affichage, tel que %d-%m-%Y, sans modifier une seule ligne de code de l'application.
  • Fonctions enregistrées : CREATE FUNCTION enregistre une logique réutilisable au sein du serveur ; déclarez-la NOT DETERMINISTIC chaque fois que le corps appelle CURDATE() ou NOW().
  • ⚙️ Fonctions définies par l'utilisateur : Routines externes écrites en C ou C++ sont compilées sur le serveur et se comportent ensuite exactement comme des fonctions natives.
  • 🚀 Impact sur les performances : L'intégration des calculs dans la base de données élimine la duplication de la logique dans chaque application cliente et réduit les allers-retours réseau.

Quels sont MySQL Les fonctions?

MySQL peut faire bien plus que simplement stocker et récupérer des données. Ça peut aussi effectuer des manipulations sur les données avant de le récupérer ou de l'enregistrer. C'est là que MySQL C'est là qu'interviennent les fonctions. Les fonctions sont simplement des portions de code qui effectuent une opération et renvoient un résultat. Certaines fonctions acceptent des paramètres, tandis que d'autres n'en acceptent aucun.

Prenons brièvement un exemple. Par défaut, MySQL enregistre les données de type date au format « AAAA-MM-JJ ». Supposons que nous ayons développé une application et que nos utilisateurs souhaitent que la date soit renvoyée au format « JJ-MM-AAAA ». Nous pouvons utiliser le MySQL La fonction intégrée DATE_FORMAT permet d'obtenir ce résultat. DATE_FORMAT est l'une des fonctions les plus utilisées. MySQLet nous l'examinerons en détail plus loin dans cette leçon.

Quel que soit son type, une fonction renvoie toujours une seule valeur, peut accepter zéro ou plusieurs paramètres entre parenthèses, et peut être utilisé partout où une expression est autorisée — dans une liste SELECT, une clause WHERE ou une clause ORDER BY.

Pourquoi utiliser MySQL Les fonctions?

Maintenant que nous savons ce qu'est une fonction, la question suivante est de savoir pourquoi nous devrions intégrer ce travail dans la base de données.

Pourquoi utiliser MySQL Les fonctions

Comme le montre le schéma ci-dessus, une fonction prend une valeur en entrée, applique la logique une seule fois dans le moteur de base de données et renvoie un résultat unique à chaque application qui le demande.

Les programmeurs se demandent peut-être : « Pourquoi s'embêter avec… » MySQL Des fonctions ? Le même effet peut être obtenu avec un langage de script ou de programmation. Il est vrai que nous pouvons y parvenir en écrivant une procédure dans le programme d’application.

Pour revenir à notre exemple de DATE, afin que nos utilisateurs obtiennent les données au format souhaité, la couche métier devrait effectuer elle-même le traitement nécessaire.

Cela devient un problème lorsque l'application doit s'intégrer à d'autres systèmes. Quand on utilise MySQL Des fonctions telles que DATE_FORMAT sont intégrées à la base de données, et toute application ayant besoin des données les obtient au format requis. réduit les reprises dans la logique métier et les incohérences de données..

Une autre raison à considérer MySQL Leur fonction est de contribuer à réduire le trafic réseau dans les applications client/serveur.La couche métier n'a qu'à appeler la fonction stockée, sans avoir à récupérer les données brutes sur le réseau pour les manipuler. En moyenne, l'utilisation de fonctions peut améliorer considérablement les performances globales du système.

Types d' MySQL Les fonctions

Maintenant que nous avons clarifié le « quoi » et le « pourquoi », nous pouvons examiner les trois familles de fonctions. MySQL Il propose : des fonctions intégrées, des fonctions enregistrées et des fonctions définies par l’utilisateur.

Les fonctions intégrées

MySQL est livré avec un certain nombre de fonctions intégrées — des fonctions déjà implémentées dans le MySQL serveur. Ils nous permettent d'effectuer de nombreux types de manipulations sur les données et se répartissent dans les groupes couramment utilisés suivants.

  • Fonctions de chaîne – opérer sur des types de données chaîne
  • Fonctions numériques – opérer sur des types de données numériques
  • Fonctions de date – opérer sur les types de données de date
  • Fonctions d'agrégation – opérer sur tous les types de données ci-dessus et produire des ensembles de résultats résumés.
  • Autres fonctions - MySQL Il prend également en charge d'autres types de fonctions intégrées, mais nous limitons cette leçon aux groupes mentionnés ci-dessus.

Examinons maintenant en détail chacun des groupes mentionnés ci-dessus. Nous expliquerons les fonctions les plus utilisées à l'aide de notre base de données exemple « Myflixdb ».

Fonctions de chaîne

Les fonctions de chaînes de caractères s'appliquent aux valeurs textuelles. Dans notre table de films, les titres sont stockés en utilisant un mélange de lettres minuscules et majuscules. Supposons que nous souhaitions une requête qui renvoie les titres en majuscules. La fonction « UCASE » prend une chaîne de caractères comme paramètre et convertit chaque lettre en majuscule, comme le montre le script ci-dessous.

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

ICI. (en anglais seulement)

  • UCASE(`titre`) est la fonction intégrée qui prend le titre comme paramètre et le renvoie en lettres majuscules.
  • AS `upper_case_title` attribue un alias à la colonne calculée, de sorte que l'ensemble de résultats comporte un en-tête lisible au lieu de l'expression brute.

Exécuter le script ci-dessus dans MySQL L'analyse de Workbench sur la base de données Myflixdb nous donne les résultats présentés ci-dessous.

id_film titre titre en majuscules
16 67% Coupable 67 % COUPABLES
6 anges et démons ANGES ET DÉMONS
4 Code Nom Noir NOM DE CODE NOIR
5 Les petites filles à papa LES PETITES FILLES DE PAPA
7 Da Vinci Code CODE DE DAVINCI
2 Oublier Sarah Marshal OUBLIER SARAH MARSHAL
9 Honey moonERS MON CHÉRI MOONERS
19 film 3 FILM 3
1 Pirates des Caraïbes 4 PIRATES DES CARAÏBES 4
18 extrait de film EXTRAIT DE FILM
17 Le Dictateur LE GRAND DICTATEUR
3 X Men X MEN

Deux autres outils méritent d'être mentionnés aux côtés d'UCASE : CASE convertit une chaîne de caractères en minuscules, et CONCAT joint deux chaînes de caractères ou plus en une seule. Pour la liste complète, reportez-vous à la section suivante : MySQL référence de fonction de chaîne.

Fonctions numériques

Comme indiqué précédemment, les fonctions numériques s'appliquent aux types de données numériques. Nous pouvons également effectuer des calculs mathématiques directement sur des données numériques dans nos requêtes SQL.

Opérateurs arithmétiques

MySQL prend en charge les opérateurs arithmétiques suivants, qui peuvent être utilisés pour effectuer des calculs dans les instructions SQL.

Nom Description
DIV Division entière
/ Division
- Soltracproduction
+ Addition
* Multiplier
% ou MOD Module

Vous trouverez ci-dessous des exemples pour chaque opérateur.

Division entière (DIV) — La fonction DIV supprime la partie fractionnaire et ne renvoie que le nombre entier.

SELECT 23 DIV 6;

L'exécution du script ci-dessus nous donne : 3.

Opérateur de division (/) — Contrairement à DIV, l'opérateur de division conserve la partie décimale du résultat.

SELECT 23 / 6;

L'exécution du script ci-dessus nous donne : 3.8333.

Soltracopérateur de tion (-)

SELECT 23 - 6;

L'exécution du script ci-dessus nous donne : 17.

Opérateur d'addition (+)

SELECT 23 + 6;

L'exécution du script ci-dessus nous donne : 29.

Opérateur de multiplication (*)

SELECT 23 * 6 AS `multiplication_result`;

Résultat:

résultat_multiplication
138

Opérateur modulo (% ou MOD)

L'opérateur modulo divise N par M et nous donne le reste. Prenons l'exemple de l'opérateur modulo, en utilisant les mêmes valeurs que dans les exemples précédents.

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

L'exécution de l'un ou l'autre script nous donne 5.

Examinons maintenant certaines des fonctions numériques courantes dans MySQL.

SOL Cette fonction supprime la virgule d'un nombre et l'arrondit à l'entier inférieur. Le script ci-dessous illustre son utilisation.

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

Résultat:

résultat_plancher
3

ROUND Cette fonction arrondit un nombre à l'entier le plus proche. Comme 23 / 6 vaut 3.8333, la fonction ARRONDI renvoie 4 tandis que la fonction PLANCHER renvoie 3 ; les deux ne sont donc pas interchangeables.

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

Résultat:

résultat_du_round
4

RAND Cette fonction génère un nombre aléatoire. Sa valeur change à chaque appel. Le script ci-dessous illustre son utilisation.

SELECT RAND() AS `random_result`;

Fonctions de date

Les fonctions de date s'appliquent aux types de données date et date-heure. La fonction DATE_FORMAT résout le problème « AAAA-MM-JJ versus JJ-MM-AAAA » décrit dans l'introduction.

FORMAT DE DATE Cette fonction prend deux paramètres : la date à formater et une chaîne de format construite à partir d’espaces réservés. Le script ci-dessous renvoie chaque date de publication au format jour-mois-année demandé par nos utilisateurs.

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

Les espaces réservés de format les plus fréquemment utilisés sont listés ci-dessous.

placeholder Sens Exemple de sortie
%d Jour du mois, deux chiffres 04
%m Mois, deux chiffres 08
%Y Année, quatre chiffres 2012
%M Nom du mois en entier Août
%Son Hours, minutes, secondes 14:35:09

Trois autres fonctions de date apparaissent constamment dans le travail quotidien :

  • CURDATE() renvoie la date actuelle au format AAAA-MM-JJ.
  • À PRÉSENT() renvoie la date actuelle et le temps.
  • DATEDIFF(d1, d2) renvoie le nombre de jours entre deux dates — la base de tout rapport de loyer impayé.

Pour la liste complète, voir le MySQL Référence de la fonction date et heure.

Fonctions stockées

Les fonctions intégrées couvrent les cas courants. Lorsqu'une règle métier est plus spécifique, nous écrivons notre propre fonction ; c'est le rôle d'une fonction stockée.

Les fonctions stockées se comportent comme les fonctions intégrées, à la différence qu'elles sont définies par vos soins. Une fois créée, une fonction stockée peut être utilisée dans les requêtes SQL comme n'importe quelle autre fonction. La syntaxe de base est présentée ci-dessous.

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

ICI. (en anglais seulement)

  • « CRÉER LA FONCTION sf_name ([paramètre(s)]) » est obligatoire et indique le MySQL serveur pour créer une fonction nommée `sf_name` avec des paramètres optionnels définis entre parenthèses.
  • « RETOURNE le type de données » est obligatoire et spécifie le type de données que la fonction renvoie.
  • « DÉTERMINISTE » déclare que la fonction renvoie la même valeur chaque fois que les mêmes arguments sont fournis. « NON DÉTERMINISTE » déclare le contraire.
  • « DÉBUT… FIN » enrobe le code procédural exécuté par la fonction.

Supposons que nous souhaitions savoir quels films loués sont en retard. Nous pouvons créer une fonction stockée qui prend la date de retour en paramètre et la compare à la date actuelle sur le serveur. Si la date actuelle est postérieure à la date de retour, le film est en retard et nous renvoyons « Oui » ; sinon, nous renvoyons « Non ».

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 ;

⚠️ Avertissement — ne qualifiez pas cette fonction de DÉTERMINISTIQUE. Le corps de la fonction appelle CURDATE(), de sorte que le même argument peut renvoyer « Non » aujourd'hui et « Oui » demain. Déclarer une fonction dépendante du temps comme DETERMINISTIC induit en erreur l'optimiseur et est dangereux pour la réplication basée sur les instructions. PAS DÉTERMINISTE chaque fois que le corps appelle CURDATE(), NOW() ou RAND().

L'exécution du script ci-dessus crée la fonction stockée `sf_past_movie_return_date`. Testons-la maintenant.

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

Exécuter le script ci-dessus dans MySQL Workbench appliqué à myflixdb nous donne les résultats suivants.

id_film numéro de membre date de retour CURDATE() est_en_dépassement
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Oui
2 3 25-06-2012 04-08-2012 Oui
2 2 25-06-2012 04-08-2012 Oui
3 3 NULL 04-08-2012 NULL

Remarquez les deux lignes NULL. Lorsque `return_date` est NULL, les deux comparaisons renvoient NULL au lieu de TRUE ou FALSE ; par conséquent, aucune des deux branches IF n’est exécutée et la fonction renvoie NULL — le résultat attendu, puisqu’un film non retourné n’a pas de date de retour à laquelle se comparer.

Les fonctions définies par l'utilisateur

Lorsque SQL seul n'est pas suffisamment rapide, MySQL permet une troisième option. Les fonctions définies par l'utilisateur (UDF) sont écrites dans un langage compilé tel que C or C++Intégrées à une bibliothèque partagée et enregistrées auprès du serveur, les fonctions définies par l'utilisateur (UDF) s'appellent comme n'importe quelle autre fonction. Comme elles s'exécutent comme du code natif au sein du processus serveur, elles sont particulièrement adaptées aux calculs intensifs. Cependant, un bug peut entraîner le plantage du serveur ; c'est pourquoi les UDF sont beaucoup moins fréquemment utilisées que les fonctions stockées.

Fonctions intégrées, fonctions stockées et fonctions définies par l'utilisateur : lesquelles utiliser ?

Ces trois familles de fonctions renvoient une valeur unique et peuvent être appelées depuis n'importe quelle requête SQL. Elles diffèrent cependant par leur auteur, leur environnement d'exécution et le niveau de risque associé. Le tableau ci-dessous récapitule ces différences.

Critère Les fonctions intégrées Fonctions stockées Fonctions définies par l'utilisateur (UDF)
Qui l'écrit Livré avec MySQL Vous, en SQL Vous, en C ou C++
Où il vit À l'intérieur du serveur Dans la base de données, créée avec CREATE FUNCTION Bibliothèque partagée compilée chargée par le serveur
Utilisation typique Mise en forme, mathématiques, agrégation Règles commerciales réutilisables telles qu'un chèque en retard SQL ne peut pas exprimer une logique gourmande en ressources processeur ou spécialisée.
Risque principal Aucun Lent si appelé ligne par ligne sur une grande table Un plantage de la bibliothèque peut entraîner l'arrêt du serveur.

En règle générale, commencez par une fonction intégrée. Si aucune ne convient, créez une fonction stockée afin de centraliser la règle. N'utilisez une fonction définie par l'utilisateur (UDF) que si une fonction stockée est nettement trop lente.

FAQ

Une fonction doit renvoyer une seule valeur et peut être utilisée dans une clause SELECT, WHERE ou ORDER BY. Une procédure stockée peut renvoyer zéro ou plusieurs résultats, ne peut pas être intégrée à une expression et est appelée avec l'instruction CALL.

Exécutez DROP FUNCTION IF EXISTS sf_name ; puis recréez-la. MySQL Cette fonction ne possède pas de fonction CREATE OR REPLACE et la fonction ALTER ne modifie que des caractéristiques telles que le commentaire ou le type de sécurité, jamais le corps du texte.

Oui, c'est possible. Une fonction encapsulant une colonne indexée dans une clause WHERE empêche cela. MySQL L'utilisation de cet index force une analyse complète. Filtrez sur la colonne brute et appliquez la fonction uniquement à la liste SELECT.

Oui. Les assistants IA peuvent générer du code CREATE FUNCTION à partir d'une règle en langage clair. Avant d'exécuter le code sur un serveur de production, vérifiez toujours la présence de la caractéristique DETERMINISTIC, la gestion des valeurs NULL et les types de données des paramètres.

Non. Les modèles d'IA peuvent inventer des noms de fonctions, ignorer les valeurs NULL ou les différences de version. Testez chaque fonction générée sur une copie des données et comparez les résultats avec une requête que vous avez écrite et vérifiée vous-même.

Résumez cet article avec :