Les instructions :if,elseif,then,case
IF,ELSEIF,ELSE
Les instructions IF, ELSEIF, et ELSE sont utilisées dans les fonctions stockées MySQL pour prendre des décisions conditionnelles.
Elles permettent d'exécuter différentes parties du code en fonction de certaines conditions.
Exemple
-- Crée une nouvelle fonction stockée nommée "evaluer_note"
DELIMITER //
CREATE FUNCTION evaluer_note(
IN note DECIMAL(5, 2) -- Paramètre d'entrée : note à évaluer
)
RETURNS VARCHAR(255) -- La fonction renverra une chaîne de caractères
DETERMINISTIC
BEGIN
DECLARE evaluation VARCHAR(255); -- Variable pour stocker l'évaluation
-- Instructions conditionnelles
IF note >= 16 THEN
SET evaluation = 'Très bien';
ELSEIF note >= 14 THEN
SET evaluation = 'Bien';
ELSEIF note >= 12 THEN
SET evaluation = 'Assez bien';
ELSE
SET evaluation = 'Insuffisant';
END IF;
-- Renvoie l'évaluation
RETURN evaluation;
END//
-- Exemple d'appel de la fonction
SELECT evaluer_note(18); -- Renvoie 'Très bien'
SELECT evaluer_note(13); -- Renvoie 'Bien'
SELECT evaluer_note(11); -- Renvoie 'Assez bien'
SELECT evaluer_note(9); -- Renvoie 'Insuffisant'
CASE THEN
L'instruction CASE en SQL est utilisée pour effectuer une évaluation conditionnelle et renvoyer une valeur spécifique en fonction de différentes conditions.
Exemple1
SELECT nom,
age,
CASE
WHEN age < 18 THEN 'Mineur'
WHEN age >= 18 AND age < 65 THEN 'Adulte'
ELSE 'Senior'
END AS categorie_age
FROM personnes;
Résultats:
+--------+-----+--------------+
| nom | age | categorie_age|
+--------+-----+--------------+
| Alice | 15 | Mineur |
| Bob | 25 | Adulte |
| Carol | 68 | Senior |
| David | 40 | Adulte |
+--------+-----+--------------+
Exemple2
Crée une nouvelle fonction stockée nommée "evaluer_note_avec_case"
DELIMITER
CREATE FUNCTION evaluer_note_avec_case(
IN note DECIMAL(5, 2) -- Paramètre d'entrée : note à évaluer
)
RETURNS VARCHAR(255) -- La fonction renverra une chaîne de caractères
DETERMINISTIC
BEGIN
DECLARE evaluation VARCHAR(255); -- Variable pour stocker l'évaluation
-- Utilisation de l'instruction CASE pour évaluer la note
SET evaluation = CASE
WHEN note >= 16 THEN 'Très bien'
WHEN note >= 14 THEN 'Bien'
WHEN note >= 12 THEN 'Assez bien'
ELSE 'Insuffisant'
END;
-- Renvoie l'évaluation
RETURN evaluation;
END//
Exemple d'appel de la fonction
SELECT evaluer_note_avec_case(18); -- Renvoie 'Très bien'
SELECT evaluer_note_avec_case(13); -- Renvoie 'Bien'
SELECT evaluer_note_avec_case(11); -- Renvoie 'Assez bien'
SELECT evaluer_note_avec_case(9); -- Renvoie 'Insuffisant'
Exemples
1.Q Créez une fonction stockée nommée "tranchePrixProduit" qui prend en entrée l'ID d'un produit et renvoie une catégorie de prix ("Faible", "Moyen" ou "Élevé") en fonction du prix du produit.
CREATE FUNCTION tranchePrixProduit(idProduit INT) RETURNS VARCHAR(10)
BEGIN
DECLARE prixProduit FLOAT;
SELECT prix INTO prixProduit FROM produits WHERE id = idProduit;
IF prixProduit < 50 THEN
RETURN 'Faible';
ELSEIF prixProduit >= 50 AND prixProduit <= 100 THEN
RETURN 'Moyen';
ELSE
RETURN 'Élevé';
END IF;
END;
2.Q Créer une fonction stockée nommée "nomClient" qui prend en entrée l'ID d'un client et renvoie le nom complet du client avec une salutation en fonction du sexe du client?
CREATE FUNCTION nomClient(idClient INT) RETURNS VARCHAR(100)
BEGIN
DECLARE nomComplet VARCHAR(100);
DECLARE sexeClient CHAR(1);
SELECT CONCAT(nom, ' ', prenom) INTO nomComplet, sexe INTO sexeClient FROM clients WHERE id = idClient;
IF sexeClient = 'M' THEN
RETURN 'Monsieur ' + nomComplet;
ELSE
RETURN 'Madame ' + nomComplet;
END IF;
END;
3.Q Créez une fonction stockée nommée "disponibiliteProduit" qui prend en entrée l'ID d'un produit et renvoie "Disponible" si la quantité en stock est supérieure à zéro, sinon "Épuisé".
CREATE FUNCTION disponibiliteProduit(idProduit INT) RETURNS VARCHAR(10)
BEGIN
DECLARE quantiteStock INT;
SELECT quantiteStock INTO quantiteStock FROM produits WHERE id = idProduit;
IF quantiteStock > 0 THEN
RETURN 'Disponible';
ELSE
RETURN 'Épuisé';
END IF;
END;
4.Q Créer une fonction stockée nommée "categorisationClient" qui prend en entrée l'ID d'un client et renvoie sa catégorie ("Nouveau", "Régulier", ou "Premium") en fonction du nombre total d'achats?
CREATE FUNCTION categorisationClient(idClient INT) RETURNS VARCHAR(10)
BEGIN
DECLARE totalAchats INT;
SELECT SUM(prixVente * QuantiteVendue) INTO totalAchats FROM ventes WHERE idClient = idClient;
IF totalAchats < 100 THEN
RETURN 'Nouveau';
ELSEIF totalAchats >= 100 AND totalAchats < 500 THEN
RETURN 'Régulier';
ELSE
RETURN 'Premium';
END IF;
END;
5.Q Créez une fonction stockée nommée "remiseProduit" qui prend en entrée l'ID d'un produit et renvoie le pourcentage de remise applicable en fonction du prix du produit.
CREATE FUNCTION remiseProduit(idProduit INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE prixProduit DECIMAL(5,2);
SELECT prix INTO prixProduit FROM produits WHERE id = idProduit;
IF prixProduit < 50 THEN
RETURN 0.05; -- 5% de remise pour les produits à prix faible
ELSEIF prixProduit >= 50 AND prixProduit < 100 THEN
RETURN 0.1; -- 10% de remise pour les produits à prix moyen
ELSE
RETURN 0.15; -- 15% de remise pour les produits à prix élevé
END IF;
END;
6.Q Créer une fonction stockée nommée "statutCommande" qui prend en entrée l'ID d'une commande et renvoie son statut ("En cours", "Livré" ou "Annulé") en fonction de la date de livraison prévue?
CREATE FUNCTION statutCommande(idCommande INT) RETURNS VARCHAR(10)
BEGIN
DECLARE dateLivraisonPrevue DATE;
SELECT dateLivraison INTO dateLivraisonPrevue FROM commandes WHERE id = idCommande;
IF dateLivraisonPrevue > CURDATE() THEN
RETURN 'En cours';
ELSEIF dateLivraisonPrevue <= CURDATE() THEN
RETURN 'Livré';
ELSE
RETURN 'Annulé';
END IF;
END;
7.Q Créez une fonction stockée nommée "etiquetteProduit" qui prend en entrée l'ID d'un produit et renvoie une étiquette spéciale si le produit est en rupture de stock.
CREATE FUNCTION etiquetteProduit(idProduit INT) RETURNS VARCHAR(20)
BEGIN
DECLARE quantiteStock INT;
SELECT quantiteStock INTO quantiteStock FROM produits WHERE id = idProduit;
IF quantiteStock = 0 THEN
RETURN 'Rupture de stock';
ELSE
RETURN 'En stock';
END IF;
END;
8.Q Créer une fonction stockée nommée "commandesClient" qui prend en entrée l'ID d'un client et renvoie le nombre total de commandes passées par ce client en fonction du statut des commandes?
CREATE FUNCTION commandesClient(idClient INT, statut VARCHAR(10)) RETURNS INT
BEGIN
DECLARE totalCommandes INT;
IF statut = 'En cours' THEN
SELECT COUNT(*) INTO totalCommandes FROM commandes WHERE idClient = idClient AND statut = 'En cours';
ELSEIF statut = 'Livré' THEN
SELECT COUNT(*) INTO totalCommandes FROM commandes WHERE idClient = idClient AND statut = 'Livré';
ELSE
SELECT COUNT(*) INTO totalCommandes FROM commandes WHERE idClient = idClient;
END IF;
RETURN totalCommandes;
END;
9.Q Créer une fonction stockée nommée "livraisonExpress" qui prend en entrée la date de livraison prévue d'une commande et renvoie "Oui" si la livraison est prévue dans les trois prochains jours, sinon "Non"?
CREATE FUNCTION livraisonExpress(dateLivraisonPrevue DATE) RETURNS VARCHAR(3)
BEGIN
DECLARE dateActuelle DATE;
SET dateActuelle = CURDATE();
IF DATEDIFF(dateLivraisonPrevue, dateActuelle) <= 3 THEN
RETURN 'Oui';
ELSE
RETURN 'Non';
END IF;
END;
10.Q Créez une fonction stockée nommée "remiseCumulee" qui prend en entrée l'ID d'un client et renvoie le pourcentage total de réduction cumulée qu'il a reçu en fonction de ses commandes passées.
CREATE FUNCTION remiseCumulee(idClient INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE totalRemise DECIMAL(5,2);
SELECT SUM(prix * QuantiteVendue * remise) INTO totalRemise
FROM ventes
WHERE idClient = idClient;
RETURN totalRemise;
END;
11.Q Créer une fonction stockée nommée "fraisLivraison" qui prend en entrée la distance de livraison en kilomètres et renvoie les frais de livraison en fonction de la distance?
CREATE FUNCTION fraisLivraison(distanceKm INT) RETURNS DECIMAL(8,2)
BEGIN
DECLARE frais DECIMAL(8,2);
IF distanceKm <= 10 THEN
SET frais = 5.00;
ELSEIF distanceKm <= 20 THEN
SET frais = 10.00;
ELSE
SET frais = 15.00;
END IF;
RETURN frais;
END;
12.Q Créez une fonction stockée nommée "quantiteStockMinProduits" qui renvoie la quantité minimale en stock parmi tous les produits.
CREATE FUNCTION quantiteStockMinProduits() RETURNS INT
BEGIN
DECLARE minQuantiteStock INT;
SELECT MIN(quantiteStock) INTO minQuantiteStock FROM produits;
RETURN minQuantiteStock;
END;
13.Q Créer une fonction stockée nommée "nomProduitMoinsVendu" qui renvoie le libellé du produit le moins vendu?
CREATE FUNCTION nomProduitMoinsVendu() RETURNS VARCHAR(100)
BEGIN
DECLARE idProduitMoinsVendu INT;
SELECT idProduit INTO idProduitMoinsVendu
FROM ventes
GROUP BY idProduit
ORDER BY SUM(QuantiteVendue) ASC
LIMIT 1;
DECLARE libelleProduit VARCHAR(100);
SELECT libelle INTO libelleProduit FROM produits WHERE id = idProduitMoinsVendu;
RETURN libelleProduit;
END;
14.Q Créez une fonction stockée nommée "commandesNonLivrees" qui renvoie le nombre total de commandes en cours non encore livrées.
CREATE FUNCTION commandesNonLivrees() RETURNS INT
BEGIN
DECLARE totalCommandesNonLivrees INT;
SELECT COUNT(*) INTO totalCommandesNonLivrees FROM commandes WHERE statut = 'En cours';
RETURN totalCommandesNonLivrees;
END;
15.Q Créez une fonction stockée nommée "remiseClientFidele" qui prend en entrée l'ID d'un client et renvoie le pourcentage de réduction applicable en fonction du nombre total d'achats et du statut du client.
CREATE FUNCTION remiseClientFidele(idClient INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE totalAchats INT;
DECLARE categorieClient VARCHAR(10);
SELECT SUM(prixVente * QuantiteVendue) INTO totalAchats FROM ventes WHERE idClient = idClient;
SELECT categorie INTO categorieClient FROM clients WHERE id = idClient;
IF totalAchats >= 500 AND categorieClient = 'Régulier' THEN
RETURN 0.1; -- 10% de réduction pour les clients réguliers avec plus de 500 d'achats
ELSEIF totalAchats >= 1000 AND categorieClient = 'Premium' THEN
RETURN 0.15; -- 15% de réduction pour les clients premium avec plus de 1000 d'achats
ELSE
RETURN 0.05; -- 5% de réduction pour les autres clients
END IF;
END;
16.Q Créer une fonction stockée nommée "produitsEnRuptureAlerte" qui renvoie la liste des produits en rupture de stock avec une alerte si la quantité en stock est inférieure à un seuil critique?
CREATE FUNCTION produitsEnRuptureAlerte() RETURNS TEXT
BEGIN
DECLARE produitsRupture TEXT;
DECLARE seuilCritique INT;
SET seuilCritique = 10; -- Seuil critique de stock
SELECT GROUP_CONCAT(libelle SEPARATOR ', ') INTO produitsRupture FROM produits WHERE quantiteStock <= 0;
IF produitsRupture IS NULL THEN
RETURN 'Aucun produit en rupture.';
ELSEIF produitsRupture IS NOT NULL AND quantiteStock <= seuilCritique THEN
RETURN 'Alerte : ' + produitsRupture;
ELSE
RETURN produitsRupture;
END IF;
END;
17.Q Créez une fonction stockée nommée "classementClients" qui renvoie un classement des clients en fonction du nombre total d'achats, avec des catégories comme "Or", "Argent" et "Bronze".
CREATE FUNCTION classementClients() RETURNS VARCHAR(10)
BEGIN
DECLARE classement VARCHAR(10);
SELECT COUNT(*) INTO classement FROM clients;
IF classement IS NULL THEN
RETURN 'Aucun client.';
ELSEIF classement <= 10 THEN
RETURN 'Or';
ELSEIF classement <= 50 THEN
RETURN 'Argent';
ELSE
RETURN 'Bronze';
END IF;
END;
18.Q Créer une fonction stockée nommée "promotionClientVIP" qui prend en entrée l'ID d'un client et renvoie le pourcentage de réduction applicable en fonction du statut VIP du client?
CREATE FUNCTION promotionClientVIP(idClient INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE statutVIP CHAR(1);
SELECT statut INTO statutVIP FROM clients WHERE id = idClient;
IF statutVIP = 'O' THEN
RETURN 0.2; -- 20% de réduction pour les clients VIP
ELSE
RETURN 0.0; -- Aucune réduction pour les autres clients
END IF;
END;
19.Q Créez une fonction stockée nommée "classementProduit" qui renvoie la catégorie de classement d'un produit en fonction de ses ventes, comme "Meilleur vendeur", "Populaire" ou "Moins vendu".
CREATE FUNCTION classementProduit(idProduit INT) RETURNS VARCHAR(15)
BEGIN
DECLARE ventesProduit INT;
SELECT SUM(QuantiteVendue) INTO ventesProduit FROM ventes WHERE idProduit = idProduit;
IF ventesProduit >= 100 THEN
RETURN 'Meilleur vendeur';
ELSEIF ventesProduit >= 50 THEN
RETURN 'Populaire';
ELSE
RETURN 'Moins vendu';
END IF;
END;
20.Q Créer une fonction stockée nommée "promotionLivraison" qui prend en entrée la distance de livraison en kilomètres et renvoie les frais de livraison avec une réduction si la distance est supérieure à 50 km?
CREATE FUNCTION promotionLivraison(distanceKm INT) RETURNS DECIMAL(8,2)
BEGIN
DECLARE frais DECIMAL(8,2);
IF distanceKm <= 50 THEN
SET frais = 10.00;
ELSE
SET frais = 10.00 - (distanceKm - 50) * 0.25; -- Réduction de 0.25 par kilomètre excédentaire
END IF;
IF frais < 0 THEN
SET frais = 0.00; -- Frais minimum de 0
END IF;
RETURN frais;
END;
21.Q Créez une fonction stockée nommée "statutCommandeLivraison" qui prend en entrée l'ID d'une commande et renvoie son statut de livraison ("En cours", "Livré" ou "Retardé") en fonction de la date de livraison prévue et de la date actuelle.
CREATE FUNCTION statutCommandeLivraison(idCommande INT) RETURNS VARCHAR(10)
BEGIN
DECLARE dateLivraisonPrevue DATE;
DECLARE dateActuelle DATE;
SELECT dateLivraison INTO dateLivraisonPrevue FROM commandes WHERE id = idCommande;
SET dateActuelle = CURDATE();
IF dateLivraisonPrevue > dateActuelle THEN
RETURN 'En cours';
ELSEIF dateLivraisonPrevue = dateActuelle THEN
RETURN 'Livré';
ELSE
RETURN 'Retardé';
END IF;
END;
22.Q Créez une fonction stockée nommée "promotionProduit" qui prend en entrée l'ID d'un produit et renvoie le prix du produit avec une réduction en fonction de sa catégorie.
CREATE FUNCTION promotionProduit(idProduit INT) RETURNS DECIMAL(8,2)
BEGIN
DECLARE categorieProduit VARCHAR(15);
DECLARE prixProduit DECIMAL(8,2);
SELECT categorie INTO categorieProduit FROM produits WHERE id = idProduit;
SELECT prix INTO prixProduit FROM produits WHERE id = idProduit;
RETURN
CASE
WHEN categorieProduit = 'Électronique' THEN prixProduit * 0.9 -- Réduction de 10% pour les produits électroniques
WHEN categorieProduit = 'Vêtements' THEN prixProduit * 0.8 -- Réduction de 20% pour les produits vestimentaires
ELSE prixProduit
END;
END;
23.Q Créez une fonction stockée nommée "classementClient" qui renvoie la catégorie de classement d'un client en fonction du nombre total d'achats, avec des catégories telles que "Or", "Argent" ou "Bronze".
CREATE FUNCTION classementClient(idClient INT) RETURNS VARCHAR(10)
BEGIN
DECLARE totalAchats INT;
SELECT SUM(prixVente * QuantiteVendue) INTO totalAchats FROM ventes WHERE idClient = idClient;
RETURN
CASE
WHEN totalAchats >= 1000 THEN 'Or'
WHEN totalAchats >= 500 THEN 'Argent'
ELSE 'Bronze'
END;
END;
24.Q Créez une fonction stockée nommée "statutCommandeLivraison" qui prend en entrée l'ID d'une commande et renvoie son statut de livraison en fonction de la date de livraison prévue et de la date actuelle.
CREATE FUNCTION statutCommandeLivraison(idCommande INT) RETURNS VARCHAR(10)
BEGIN
DECLARE dateLivraisonPrevue DATE;
DECLARE dateActuelle DATE;
SELECT dateLivraison INTO dateLivraisonPrevue FROM commandes WHERE id = idCommande;
SET dateActuelle = CURDATE();
RETURN
CASE
WHEN dateLivraisonPrevue > dateActuelle THEN 'En cours'
WHEN dateLivraisonPrevue = dateActuelle THEN 'Livré'
ELSE 'Retardé'
END;
END;
25.Q Créez une fonction stockée nommée "remiseProduit" qui prend en entrée l'ID d'un produit et renvoie le pourcentage de réduction applicable en fonction de la catégorie du produit à l'aide de CASE ... WHEN.
CREATE FUNCTION remiseProduit(idProduit INT) RETURNS DECIMAL(5,2)
BEGIN
DECLARE categorieProduit VARCHAR(15);
DECLARE remise DECIMAL(5,2);
SELECT categorie INTO categorieProduit FROM produits WHERE id = idProduit;
SET remise =
CASE categorieProduit
WHEN 'Électronique' THEN 0.1 -- 10% de réduction pour les produits électroniques
WHEN 'Vêtements' THEN 0.2 -- 20% de réduction pour les produits vestimentaires
ELSE 0.0 -- Aucune réduction pour les autres catégories de produits
END;
RETURN remise;
END;
26.Q Créez une fonction stockée nommée "evaluationCommande" qui prend en entrée l'ID d'une commande et renvoie une évaluation en fonction du montant total de la commande en utilisant CASE ... WHEN.
CREATE FUNCTION evaluationCommande(idCommande INT) RETURNS VARCHAR(20)
BEGIN
DECLARE montantCommande DECIMAL(8,2);
SELECT SUM(prixVente * QuantiteVendue) INTO montantCommande FROM ventes WHERE idCommande = idCommande;
RETURN
CASE
WHEN montantCommande >= 500 THEN 'Excellente'
WHEN montantCommande >= 200 THEN 'Bonne'
WHEN montantCommande >= 100 THEN 'Moyenne'
ELSE 'Insuffisante'
END;
END;