0% ont trouvé ce document utile (0 vote)
15 vues13 pages

Révision SQL

Ce document présente une étude de cas sur la gestion d'une université, incluant des structures de base de données pour les étudiants, départements, inscriptions et stages. Il fournit également des requêtes SQL pour diverses analyses, telles que le calcul des moyennes, la recherche d'étudiants ayant effectué des stages, et des opérations de mise à jour et de suppression. Les requêtes sont accompagnées d'explications détaillées sur leur fonctionnement et leur logique.

Transféré par

kasranimedrayen
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
15 vues13 pages

Révision SQL

Ce document présente une étude de cas sur la gestion d'une université, incluant des structures de base de données pour les étudiants, départements, inscriptions et stages. Il fournit également des requêtes SQL pour diverses analyses, telles que le calcul des moyennes, la recherche d'étudiants ayant effectué des stages, et des opérations de mise à jour et de suppression. Les requêtes sont accompagnées d'explications détaillées sur leur fonctionnement et leur logique.

Transféré par

kasranimedrayen
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

ÉTUDE DE CAS – GESTION D’UNE UNIVERSITÉ

Base de données UNIVERSITE :

• ETUDIANT (Num_Etu, Nom, Prenom, Ville, Tel)

• DEPARTEMENT (Code_Dep, NomDep, VilleDep, Budget)

• INSCRIPTION (Num_Inscr, #Num_Etu, #Code_Dep, Annee,


Moyenne)

• STAGE (Num_Stage, #Num_Etu, Sujet, Duree, Date_Stage,


Organisme)

- Clé primaire : soulignée


- Clé étrangère : précédée d’un astérisque (#)

Requêtes SQL

1. Par département, donner la moyenne générale des moyennes des


étudiants, à condition qu’elle soit supérieure à 12.
Résultat : Code_Dep, Moy_Globale
************Correction ***********************
SELECT Code_Dep, AVG(Moyenne) AS Moy_Globale
FROM INSCRIPTION
GROUP BY Code_Dep
HAVING AVG(Moyenne) > 12;

*********************Explication ************************
- SELECT Code_Dep, AVG(Moyenne) AS Moy_Globale
• On veut afficher deux colonnes :

o Code_Dep : le code du département (ou filière,

spécialité, etc.).
o AVG(Moyenne) : la moyenne des moyennes des

étudiants (agrégée par département).


o AS Moy_Globale : on donne un nom d’alias plus clair

à la colonne calculée (AVG(Moyenne) devient


Moy_Globale).
- FROM INSCRIPTION
• On travaille à partir de la table INSCRIPTION, qui contient

probablement les colonnes Code_Dep, Moyenne, etc.


- GROUP BY Code_Dep
• Cela signifie qu’on veut regrouper les lignes par

département (Code_Dep) pour effectuer un calcul agrégé (ici


une moyenne).
- HAVING AVG(Moyenne) > 12
• on garde uniquement les départements dont la moyenne des

moyennes des étudiants est strictement supérieure à 12.


• Toujours Having avec group by

2. Lister les noms des étudiants ayant fait un stage dans la ville de
“Sfax”.
***************************Correction ***********************
SELECT DISTINCT E.Nom
FROM ETUDIANT E, STAGE S
Where E.Num_Etu = S.Num_Etu
And S.Organisme LIKE '%Sfax%';
***************************Explication***********************
- SELECT DISTINCT E.Nom
o On sélectionne les noms des étudiants (E.Nom).

o Le mot-clé DISTINCT permet d’éviter les doublons : chaque

nom apparaîtra une seule fois, même si l’étudiant a plusieurs


stages à Sfax.
- FROM ETUDIANT E, STAGE S
o On travaille à partir de la table ETUDIANT, qu'on appelle ici

E (alias, pour simplifier la suite).


o De même pour le tableau stage

- JOINTURE avec : E.Num_Etu = S.Num_Etu


o On fait une jointure avec la table STAGE.

o Cela permet de relier chaque étudiant à ses stages.

- WHERE S.Organisme LIKE '%Sfax%'


o On filtre les lignes pour ne garder que les stages dont le nom

de l’organisme contient "Sfax".


o Le symbole % est un joker dans SQL :
▪ '%Sfax%' signifie : contient le mot "Sfax" n’importe où

dans le texte (au début, au milieu ou à la fin).


3. Trouver les étudiants inscrits dans un département différent de la
ville où ils habitent.
***************************Correction ***********************

SELECT E.Num_Etu, E.Ville AS Ville_Etu, D.VilleDep AS Ville_Dep

FROM ETUDIANT E, INSCRIPTION I, DEPARTEMENT D

WHERE E.Num_Etu = I.Num_Etu

AND I.Code_Dep = D.Code_Dep

AND E.Ville <> D.VilleDep;

***************************Explication***********************
- SELECT E.Num_Etu, E.Ville AS Ville_Etu, D.VilleDep AS
Ville_Dep

o On sélectionne :

▪ le numéro de l'étudiant (E.Num_Etu),

▪ la ville de résidence de l'étudiant (E.Ville, renommée


en Ville_Etu),

