Exercices Corrigés:Fonctions,Procédure,Cursors,...

Soit le schéma relationnel suivant:
-- Table Cours
CREATE TABLE Cours (
    ID_Cours INT PRIMARY KEY,
    NomCours VARCHAR(255),
    CodeCours VARCHAR(20)
);

-- Table Enseignant
CREATE TABLE Enseignant (
    ID_Enseignant INT PRIMARY KEY,
    Nom VARCHAR(255),
    Prenom VARCHAR(255),
    Titre VARCHAR(50)
);

-- Table Inscription
CREATE TABLE Inscription (
    ID_Inscription INT PRIMARY KEY,
    ID_Etudiant INT,
    ID_Cours INT,
    Annee INT,
    FOREIGN KEY (ID_Etudiant) REFERENCES Etudiant(ID_Etudiant),
    FOREIGN KEY (ID_Cours) REFERENCES Cours(ID_Cours)
);
Questions & Réponse
Création d'une procédure pour insérer un nouvel étudiant :
DELIMITER //
CREATE PROCEDURE InsertStudent(IN p_Nom VARCHAR(255), IN p_Prenom VARCHAR(255), IN p_Adresse VARCHAR(255))
BEGIN
    INSERT INTO Etudiant(Nom, Prenom, Adresse) VALUES (p_Nom, p_Prenom, p_Adresse);
END //
DELIMITER ;
Création d'une fonction pour récupérer le nombre d'étudiants inscrits à un cours :
DELIMITER //
CREATE FUNCTION GetStudentCountInCourse(p_CourseID INT) RETURNS INT
BEGIN
    DECLARE student_count INT;
    SELECT COUNT(*) INTO student_count FROM Inscription WHERE ID_Cours = p_CourseID;
    RETURN student_count;
END //
DELIMITER ;
Création d'une procédure pour mettre à jour les informations d'un enseignant :
DELIMITER //
CREATE PROCEDURE UpdateTeacher(IN p_TeacherID INT, IN p_NewNom VARCHAR(255), IN p_NewPrenom VARCHAR(255), IN p_NewTitre VARCHAR(255))
BEGIN
    UPDATE Enseignant SET Nom = p_NewNom, Prenom = p_NewPrenom, Titre = p_NewTitre WHERE ID_Enseignant = p_TeacherID;
END //
DELIMITER ;
Création d'une procédure pour supprimer un cours avec des étudiants inscrits :
DELIMITER //
CREATE PROCEDURE DeleteCourseWithEnrollments(IN p_CourseID INT)
BEGIN
    DELETE FROM Inscription WHERE ID_Cours = p_CourseID;
    DELETE FROM Cours WHERE ID_Cours = p_CourseID;
END //
DELIMITER ;
Création d'une procédure utilisant une boucle WHILE pour mettre à jour plusieurs étudiants :
DELIMITER //
CREATE PROCEDURE UpdateStudentAddresses()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE studentID INT;
    DECLARE cur CURSOR FOR SELECT ID_Etudiant FROM Etudiant;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO studentID;
        IF done THEN
            LEAVE read_loop;
        END IF;

        UPDATE Etudiant SET Adresse = CONCAT(Adresse, ', France') WHERE ID_Etudiant = studentID;
    END LOOP;

    CLOSE cur;
END //
DELIMITER ;
Création d'une procédure utilisant une condition IF pour afficher le titre de l'enseignant en fonction de son ID :
DELIMITER //
CREATE PROCEDURE GetTeacherTitleByID(IN p_TeacherID INT)
BEGIN
    DECLARE teacherTitle VARCHAR(255);

    SELECT Titre INTO teacherTitle FROM Enseignant WHERE ID_Enseignant = p_TeacherID;

    IF teacherTitle IS NOT NULL THEN
        SELECT CONCAT('Le titre de l enseignant est : ', teacherTitle) AS Result;
    ELSE
        SELECT 'Aucun enseignant trouvé avec cet ID' AS Result;
    END IF;
