Parte 1
Langage de programmaton procédural de MySQL
1. Déclaraton de variables locales (dans un bloc ou une procédure)
Les variables locales son ulisées dans les blocs de code els que les procédures sockées, les oncons, ou les
déclencheurs. Elles son déclarées avec la commande DECLARE e ne son disponibles que dans le conexe où
elles son créées.
Exemple 1 d'utlisaton dans une procédure sockée :
DELIMITER //
CREATE PROCEDURE exemple_procedure()
BEGIN
DECLARE ma_variable INT; -- Déclaration d'une variable locale
SET ma_variable = 10; -- Affectation d'une valeur à la variable
-- Utilisation de la variable dans une requête
SELECT ma_variable;
END //
DELIMITER ;
Dans ce exemple, ma_variable es une variable locale qui n'es accessible qu'à l'inérieur de la procédure
exemple_procedure.
Exemple 2 d'utlisaton dans une procédure sockée :
DELIMITER $$
CREATE PROCEDURE calcul_salaire_total()
BEGIN
-- Déclaration de variables locales
DECLARE salaire_base DECIMAL(10, 2);
DECLARE bonus DECIMAL(10, 2);
DECLARE salaire_total DECIMAL(10, 2);
-- Initialisation des variables
SET salaire_base = 2000.00;
SET bonus = 500.00;
-- Calcul du salaire total
SET salaire_total = salaire_base + bonus;
-- Affichage du résultat
SELECT CONCAT('Le salaire total est : ', salaire_total) AS resultat;
END $$
DELIMITER ;
SQUALLI MED 1
2. Déclaraton de variables utlisaeur (variables de session)
Les variables ulisaeur son des variables que vous pouvez déclarer au niveau de la session MySQL. Elles
persisen an que la session es acve, e peuven êre ulisées dans plusieurs requêes dans la même
session.
Exemple d'utlisaton des variables utlisaeur :
SET @ma_variable_utilisateur = 25; -- Déclaration et affectation de la variable
SELECT @ma_variable_utilisateur; -- Utilisation de la variable
Les variables ulisaeur commencen oujours par le symbole @ e peuven êre ulisées dans des requêes
ulérieures au sein de la même session.
Diérences :
• Les variables locales ne son valides qu'à l'inérieur du bloc de code où elles son déclarées, comme les
procédures ou les déclencheurs.
• Les variables utlisaeur peuven êre ulisées enre diérenes requêes, mais seulemen pendan la
durée de vie de la session.
Ces deux ypes de variables permeten de gérer des données emporaires e d'améliorer la fexibilié dans les
requêes SQL.
3. IF e ELSEIF dans une procédure sockée
L'insrucon IF perme de gérer des condions, andis que ELSEIF perme d'ajouer des condions
supplémenaires. Voici un exemple dans une procédure sockée où on ulise IF...ELSEIF...ELSE.
Exemple : Utlisaton de IF...ELSEIF...ELSE
DELIMITER //
CREATE PROCEDURE verifier_age(IN age INT)
BEGIN
IF age < 18 THEN
SELECT 'Vous êtes mineur.' AS resultat;
ELSEIF age >= 18 AND age < 65 THEN
SELECT 'Vous êtes adulte.' AS resultat;
ELSE
SELECT 'Vous êtes senior.' AS resultat;
END IF;
END //
DELIMITER ;
EXECUTION :
SET @p0='16'; CALL `verifier_age`(@p0);
SET @p0='50'; CALL `verifier_age`(@p0);
SQUALLI MED 2
4. L'insructon CASE
CASE es une aure srucure condionnelle qui perme de simplier plusieurs condions dans une seule
expression. Elle peu êre ulisée soi dans une requêe SQL, soi dans un bloc de code comme une procédure.
Exemple 1 : Utlisaton de CASE dans une requêe SQL
Voici un exemple d'ulisaon de CASE pour acher un message selon la noe d'un éudian.
1--
CREATE TABLE etudiants (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
age INT NOT NULL,
note DECIMAL(5,2) NOT NULL
);
2--
INSERT INTO etudiants (nom, age, note)
VALUES
('Alice Dupont', 20, 85.50),
('Bob Martin', 22, 78.75),
('Charlie Durand', 19, 92.00),
('Diane Bernard', 21, 45.00),
('Eve Leroy', 23, 60.25);
--3
SELECT nom,
note,
CASE
WHEN note >= 90 THEN 'Excellent'
WHEN note >= 75 THEN 'Bien'
WHEN note >= 50 THEN 'Passable'
ELSE 'Échec'
END AS evaluation
FROM etudiants;
Exemple 2 : Utlisaton de CASE dans une procédure sockée
Voici un exemple similaire dans une procédure :
CREATE PROCEDURE evaluer_note(IN note INT)
BEGIN
SELECT CASE
WHEN note >= 90 THEN 'Excellent'
WHEN note >= 75 THEN 'Bien'
WHEN note >= 50 THEN 'Passable'
ELSE 'Échec'
END AS evaluation;
END //
EXECUTION :
SET @p0='80'; CALL `evaluer_note`(@p0);
SQUALLI MED 3
SET @p1='33'; CALL `evaluer_note`(@p1);
5. Les insructons iérats (Boucle)
En MySQL, il n'y a pas de boucle FOR direcemen comme dans d'aures langages de programmaon, mais
vous pouvez uliser les boucles WHILE, REPEAT, e LOOP dans des procédures sockées ou des oncons pour
exécuer des insrucons répéées.
5.1. Boucle WHILE
La boucle WHILE répèe les insrucons an qu'une condion es vraie. Voici un exemple de procédure
ulisan une boucle WHILE pour acher les nombres de 1 à 5.
Exemple1 : Ulisaon de la boucle WHILE
DELIMITER //
CREATE PROCEDURE boucle_while()
BEGIN
DECLARE i INT DEFAULT 1; -- Déclaration et initialisation de la variable
WHILE i <= 5 DO
SELECT CONCAT('i = ', i); -- Affiche la valeur de i
SET i = i + 1; -- Incrémentation de i
END WHILE;
END //
DELIMITER ;
5.2. Boucle REPEAT
La boucle REPEAT onconne de manière similaire à WHILE, mais la condion es vériée à la fn de chaque
iéraon (donc la boucle s'exécue au moins une ois).
Exemple : Utlisaton de la boucle REPEAT
DELIMITER //
CREATE PROCEDURE boucle_repeat()
BEGIN
DECLARE i INT DEFAULT 1; -- Initialisation de la variable
REPEAT
SELECT CONCAT('i = ', i); -- Affiche la valeur de i
SET i = i + 1; -- Incrémente la variable i
UNTIL i > 5 -- Condition d'arrêt : quand i dépasse 5
END REPEAT;
END //
DELIMITER ;
SQUALLI MED 4
5.3. Boucle LOOP
La boucle LOOP es une srucure de boucle générale dans MySQL, qui connue jusqu'à ce qu'une commande
explicie LEAVE soi exécuée.
Exemple : Utlisaton de la boucle LOOP
DELIMITER //
CREATE PROCEDURE boucle_loop()
BEGIN
DECLARE i INT DEFAULT 1; -- Initialisation de la variable
boucle: LOOP
IF i > 5 THEN -- Condition d'arrêt de la boucle
LEAVE boucle;
END IF;
SELECT CONCAT('i = ', i); -- Affiche la valeur de i
SET i = i + 1; -- Incrémentation de la variable i
END LOOP;
END //
DELIMITER ;
6. Le ypes de paramères
En MySQL, une procédure peu avoir diérens ypes de paramères qui déerminen commen les données
son passées à la procédure e commen elles son manipulées. Les rois principaux ypes de paramères son :
1. IN : Paramère d'enrée. Il passe une valeur à la procédure, mais cete valeur ne peu pas êre modiée
à l'inérieur de la procédure.
2. OUT : Paramère de sore. Il perme à la procédure de renvoyer une valeur modiée.
3. INOUT : Paramère d'enrée e de sore. Il passe une valeur à la procédure, mais la procédure peu
égalemen la modier e la renvoyer.
1. Paramère IN
Le paramère IN es ulisé pour ournir des valeurs à une procédure. Ces valeurs ne peuven pas êre
modiées dans la procédure.
Exemple avec IN
Supposons que nous ayons une able éudiane, e nous voulons créer une procédure qui ache les
inormaons d'un éudian en oncon de son id.
SQUALLI MED 5
DELIMITER //
CREATE PROCEDURE afficher_etudiant(IN etudiant_id INT)
BEGIN
SELECT nom, age, note
FROM etudiants
WHERE id = etudiant_id;
END //
DELIMITER ;
SET @p0='2'; CALL `afficher_etudiant`(@p0);
2. Paramère OUT
Le paramère OUT perme à une procédure de renvoyer une valeur. Conrairemen à IN, vous ne passez pas de
valeur au paramère lors de l'appel, mais vous pouvez récupérer une valeur à la n de l'exécuon de la
procédure.
Exemple avec OUT
Créons une procédure qui reourne la noe d'un éudian en oncon de son id.
DELIMITER //
CREATE PROCEDURE obtenir_note(IN etudiant_id INT, OUT etudiant_note DECIMAL(5,2))
BEGIN
SELECT note INTO etudiant_note
FROM etudiants
WHERE id = etudiant_id;
END //
DELIMITER ;
EXECUTION:
SET @p0='2'; SET @p1=''; CALL `obtenir_note`(@p0, @p1);
SELECT @p1 AS `etudiant_note`;
3. Paramère INOUT
Le paramère INOUT agi à la ois comme un paramère d'enrée e un paramère de sore. Vous passez une
valeur à la procédure e la procédure peu modier cete valeur e la renvoyer.
Exemple avec INOUT
Créons une procédure qui augmene la noe d'un éudian de 10%, puis reourne la nouvelle noe.
SQUALLI MED 6
DELIMITER //
CREATE PROCEDURE augmenter_note(INOUT etudiant_note DECIMAL(5,2))
BEGIN
SET etudiant_note = etudiant_note * 1.10;
END //
DELIMITER ;
EXECUTION :
SET @p0='10'; CALL `augmenter_note`(@p0);
SELECT @p0 AS `etudiant_note`;
7. Les Fonctons
En MySQL, les oncons son des blocs de code réulisables qui prennen des argumens, exécuen une série
d'insrucons, e reournen une valeur. Conrairemen aux procédures, les oncons doiven reourner une
valeur e elles peuven êre ulisées direcemen dans des requêes SQL, comme dans les clauses SELECT,
WHERE, ou ORDER BY.
Srucure d'une Foncon en MySQL
Voici la synaxe générale pour créer une oncon en MySQL :
CREATE FUNCTION nom_de_la_fonction (paramètre1 TYPE, paramètre2 TYPE, ...)
RETURNS TYPE
BEGIN
-- corps de la fonction
RETURN valeur;
END;
7.1. Exemple simple : Foncton pour ajouer deux nombres
Créons une oncon qui prend deux nombres e reourne leur somme.
DELIMITER //
CREATE FUNCTION additionner_deux_nombres(a INT, b INT)
RETURNS INT
BEGIN
RETURN a + b;
END //
DELIMITER ;
EXECUTION:
SELECT additionner_deux_nombres(10, 20) AS somme;
SQUALLI MED 7
7.2. Exemple : Foncton pour calculer une moyenne
Cete oncon calcule la moyenne de deux nombres.
DELIMITER //
CREATE FUNCTION moyenne_deux_nombres(a DECIMAL(5,2), b DECIMAL(5,2))
RETURNS DECIMAL(5,2)
BEGIN
RETURN (a + b) / 2;
END //
DELIMITER ;
EXECUTION :
SELECT moyenne_deux_nombres(75.5, 88.0) AS moyenne;
7.3. Exemple : Foncton pour récupérer un éudian par son ID
Imaginons que vous ayez une able eudians (comme dans les exemples précédens) e que vous souhaiez
récupérer le nom d'un éudian en oncon de son ID.
Créaton de la able eudians pour l'exemple :
CREATE TABLE etudiants (
id INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(100) NOT NULL,
age INT NOT NULL,
note DECIMAL(5,2) NOT NULL
);
INSERT INTO etudiants (nom, age, note)
VALUES
('Alice Dupont', 20, 85.50),
('Bob Martin', 22, 78.75),
('Charlie Durand', 19, 92.00),
('Diane Bernard', 21, 45.00);
DELIMITER //
CREATE FUNCTION obtenir_nom_etudiant(etudiant_id INT)
RETURNS VARCHAR(100)
BEGIN
DECLARE nom_etudiant VARCHAR(100);
SELECT nom INTO nom_etudiant
FROM etudiants
WHERE id = etudiant_id;
RETURN nom_etudiant;
END //
DELIMITER ;
EXECUTION:
SELECT obtenir_nom_etudiant(1) AS nom;
SQUALLI MED 8
7.4. Exemple : Foncton pour augmener la noe d'un éudian
Voici une oncon qui prend la noe acuelle d'un éudian e l'augmene de 10%.
DELIMITER //
CREATE FUNCTION augmenter_note(note_actuelle DECIMAL(5,2))
RETURNS DECIMAL(5,2)
BEGIN
RETURN note_actuelle * 1.10;
END //
DELIMITER ;
EXECUTION:
SELECT augmenter_note(75.50) AS nouvelle_note;
7.5. Exemple : Foncton pour vérifer si une noe es valide
Cete oncon vérie si une noe es valide (enre 0 e 100).
DELIMITER //
CREATE FUNCTION note_valide(note DECIMAL(5,2))
RETURNS BOOLEAN
BEGIN
IF note >= 0 AND note <= 100 THEN
RETURN TRUE;
ELSE
RETURN FALSE;
END IF;
END //
DELIMITER ;
EXECUTION :
SELECT note_valide(85.50) AS est_valide;
7.6. La déclaraton inormatve
Elle peu prendre l’une des valeurs :
1. DETERMINISTIC / NOT DETERMINISTIC :
o DETERMINISTIC : Indique que la oncon renverra oujours le même résula lorsqu'elle es
appelée avec les mêmes argumens.
o NOT DETERMINISTIC : Indique que la oncon pourrai reourner des résulas diérens pour
les mêmes argumens, par exemple si elle ulise une oncon non déerminise comme RAND()
ou NOW().
2. READS SQL DATA :
o Indique que la oncon li des données SQL (via des requêes SELECT par exemple) mais ne
modie pas la base de données.
SQUALLI MED 9
3. MODIFIES SQL DATA :
o Indique que la oncon peu modier la base de données (par exemple en ulisan INSERT,
UPDATE, DELETE, ec.).
4. CONTAINS SQL :
o Indique que la oncon conen des insrucons SQL, mais ne li ni ne modie les données de
la base (cela peu inclure des requêes qui n’ineragissen pas direcemen avec les données,
comme SET).
Exemples pour chaque cas :
1. Foncton DETERMINISTIC
Une oncon déerminise reourne oujours le même résula pour les mêmes argumens.
Exemple :
DELIMITER //
CREATE FUNCTION ajouter_cinq(valeur INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN valeur + 5;
END //
DELIMITER ;
Cete oncon es DETERMINISTIC parce que pour un même argumen, elle renverra oujours le même
résula. Par exemple, si vous passez 10 à cete oncon, elle reournera oujours 15.
2. Foncton NOT DETERMINISTIC
Si la oncon ulise une oncon comme RAND() ou NOW(), elle sera considérée comme NOT
DETERMINISTIC.
Exemple :
DELIMITER //
CREATE FUNCTION obtenir_nombre_aleatoire()
RETURNS DECIMAL(5,2)
NOT DETERMINISTIC
BEGIN
RETURN RAND();
END //
DELIMITER ;
SELECT obtenir_nombre_aleatoire()
Cete oncon es NOT DETERMINISTIC parce que la oncon RAND() reourne un nombre aléaoire à chaque
appel, même si les argumens son les mêmes.
SQUALLI MED 10
3. Foncton READS SQL DATA
Une oncon qui li les données d'une able sans les modier doi êre marquée comme READS SQL DATA.
Exemple :
DELIMITER //
CREATE FUNCTION obtenir_nom_etudiant1(etudiant_id INT)
RETURNS VARCHAR(100)
READS SQL DATA
BEGIN
DECLARE nom_etudiant VARCHAR(100);
SELECT nom INTO nom_etudiant
FROM etudiants
WHERE id = etudiant_id;
RETURN nom_etudiant;
END //
DELIMITER ;
select obtenir_nom_etudiant1(2) nom_etutiant;
Cete oncon li les données de la able eudians (via SELECT), mais ne modie pas la base de données. Elle
es donc marquée comme READS SQL DATA.
4. Foncton MODIFIES SQL DATA
Si la oncon eecue une modicaon sur la base de données, elle doi êre marquée comme :
MODIFIES SQL DATA.
Exemple :
DELIMITER //
CREATE FUNCTION augmenter_note_etudiant(etudiant_id INT, pourcentage
DECIMAL(5,2))
RETURNS BOOLEAN
MODIFIES SQL DATA
BEGIN
UPDATE etudiants
SET note = note * (1 + pourcentage / 100)
WHERE id = etudiant_id;
RETURN TRUE;
END //
DELIMITER ;
SELECT augmenter_note_etudiant(1,20);
Cete oncon modie la base de données en metan à jour la colonne noe de la able eudians. Elle es
donc marquée comme MODIFIES SQL DATA.
SQUALLI MED 11
5. Foncton CONTAINS SQL
Si une oncon conen des insrucons SQL mais n'ineragi pas avec les données de la base (elle ne li ni ne
modie des données), elle es marquée comme CONTAINS SQL.
Exemple :
DELIMITER //
CREATE FUNCTION multiplier_par_deux(valeur INT)
RETURNS INT
CONTAINS SQL
BEGIN
RETURN valeur * 2;
END //
DELIMITER ;
select multiplier_par_deux(15);
Cete oncon conen du SQL (dans ce cas, elle ulise une simple opéraon arihméque), mais elle ne ai ni
SELECT, ni INSERT, ni UPDATE. Elle es donc marquée comme CONTAINS SQL.
Synhèse des déclaratons inormatves :
Déclaraton Explicaton
DETERMINISTIC Reourne oujours le même résula pour les mêmes argumens.
NOT Peu reourner un résula diéren pour les mêmes argumens (ulise des oncons
DETERMINISTIC non déerminises comme RAND(), NOW(), ec.).
READS SQL DATA Li des données de la base sans les modier.
MODIFIES SQL
Modie les données de la base de données.
DATA
Conen des insrucons SQL mais n'ineragi pas direcemen avec les données (ne
CONTAINS SQL
ai ni SELECT, ni INSERT, ni UPDATE, ec.).
Ces déclaraons aiden MySQL à opmiser l'exécuon des oncons, à garanr l'inégrié des ransacons, e
à améliorer la geson des requêes.
SQUALLI MED 12