▪ la ville du département (D.VilleDep, renommée en


Ville_Dep).

- FROM ETUDIANT E, INSCRIPTION I, DEPARTEMENT D

o On utilise trois tables : ETUDIANT, INSCRIPTION et


DEPARTEMENT.

- WHERE E.Num_Etu = I.Num_Etu

o Jointure entre l’étudiant et ses inscriptions.

- AND I.Code_Dep = D.Code_Dep

o Jointure entre l’inscription et le département correspondant.


- AND E.Ville <> D.VilleDep

o On sélectionne uniquement les étudiants dont la ville de


résidence est différente de la ville du département où ils sont
inscrits.

4. Afficher pour chaque département le nombre d'étudiants inscrits.

***************************Correction ***********************

SELECT Code_Dep, COUNT(Num_Etu) AS Nb_Etudiants

FROM INSCRIPTION

GROUP BY Code_Dep;

5. . Trouver les étudiants n'ayant jamais fait de stage.


***************************Correction ***********************

SELECT E.Num_Etu, E.Nom, E.Prenom

FROM ETUDIANT E

WHERE NOT EXISTS (

SELECT E.Num_Etu

FROM STAGE S

WHERE S.Num_Etu = E.Num_Etu);

***************************Explication***********************

- WHERE NOT EXISTS (...)

• On applique un filtre : on ne garde que les étudiants pour lesquels


il n'existe aucune ligne dans la table STAGE qui leur est liée.

*************Solution 2 avec Not in***********************

SELECT E.Num_Etu, E.Nom, E.Prenom


FROM ETUDIANT E
WHERE E.Num_Etu NOT IN (
SELECT S.Num_Etu
FROM STAGE S
WHERE S.Num_Etu IS NOT NULL);
6. Afficher les étudiants ayant effectué plus d’un stage.

Champ résultat : Num_Etu, Nom, Nb_Stages

***************************Correction ***********************

SELECT E.Num_Etu, E.Nom, COUNT(*) AS Nb_Stages

FROM ETUDIANT E, STAGE S

WHERE E.Num_Etu = S.Num_Etu

GROUP BY E.Num_Etu, E.Nom

HAVING COUNT(*) > 1;

***************************Explication***********************

- SELECT E.Num_Etu, E.Nom, COUNT(*) AS Nb_Stages

o On sélectionne :

▪ le numéro d’étudiant (E.Num_Etu),

▪ son nom (E.Nom),

▪ et le nombre de stages qu’il a effectués (COUNT(*)),


qu'on renomme en Nb_Stages.

- FROM ETUDIANT E, STAGE S

o On utilise une jointure implicite entre les tables ETUDIANT


et STAGE.

o Cette syntaxe est ancienne ; la condition de jointure doit être


précisée dans le WHERE.

- GROUP BY E.Num_Etu, E.Nom

o On regroupe les lignes par étudiant (identifié par son


numéro et son nom).

o Cela permet d’appliquer des fonctions d’agrégation (comme


COUNT) pour chaque étudiant.
- HAVING COUNT(*) > 1

o On filtre après le regroupement pour ne garder que les


étudiants ayant effectué plus d’un stage.

o HAVING s’utilise toujours après un GROUP BY pour filtrer


sur les résultats agrégés.

7. Utiliser l’opérateur INTERSECT pour extraire les étudiants


présents à la fois parmi ceux ayant un stage et ceux inscrits dans
un département localisé à Mahdia.
***************************Correction***********************

SELECT Num_Etu
FROM STAGE
WHERE Organisme LIKE '%Mahdia%'

INTERSECT

SELECT I.Num_Etu
FROM INSCRIPTION I, DEPARTEMENT D
Where I.Code_Dep = D.Code_Dep
And D.VilleDep = 'Mahdia';
***************************Explication***********************

Partie 1 — Avant le INTERSECT

SELECT Num_Etu

FROM STAGE

WHERE Organisme LIKE '%Mahdia%'