END //
DELIMITER ;
Création d'une procédure utilisant une clause CASE pour déterminer le statut d'un étudiant en fonction de son ID :
DELIMITER //
CREATE PROCEDURE GetStudentStatusByID(IN p_StudentID INT)
BEGIN
    DECLARE studentStatus VARCHAR(255);

    SELECT
        CASE
            WHEN Annee > YEAR(CURDATE()) THEN 'Étudiant actif'
            WHEN Annee = YEAR(CURDATE()) THEN 'Nouvel étudiant cette année'
            ELSE 'Ancien étudiant'
        END AS Status
    INTO studentStatus
    FROM Inscription
    WHERE ID_Etudiant = p_StudentID;

    SELECT CONCAT('Le statut de l étudiant est : ', studentStatus) AS Result;
END //
DELIMITER ;
Création d'une procédure utilisant une jointure pour récupérer les cours auxquels un étudiant est inscrit :
DELIMITER //
CREATE PROCEDURE GetCoursesByStudentID(IN p_StudentID INT)
BEGIN
    SELECT Cours.NomCours
    FROM Inscription
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    WHERE Inscription.ID_Etudiant = p_StudentID;
END //
DELIMITER ;
Création d'une procédure utilisant une clause GROUP BY pour obtenir le nombre d'étudiants inscrits par année :
DELIMITER //
CREATE PROCEDURE GetStudentCountByYear()
BEGIN
    SELECT Annee, COUNT(*) AS NombreEtudiants
    FROM Inscription
    GROUP BY Annee;
END //
DELIMITER ;
Création d'une procédure utilisant une clause HAVING pour filtrer les cours ayant plus de 10 inscriptions :
DELIMITER //
CREATE PROCEDURE GetCoursesWithMoreThan10Students()
BEGIN
    SELECT Cours.NomCours, COUNT(*) AS NombreInscriptions
    FROM Inscription
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    GROUP BY Cours.NomCours
    HAVING NombreInscriptions > 10;
END //
DELIMITER ;
Création d'une procédure utilisant une clause ORDER BY pour obtenir la liste des étudiants triés par nom :
DELIMITER //
CREATE PROCEDURE GetStudentsOrderedByName()
BEGIN
    SELECT *
    FROM Etudiant
    ORDER BY Nom, Prenom;
END //
DELIMITER ;
Création d'une procédure utilisant une clause WHERE pour récupérer les enseignants dont le titre est 'Professeur' :
DELIMITER //
CREATE PROCEDURE GetProfessors()
BEGIN
    SELECT *
    FROM Enseignant
    WHERE Titre = 'Professeur';
END //
DELIMITER ;
Création d'une procédure utilisant une clause JOIN et une clause WHERE pour récupérer les cours enseignés par un enseignant spécifique :
DELIMITER //
CREATE PROCEDURE GetCoursesByTeacherID(IN p_TeacherID INT)
BEGIN
    SELECT Cours.NomCours
    FROM Cours
    JOIN Enseignant ON Cours.ID_Enseignant = Enseignant.ID_Enseignant
    WHERE Enseignant.ID_Enseignant = p_TeacherID;