• Sélectionne les numéros d’étudiants (Num_Etu) ayant effectué un


stage dans un organisme dont le nom contient "Mahdia".

• Le LIKE '%Mahdia%' signifie que "Mahdia" peut être n’importe où


dans le nom de l’organisme (début, milieu ou fin).

Partie 2 — Après le INTERSECT

SELECT I.Num_Etu
FROM INSCRIPTION I, DEPARTEMENT D

WHERE I.Code_Dep = D.Code_Dep

AND D.VilleDep = 'Mahdia';

• Sélectionne les étudiants inscrits dans un département dont la ville


(VilleDep) est Mahdia.

• Cela se fait en reliant les tables INSCRIPTION et DEPARTEMENT


grâce à Code_Dep.

INTERSECT

• L'opérateur INTERSECT retourne uniquement les valeurs


communes aux deux sous-requêtes.

• Résultat : les étudiants présents dans les deux listes.

8. Utiliser UNION pour trouver les étudiants ayant un stage OU une


inscription à Bizerte.
**************************Correction***********************

-- Étudiants ayant un stage

SELECT S.Num_Etu
FROM STAGE S

UNION

-- Étudiants inscrits dans un département situé à Bizerte


SELECT I.Num_Etu
FROM INSCRIPTION I, DEPARTEMENT D
Where I.Code_Dep = D.Code_Dep
And D.VilleDep = 'Bizerte';
9. Donner la durée moyenne des stages par étudiant.
Champ résultat : Num_Etu, Moy_Duree
**************************Correction***********************

SELECT Num_Etu, AVG(Duree) AS Moy_Duree


FROM STAGE
GROUP BY Num_Etu;
10.Trouver les départements dans lesquels aucun étudiant n’est
inscrit.
Champ résultat : Code_Dep, NomDep
**************************Correction***********************

SELECT D.Code_Dep, D.NomDep


FROM DEPARTEMENT D
WHERE NOT EXISTS (
SELECT *
FROM INSCRIPTION I
WHERE I.Code_Dep = D.Code_Dep
);
11. Trouver les étudiants qui ont fait un stage dans un organisme
contenant le mot “Informatique”.
Champ résultat : Num_Etu, Nom, Organisme
**************************Correction***********************

SELECT E.Num_Etu, E.Nom, S.Organisme


FROM ETUDIANT E, STAGE S
WHERE E.Num_Etu = S.Num_Etu
AND S.Organisme LIKE '%Informatique%';

12.Trouver les étudiants qui ne sont pas inscrits dans le même


département que "Ahmed ALI".
Pensez à NOT IN + IN ou NOT EXISTS.
***************Correction avec NOT IN ***********************
SELECT Num_Etu
FROM INSCRIPTION
WHERE Code_Dep
NOT IN (
SELECT Code_Dep
FROM ETUDIANT E, INSCRIPTION I
WHERE E.Num_Etu = I.Num_Etu
AND E.Nom = 'ALI' AND E.Prenom = 'Ahmed');
***********************Correction avec NOT EXISTS*****************
SELECT I1.Num_Etu
FROM INSCRIPTION I1
WHERE NOT EXISTS (
SELECT *
FROM INSCRIPTION I2, ETUDIANT E
WHERE I2.Num_Etu = E.Num_Etu
AND E.Nom = 'ALI' AND E.Prenom = 'Ahmed'
AND I1.Code_Dep = I2.Code_Dep);

13.Départements ayant un budget supérieur à tous les départements


de “Sfax”.
***********************Correction ***********************************
SELECT Code_Dep
FROM DEPARTEMENT
WHERE Budget > ALL (
SELECT Budget
FROM DEPARTEMENT
WHERE VilleDep = 'Sfax');
*********************************Explication *****************************
- SELECT Code_Dep
On veut afficher les codes des départements (Code_Dep).
- 2. FROM DEPARTEMENT
On travaille sur la table DEPARTEMENT, qui contient les
informations sur chaque département (y compris leur budget et
leur ville).
- WHERE Budget > ALL (...)
On garde **uniquement les départements dont le budget est
strictement supérieur à tous les budgets des départements situés à
Sfax.
- Sous-requête :
SELECT Budget
FROM DEPARTEMENT
WHERE VilleDep = 'Sfax'
• Cette sous-requête retourne tous les budgets des départements

situés à Sfax.
14.Afficher la liste des étudiants et leur moyenne la plus élevée (s’ils
ont plusieurs inscriptions).
Champ résultat : Num_Etu, Nom, Max_Moyenne
*********************Correction******************
SELECT E.Num_Etu, E.Nom, MAX(I.Moyenne) AS Max_Moyenne
FROM ETUDIANT E, INSCRIPTION I
WHERE E.Num_Etu = I.Num_Etu
GROUP BY E.Num_Etu, E.Nom;

15.Nombre d’étudiants inscrits dans le département « Informatique »


dont la ville n’est pas renseignée.

************************************Correction******************

SELECT COUNT(*) AS Nombre


FROM INSCRIPTION I, DEPARTEMENT D, ETUDIANT E
WHERE I.Code_Dep = D.Code_Dep
And E.Num_Etu = I.Num_Etu
WHERE D.NomDep = 'Informatique' AND E.Ville IS NULL;

16.Étudiants ayant une moyenne > à la somme des budgets de tous


les départements de Tunis.
************************************Correction******************
SELECT DISTINCT I.Num_Etu
FROM INSCRIPTION I
WHERE I.Moyenne > (
SELECT SUM(Budget)
FROM DEPARTEMENT
WHERE VilleDep = 'Tunis');
17.Étudiants dont la moyenne totale est < au budget minimum de
tous les départements.

************************************Correction******************

SELECT Num_Etu
FROM INSCRIPTION
GROUP BY Num_Etu
HAVING SUM(Moyenne) < (
SELECT MIN(Budget)
FROM DEPARTEMENT);
18.Supprimer les stages de l’étudiant« Ahmed Ali ».
************************************Correction******************
DELETE FROM STAGE
WHERE Num_Etu IN (
SELECT Num_Etu FROM ETUDIANT
WHERE Nom = 'Ali' AND Prenom = 'Ahmed');
19.Réduire de 10% la durée des stages pour les étudiants de « Kef ».
************************************Correction******************
UPDATE STAGE
SET Duree = Duree * 0.9
WHERE Num_Etu IN (
SELECT Num_Etu FROM ETUDIANT
WHERE Ville = 'Kef');
20.Trouver les étudiants dont le nom commence par "B" et qui ont une
moyenne supérieure à 12.
************************************Correction******************
SELECT DISTINCT E.Num_Etu, E.Nom, I.Moyenne
FROM ETUDIANT E, INSCRIPTION I
WHERE E.Num_Etu = I.Num_Etu
WHERE E.Nom LIKE 'B%' AND I.Moyenne > 12;
21.Lister les départements qui ont un budget supérieur à la
moyenne des budgets.
************************************Correction******************
SELECT Code_Dep, NomDep, Budget
FROM DEPARTEMENT
WHERE Budget > (
SELECT AVG(Budget) FROM DEPARTEMENT);
22.Trouver les étudiants ayant effectué un stage de plus de 3 mois
(90 jours).
************************************Correction******************
SELECT E.Num_Etu, E.Nom, S.Sujet, S.Duree
FROM ETUDIANT E , STAGE S
WHERE E.Num_Etu = S.Num_Etu
WHERE S.Duree > 90;
23.Trouver le ou les départements ayant le budget maximal
************************************Correction******************
SELECT Code_Dep, NomDep, Budget
FROM DEPARTEMENT
WHERE Budget = (
SELECT MAX(Budget) FROM DEPARTEMENT);
24.Donner le nombre d’inscriptions par année.
************************************Correction******************
SELECT Annee, COUNT(*) AS Nb_Inscrits
FROM INSCRIPTION
GROUP BY Annee
ORDER BY Annee;
25.Trouver les étudiants ayant une inscription mais aucun stage

************************************Correction******************

SELECT DISTINCT E.Num_Etu, E.Nom


FROM ETUDIANT E, INSCRIPTION I
Where E.Num_Etu = I.Num_Etu
WHERE E.Num_Etu NOT IN (
SELECT Num_Etu FROM STAGE);
26.Trouver les étudiants qui ont fait un stage et dont la moyenne est
supérieure à 15.
SELECT DISTINCT E.Num_Etu, E.Nom, I.Moyenne
FROM ETUDIANT E, INSCRIPTION I, STAGE S
WHERE E.Num_Etu = I.Num_Etu
and E.Num_Etu = S.Num_Etu
and I.Moyenne > 15;
27.Donner les étudiants qui ont effectué un stage en 2024
SELECT E.Num_Etu, E.Nom, S.Date_Stage
FROM ETUDIANT E, STAGE S
Where E.Num_Etu = S.Num_Etu
And EXTRACT(YEAR FROM S.Date_Stage) = 2024;

Vous aimerez peut-être aussi