END //
DELIMITER ;
Création d'une procédure utilisant une boucle FOR pour afficher les n premiers étudiants :
DELIMITER //
CREATE PROCEDURE DisplayTopNEtudents(IN p_N INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    
    FOR i IN 1..p_N DO
        SELECT *
        FROM Etudiant
        WHERE ID_Etudiant = i;
    END FOR;
END //
DELIMITER ;
Création d'une procédure utilisant une transaction pour insérer un nouvel étudiant et un nouvel enregistrement d'inscription :
DELIMITER //
CREATE PROCEDURE InsertStudentAndEnrollment(IN p_Nom VARCHAR(255), IN p_Prenom VARCHAR(255), IN p_Adresse VARCHAR(255), IN p_CourseID INT, IN p_Annee INT)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SIGNAL SQLSTATE '45000'
        SET MESSAGE_TEXT = 'Erreur lors de l insertion de l etudiant et de l inscription.';
    END;

    START TRANSACTION;

    INSERT INTO Etudiant(Nom, Prenom, Adresse) VALUES (p_Nom, p_Prenom, p_Adresse);
    SET @last_student_id = LAST_INSERT_ID();

    INSERT INTO Inscription(ID_Etudiant, ID_Cours, Annee) VALUES (@last_student_id, p_CourseID, p_Annee);

    COMMIT;
END //
DELIMITER ;
Création d'une procédure utilisant une instruction IF et une boucle WHILE pour mettre à jour les adresses des étudiants selon une condition spécifique :
DELIMITER //
CREATE PROCEDURE UpdateStudentAddressesBasedOnCondition(IN p_Condition VARCHAR(255))
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE studentID INT;
    DECLARE cur CURSOR FOR SELECT ID_Etudiant FROM Etudiant WHERE Nom LIKE p_Condition;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO studentID;
        IF done THEN
            LEAVE read_loop;
        END IF;

        IF LENGTH(Adresse) > 0 THEN
            UPDATE Etudiant SET Adresse = CONCAT(Adresse, ', France') WHERE ID_Etudiant = studentID;
        END IF;
    END LOOP;

    CLOSE cur;
END //
DELIMITER ;
Création d'une fonction pour calculer la moyenne des notes d'un étudiant dans un cours :
DELIMITER //
CREATE FUNCTION GetAverageGradeForStudent(IN p_StudentID INT, IN p_CourseID INT) RETURNS DECIMAL(5,2)
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;

    RETURN avgGrade;
END //
DELIMITER ;
Création d'une procédure utilisant une clause CASE pour attribuer une mention à un étudiant en fonction de sa moyenne :
DELIMITER //
CREATE PROCEDURE AssignGradeToStudent(IN p_StudentID INT, IN p_CourseID INT)
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;

    CASE
        WHEN avgGrade >= 16 THEN
            UPDATE Inscription SET Mention = 'Très Bien' WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;
        WHEN avgGrade >= 14 THEN
            UPDATE Inscription SET Mention = 'Bien' WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;
        WHEN avgGrade >= 12 THEN
            UPDATE Inscription SET Mention = 'Assez Bien' WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;
        ELSE
            UPDATE Inscription SET Mention = 'Non Classé' WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;
    END CASE;
END //
DELIMITER ;
Création d'une procédure utilisant une instruction LOOP pour récupérer les étudiants inscrits à plus d'un cours :
DELIMITER //
CREATE PROCEDURE GetStudentsEnrolledInMultipleCourses()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE studentID INT;
    DECLARE cur CURSOR FOR
        SELECT ID_Etudiant
        FROM Inscription
        GROUP BY ID_Etudiant
        HAVING COUNT(ID_Cours) > 1;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO studentID;
        IF done THEN
            LEAVE read_loop;
        END IF;

        -- Faites quelque chose avec l'ID de l'étudiant (affichage, mise à jour, etc.).
        SELECT * FROM Etudiant WHERE ID_Etudiant = studentID;
    END LOOP;

    CLOSE cur;
END //
DELIMITER ;
Création d'une fonction utilisant une clause JOIN pour obtenir la liste des cours auxquels un étudiant est inscrit :
DELIMITER //
CREATE FUNCTION GetCoursesByStudentName(IN p_Nom VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    DECLARE courseList VARCHAR(255);

    SELECT GROUP_CONCAT(NomCours SEPARATOR ', ') INTO courseList
    FROM Inscription
    JOIN Etudiant ON Inscription.ID_Etudiant = Etudiant.ID_Etudiant
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    WHERE Etudiant.Nom = p_Nom;

    RETURN courseList;
END //
DELIMITER ;
Création d'une procédure utilisant une instruction IF et une boucle REPEAT pour mettre à jour des données jusqu'à ce qu'une condition soit remplie :
DELIMITER //
CREATE PROCEDURE UpdateStudentDataUntilCondition(IN p_Condition INT)
BEGIN
    REPEAT
        -- Faites quelque chose (par exemple, une mise à jour) avec les étudiants selon une condition.
        UPDATE Etudiant SET Adresse = CONCAT(Adresse, ', France') WHERE ID_Etudiant < p_Condition;
    UNTIL p_Condition = 0
    END REPEAT;
END //
DELIMITER ;
Création d'une procédure utilisant une instruction SIGNAL pour gérer une erreur personnalisée :
DELIMITER //
CREATE PROCEDURE InsertStudentWithCheck(IN p_Nom VARCHAR(255), IN p_Prenom VARCHAR(255), IN p_Adresse VARCHAR(255))
BEGIN
    DECLARE studentCount INT;
    
    SELECT COUNT(*) INTO studentCount FROM Etudiant WHERE Nom = p_Nom AND Prenom = p_Prenom;
    
    IF studentCount > 0 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Un étudiant avec le même nom et prénom existe déjà.';
    ELSE
        INSERT INTO Etudiant(Nom, Prenom, Adresse) VALUES (p_Nom, p_Prenom, p_Adresse);
    END IF;
END //
DELIMITER ;
Création d'une procédure utilisant une boucle FOR pour afficher les cours avec le nombre d'étudiants inscrits :
DELIMITER //
CREATE PROCEDURE DisplayCoursesWithEnrollmentCount()
BEGIN
    DECLARE courseID INT;
    
    FOR courseID IN (SELECT ID_Cours FROM Cours) DO
        SELECT Cours.NomCours, COUNT(*) AS NombreEtudiants
        FROM Inscription
        JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
        WHERE Cours.ID_Cours = courseID;
    END FOR;
END //
DELIMITER ;
Création d'une fonction pour calculer la somme des notes d'un étudiant dans tous les cours :
DELIMITER //
CREATE FUNCTION GetTotalGradeForStudent(IN p_StudentID INT) RETURNS DECIMAL(5,2)
BEGIN
    DECLARE totalGrade DECIMAL(5,2);

    SELECT SUM(Note) INTO totalGrade
    FROM Notes
    WHERE ID_Etudiant = p_StudentID;

    RETURN totalGrade;
END //
DELIMITER ;
Création d'une procédure utilisant une clause DISTINCT pour afficher les différents cours auxquels au moins un étudiant est inscrit :
DELIMITER //
CREATE PROCEDURE DisplayDistinctCoursesWithEnrollment()
BEGIN
    SELECT DISTINCT Cours.NomCours
    FROM Inscription
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours;
END //
DELIMITER ;
Création d'une procédure utilisant une clause LIMIT pour récupérer les dix premiers étudiants inscrits :
DELIMITER //
CREATE PROCEDURE GetTopTenStudents()
BEGIN
    SELECT *
    FROM Etudiant
    ORDER BY ID_Etudiant
    LIMIT 10;
END //
DELIMITER ;
Création d'une fonction pour calculer l'âge moyen des étudiants :
DELIMITER //
CREATE FUNCTION GetAverageAge() RETURNS DECIMAL(5,2)
BEGIN
    DECLARE avgAge DECIMAL(5,2);

    SELECT AVG(YEAR(CURDATE()) - YEAR(DateNaissance)) INTO avgAge
    FROM Etudiant;

    RETURN avgAge;
END //
DELIMITER ;
Création d'une procédure utilisant une clause IN pour récupérer les étudiants inscrits à certains cours spécifiques :
DELIMITER //
CREATE PROCEDURE GetStudentsInSpecificCourses()
BEGIN
    SELECT *
    FROM Etudiant
    WHERE ID_Etudiant IN (SELECT DISTINCT ID_Etudiant FROM Inscription WHERE ID_Cours IN (1, 2, 3));
END //
DELIMITER ;
Création d'une procédure utilisant une clause UNION pour récupérer les noms des étudiants et des enseignants :
DELIMITER //
CREATE PROCEDURE GetStudentAndTeacherNames()
BEGIN
    SELECT Nom AS NomEntite, Prenom AS PrenomEntite, 'Etudiant' AS TypeEntite
    FROM Etudiant
    UNION
    SELECT Nom, Prenom, 'Enseignant'
    FROM Enseignant;
END //
DELIMITER ;
Création d'une fonction utilisant une clause LEFT JOIN pour obtenir les cours auxquels un étudiant est inscrit, avec une valeur par défaut pour les étudiants sans inscription :
DELIMITER //
CREATE FUNCTION GetCoursesForStudentWithDefault(IN p_StudentID INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE courseList VARCHAR(255);

    SELECT GROUP_CONCAT(COALESCE(Cours.NomCours, 'Aucun cours') SEPARATOR ', ') INTO courseList
    FROM Etudiant
    LEFT JOIN Inscription ON Etudiant.ID_Etudiant = Inscription.ID_Etudiant
    LEFT JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    WHERE Etudiant.ID_Etudiant = p_StudentID;

    RETURN courseList;
END //
DELIMITER ;
Création d'une procédure utilisant une clause GROUP_CONCAT pour obtenir les cours auxquels un étudiant est inscrit sous forme de chaîne de caractères :
DELIMITER //
CREATE PROCEDURE GetCoursesAsStringForStudent(IN p_StudentID INT)
BEGIN
    DECLARE courseList VARCHAR(255);

    SELECT GROUP_CONCAT(Cours.NomCours SEPARATOR ', ') INTO courseList
    FROM Inscription
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    WHERE Inscription.ID_Etudiant = p_StudentID;

    SELECT courseList AS CoursesForStudent;
END //
DELIMITER ;
Création d'une procédure utilisant une clause ORDER BY et LIMIT pour récupérer les trois meilleurs étudiants :
DELIMITER //
CREATE PROCEDURE GetTopThreeStudents()
BEGIN
    SELECT *
    FROM Etudiant
    ORDER BY MoyenneGenerale DESC
    LIMIT 3;
END //
DELIMITER ;
Création d'une fonction pour calculer la médiane des notes d'un étudiant dans un cours :
DELIMITER //
CREATE FUNCTION GetMedianGradeForStudent(IN p_StudentID INT, IN p_CourseID INT) RETURNS DECIMAL(5,2)
BEGIN
    DECLARE medianGrade DECIMAL(5,2);

    SELECT
        IF(COUNT(*) % 2 = 0,
            (MAX(Note) + MIN(Note)) / 2,
            MAX(Note)
        ) INTO medianGrade
    FROM Notes
    WHERE ID_Etudiant = p_StudentID AND ID_Cours = p_CourseID;

    RETURN medianGrade;
END //
DELIMITER ;
Création d'une procédure utilisant une clause CASCADE pour supprimer un enseignant et tous les cours associés :
DELIMITER //
CREATE PROCEDURE DeleteTeacherAndCourses(IN p_TeacherID INT)
BEGIN
    DELETE FROM Enseignant WHERE ID_Enseignant = p_TeacherID;
END //
DELIMITER ;
Création d'une procédure utilisant une clause TRIGGER pour mettre à jour la date de modification d'un étudiant lors de chaque mise à jour :
DELIMITER //
CREATE TRIGGER UpdateStudentModified
BEFORE UPDATE ON Etudiant
FOR EACH ROW
SET NEW.DateModification = NOW();
Création d'une procédure utilisant une clause ENUM pour définir le statut des étudiants :
DELIMITER //
CREATE PROCEDURE UpdateStudentStatus(IN p_StudentID INT, IN p_Status ENUM('Actif', 'Inactif'))
BEGIN
    UPDATE Etudiant SET Statut = p_Status WHERE ID_Etudiant = p_StudentID;
END //
DELIMITER ;
Création d'une procédure utilisant une clause WHILE pour supprimer tous les étudiants inactifs :
DELIMITER //
CREATE PROCEDURE DeleteInactiveStudents()
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE studentID INT;
    DECLARE cur CURSOR FOR SELECT ID_Etudiant FROM Etudiant WHERE Statut = 'Inactif';
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO studentID;
        IF done THEN
            LEAVE read_loop;
        END IF;

        DELETE FROM Etudiant WHERE ID_Etudiant = studentID;
    END LOOP;

    CLOSE cur;
END //
DELIMITER ;
Création d'une procédure utilisant une clause REPEAT pour incrémenter les notes de tous les étudiants d'un certain pourcentage :
DELIMITER //
CREATE PROCEDURE IncreaseGrades(IN p_Percentage INT)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE studentID INT;
    DECLARE cur CURSOR FOR SELECT ID_Etudiant FROM Etudiant;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO studentID;
        IF done THEN
            LEAVE read_loop;
        END IF;

        UPDATE Notes SET Note = Note + (Note * p_Percentage / 100) WHERE ID_Etudiant = studentID;
    END LOOP;

    CLOSE cur;
END //
DELIMITER ;
Création d'une fonction utilisant une clause CASE pour obtenir la mention d'un étudiant en fonction de ses notes :
DELIMITER //
CREATE FUNCTION GetStudentMention(IN p_StudentID INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = p_StudentID;

    RETURN
        CASE
            WHEN avgGrade >= 16 THEN 'Très Bien'
            WHEN avgGrade >= 14 THEN 'Bien'
            WHEN avgGrade >= 12 THEN 'Assez Bien'
            ELSE 'Non Classé'
        END;
END //
DELIMITER ;
Création d'une procédure utilisant une clause GROUP BY avec une agrégation pour obtenir le nombre d'étudiants par adresse :
DELIMITER //
CREATE PROCEDURE GetStudentCountByAddress()
BEGIN
    SELECT Adresse, COUNT(*) AS NombreEtudiants
    FROM Etudiant
    GROUP BY Adresse;
END //
DELIMITER ;
Création d'une procédure utilisant une clause FULL OUTER JOIN pour récupérer tous les étudiants, même ceux sans inscription :
DELIMITER //
CREATE PROCEDURE GetStudentsWithOrWithoutEnrollment()
BEGIN
    SELECT Etudiant.*, Inscription.ID_Cours
    FROM Etudiant
    LEFT JOIN Inscription ON Etudiant.ID_Etudiant = Inscription.ID_Etudiant
    UNION
    SELECT Etudiant.*, NULL AS ID_Cours
    FROM Etudiant
    WHERE ID_Etudiant NOT IN (SELECT ID_Etudiant FROM Inscription);
END //
DELIMITER ;
Création d'une procédure utilisant une clause RAND() pour sélectionner aléatoirement un étudiant :
DELIMITER //
CREATE PROCEDURE GetRandomStudent()
BEGIN
    SELECT * FROM Etudiant ORDER BY RAND() LIMIT 1;
END //
DELIMITER ;
Création d'une fonction utilisant une clause AVG() pour calculer la moyenne des notes par cours :
DELIMITER //
CREATE FUNCTION GetAverageGradeByCourse(IN p_CourseID INT) RETURNS DECIMAL(5,2)
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Cours = p_CourseID;

    RETURN avgGrade;
END //
DELIMITER ;
Création d'une procédure utilisant une clause WHERE avec LIKE pour rechercher des étudiants par nom :
DELIMITER //
CREATE PROCEDURE SearchStudentsByName(IN p_SearchTerm VARCHAR(255))
BEGIN
    SELECT * FROM Etudiant
    WHERE Nom LIKE CONCAT('%', p_SearchTerm, '%') OR Prenom LIKE CONCAT('%', p_SearchTerm, '%');
END //
DELIMITER ;
Création d'une procédure utilisant une clause CASE pour déterminer si un étudiant est en situation d'échec :
DELIMITER //
CREATE PROCEDURE CheckStudentFailure(IN p_StudentID INT)
BEGIN
    DECLARE avgGrade DECIMAL(5,2);

    SELECT AVG(Note) INTO avgGrade
    FROM Notes
    WHERE ID_Etudiant = p_StudentID;

    CASE
        WHEN avgGrade < 10 THEN
            SELECT 'Étudiant en situation d échec' AS Result;
        ELSE
            SELECT 'Étudiant réussite' AS Result;
    END CASE;
END //
DELIMITER ;
Création d'une fonction utilisant une clause GROUP_CONCAT pour obtenir la liste des cours sous forme de chaîne de caractères :
DELIMITER //
CREATE FUNCTION GetCourseListAsString() RETURNS VARCHAR(255)
BEGIN
    DECLARE courseList VARCHAR(255);

    SELECT GROUP_CONCAT(NomCours SEPARATOR ', ') INTO courseList
    FROM Cours;

    RETURN courseList;
END //
DELIMITER ;
Création d'une procédure utilisant une clause DISTINCT pour récupérer les différentes adresses des étudiants :
DELIMITER //
CREATE PROCEDURE GetDistinctAddresses()
BEGIN
    SELECT DISTINCT Adresse FROM Etudiant;
END //
DELIMITER ;
Création d'une procédure utilisant une clause ORDER BY et LIMIT pour obtenir les trois cours les plus populaires :
DELIMITER //
CREATE PROCEDURE GetTopThreePopularCourses()
BEGIN
    SELECT Cours.NomCours, COUNT(*) AS NombreInscriptions
    FROM Inscription
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    GROUP BY Cours.NomCours
    ORDER BY NombreInscriptions DESC
    LIMIT 3;
END //
DELIMITER ;
Création d'une procédure utilisant une clause CASE pour déterminer le semestre d'inscription d'un étudiant en fonction de l'année :
DELIMITER //
CREATE PROCEDURE GetSemesterForStudent(IN p_StudentID INT, IN p_Year INT)
BEGIN
    DECLARE semester VARCHAR(255);

    SELECT
        CASE
            WHEN Annee = p_Year THEN 'Semestre 1'
            WHEN Annee = p_Year - 1 THEN 'Semestre 2'
            ELSE 'Non défini'
        END AS Semester
    INTO semester
    FROM Inscription
    WHERE ID_Etudiant = p_StudentID
    ORDER BY Annee DESC
    LIMIT 1;

    SELECT semester AS SemesterForStudent;
END //
DELIMITER ;
Création d'une fonction utilisant une clause DISTINCT avec une sous-requête pour obtenir la liste des enseignants ayant enseigné au moins un cours :
DELIMITER //
CREATE FUNCTION GetDistinctTeachersWithCourses() RETURNS VARCHAR(255)
BEGIN
    DECLARE teacherList VARCHAR(255);

    SELECT GROUP_CONCAT(Nom, ' ', Prenom SEPARATOR ', ') INTO teacherList
    FROM Enseignant
    WHERE ID_Enseignant IN (SELECT DISTINCT ID_Enseignant FROM Cours);

    RETURN teacherList;
END //
DELIMITER ;
Création d'une procédure utilisant une clause JOIN et une clause WHERE pour récupérer les étudiants inscrits à des cours enseignés par un enseignant spécifique :
DELIMITER //
CREATE PROCEDURE GetStudentsByTeacher(IN p_TeacherID INT)
BEGIN
    SELECT DISTINCT Etudiant.*
    FROM Etudiant
    JOIN Inscription ON Etudiant.ID_Etudiant = Inscription.ID_Etudiant
    JOIN Cours ON Inscription.ID_Cours = Cours.ID_Cours
    WHERE Cours.ID_Enseignant = p_TeacherID;
END //
DELIMITER ;
Création d'une procédure utilisant une clause GROUP BY et une clause HAVING pour obtenir les enseignants ayant enseigné à un nombre spécifique de cours :
DELIMITER //
CREATE PROCEDURE GetTeachersWithCourseCount(IN p_CourseCount INT)
BEGIN
    SELECT Enseignant.Nom, Enseignant.Prenom, COUNT(*) AS NombreCoursEnseignes
    FROM Enseignant
    JOIN Cours ON Enseignant.ID_Enseignant = Cours.ID_Enseignant
    GROUP BY Enseignant.ID_Enseignant
    HAVING NombreCoursEnseignes = p_CourseCount;
END //
DELIMITER ;
Création d'une procédure utilisant une clause UPDATE avec ORDER BY et LIMIT pour mettre à jour les notes des trois meilleurs étudiants d'un cours :
DELIMITER //
CREATE PROCEDURE UpdateTopThreeStudentsGrades(IN p_CourseID INT)
BEGIN
    UPDATE Notes
    SET Note = Note + 5
    WHERE ID_Etudiant IN (
        SELECT ID_Etudiant
        FROM Notes
        WHERE ID_Cours = p_CourseID
        ORDER BY Note DESC
        LIMIT 3
    );
END //
DELIMITER ;
Création d'une procédure utilisant une clause IF pour vérifier l'existence d'un étudiant avant de l'inscrire à un cours :
DELIMITER //
CREATE PROCEDURE EnrollStudentToCourse(IN p_StudentID INT, IN p_CourseID INT, IN p_Annee INT)
BEGIN
    IF EXISTS (SELECT 1 FROM Etudiant WHERE ID_Etudiant = p_StudentID) THEN
        INSERT INTO Inscription(ID_Etudiant, ID_Cours, Annee) VALUES (p_StudentID, p_CourseID, p_Annee);
    ELSE
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Étudiant non trouvé.';
    END IF;
END //
DELIMITER ;
Création d'une fonction utilisant une clause GROUP_CONCAT avec une sous-requête pour obtenir la liste des cours auxquels un étudiant est inscrit :
DELIMITER //
CREATE FUNCTION GetStudentCoursesAsString(IN p_StudentID INT) RETURNS VARCHAR(255)
BEGIN
    DECLARE courseList VARCHAR(255);

    SELECT GROUP_CONCAT(NomCours SEPARATOR ', ') INTO courseList
    FROM Cours
    WHERE ID_Cours IN (SELECT ID_Cours FROM Inscription WHERE ID_Etudiant = p_StudentID);

    RETURN courseList;
END //
DELIMITER ;