CPGE Oujda                                                                                                                                                Spé

Exercices SQL

Exercice1 : Soit le schéma relationnel suivant :

ARTICLES (NOART, LIBELLE, STOCK, PRIXINVENT)
FOURNISSEURS (NOFOUR, NOMFOUR, ADRFOUR, VILLEFOUR)
ACHETER (NOFOUR#, NOART#, PRIXACHAT, DELAI)

Question 1 : numéros et libellés des articles dont le stock est inférieur à 10 ?

Question 2 : Liste des articles dont le prix d'inventaire est compris entre 100 et 300 ?

Question 3 : Liste des fournisseurs dont on ne connaît pas l'adresse ?

Question 4 : Liste des fournisseurs dont le nom commence par "STE" ?

Question 5 : noms et adresses des fournisseurs qui proposent des articles pour lesquels le délai d'approvisionnement est supérieur à 20 jours ?

Question 6  : Nombre d'articles référencés ?

Question 7 : Valeur du stock ?

Question 8 : numéros et libellés des articles triés dans l'ordre décroissant des stocks ?

Question 9 : Liste pour chaque article (numéro et libellé) du prix d'achat maximum, minimum et moyen ?

Exercice2 :  Soit le schéma relationnel suivant :

REPRESENTATION (n°représentation, titre_représentation, lieu)
MUSICIEN (nom, n°représentation*)
PROGRAMMER (date, n°représentation*, tarif)

Q1 - Donner la liste des titres des représentations.

Q2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.

Q3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils participent.

Q4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du 14/09/96.

 

Exercice3 :  Soit le schéma relationnel suivant :

ETUDIANT(N°Etudiant, Nom, Prénom)
MATIERE(CodeMat, LibelléMat, CoeffMat)
EVALUER(N°Etudiant*, CodeMat*, Date, Note)

Q1 - Quel est le nombre total d'étudiants ?

Q2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus basse ?

Q3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?

Q4 - Quelles sont les moyennes par matière ?

Q5 - Quelle est la moyenne générale de chaque étudiant ?

Q6 - Quelle est la moyenne générale de la promotion ?

Q7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la moyenne générale de la promotion ?

Exercice4 :  Soit le schéma relationnel suivant :

EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif)
COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*)
PAYS(CodePays, NomPays)
TYPE_ETAPE(CodeType, LibelléType)
ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*)
PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé)
ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes, NuméroCoureur*)

Q1 - Quelle est la composition de l'équipe FESTINA (Numéro, nom et pays des

Q2 - Quel est le nombre de kilomètres total du Tour de France 97 ?

Q3 - Quel est le nombre de kilomètres total des étapes de type HAUTE MONTAGNE ?

Q4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?

Q5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?

Q6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps des coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été intégrées dans les temps réalisés à chaque étape ?



 

Solutions Exercices SQL

Exercice1 : Soit le schéma relationnel suivant :

ARTICLES (NOART, LIBELLE, STOCK, PRIXINVENT)
FOURNISSEURS (NOFOUR, NOMFOUR, ADRFOUR, VILLEFOUR)
ACHETER (NOFOUR#, NOART#, PRIXACHAT, DELAI)

Question 1 : numéros et libellés des articles dont le stock est inférieur à 10 ?

SELECT NOART, LIBELLE

FROM ARTICLES  WHERE STOCK<10

Question 2 : Liste des articles dont le prix d'inventaire est compris entre 100 et 300 ?

SELECT *

FROM ARTICLES

WHERE PRIXINVENT BETWEEN 100 AND 300

Question 3 : Liste des fournisseurs dont on ne connaît pas l'adresse ?

 SELECT *

FROM FOURNISSEURS

WHERE ADRFOUR IS NULL;

Question 4 : Liste des fournisseurs dont le nom commence par "STE" ?

SELECT *

FROM FOURNISSEURS

WHERE NOMFOUR LIKE 'STE%';

Question 5 : noms et adresses des fournisseurs qui proposent des articles pour lesquels le délai d'approvisionnement est supérieur à 20 jours ?

R1=SELECTION(ACHETER, DELAI>20)
R2=JOINTURE(R1, FOURNISSEURS, NOFOUR)
R2=PROJECTION(R1, NOMFOUR, ADRFOUR, VILLEFOUR)

Testez votre solution SQL :

SELECT NOMFOUR, ADRFOUR, VILLEFOUR

FROM FOURNISSEURS F JOIN ACHETER A ON F.NOFOUR=A.NOFOUR

WHERE DELAI>20;

Question 6  : Nombre d'articles référencés ?


NbArticles=CALCULER(ARTICLES, Comptage())

Testez votre solution SQL :

SELECT COUNT(*) AS NbArticles

FROM ARTICLES; SELECT COUNT(*) AS NbArticles

FROM ARTICLES;

Question 7 : Valeur du stock ?

ValeurStock=CALCULER(ARTICLES, Somme(STOCK*PRIXINVENT))

 

SELECT SUM(STOCK*PRIXINVENT) AS ValeurStock

FROM ARTICLES;

 

Question 8 : numéros et libellés des articles triés dans l'ordre décroissant des stocks ?

 R1=PROJECTION(ARTICLES, NOART, LIBELLE, STOCK)
R2=TRI(R1, STOCK décroissant)

Testez votre solution SQL :

SELECT NOART, LIBELLE, STOCK

FROM ARTICLES

ORDER BY STOCK DESC ; SELECT NOART, LIBELLE, STOCK

FROM ARTICLES

ORDER BY STOCK DESC ;

 

Question 9 : Liste pour chaque article (numéro et libellé) du prix d'achat maximum, minimum et moyen ?

R1=REGROUPER_ET_CALCULER(ACHETER, NOART, PAMAX : MAX(PRIXACHAT), PAMIN : MIN(PRIXACHAT), PAMOY : MOYENNE(PRIXACHAT))
R2=JOINTURE(R1, ARTICLES, NOART)
R3=PROJECTION(R2, NOART, LIBELLE, PAMAX, PAMIN, PAMOY)

Testez votre solution SQL :

SELECT A.NOART, LIBELLE, MAX(PRIXACHAT) AS PMAX, MIN(PRIXACHAT) AS PMIN, AVG(PRIXACHAT) AS PMOY

FROM ACHETER A JOIN ARTICLES B ON A.NOART = B.NOART

GROUP BY A.NOART, LIBELLE;

 

Exercice2 :  Soit le schéma relationnel suivant :

REPRESENTATION (n°représentation, titre_représentation, lieu)
MUSICIEN (nom, n°représentation*)
PROGRAMMER (date, n°représentation*, tarif)

Q1 - Donner la liste des titres des représentations.


R = PROJECTION(REPRESENTATION, titre_représentation)
Et en langage SQL...

SELECT titre_représentation
FROM REPRESENTATION ;

Q2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.


R1 = SELECTION(REPRESENTATION, lieu="Opéra Bastille")
R2 = PROJECTION(R1, titre_représentation)
Et en langage SQL...

SELECT titre_représentation
FROM REPRESENTATION
WHERE lieu="Opéra Bastille" ;

Q3 - Donner la liste des noms des musiciens et des titres des représentations auxquelles ils participent.


R1 = JOINTURE(MUSICIEN, REPRESENTATION, Musicien.n°représentation=Représentation.n°représentation)
R2 = PROJECTION(R1, nom, titre_représentation)
Et en langage SQL...

SELECT nom, titre_représentation
FROM MUSICIEN INNER JOIN REPRESENTATION ON MUSICIEN.n°représentation = REPRESENTATION.n°représentation ;

Q4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée du 14/09/96.


R1 = SELECTION(PROGRAMMER, date=14/09/96)
R2 = JOINTURE(R1, REPRESENTATION, R1.n°représentation=Représentation.n°représentation)
R3 = PROJECTION(R2, titre_représentation, lieu, tarif)
Et en langage SQL...

SELECT titre_représentation, lieu, tarif
FROM REPRESENTATION INNER JOIN PROGRAMMER ON PROGRAMMER.n°représentation = REPRESENTATION.n°représentation
WHERE date='14/06/96' ;

 

Exercice3 :  Soit le schéma relationnel suivant :

ETUDIANT(N°Etudiant, Nom, Prénom)
MATIERE(CodeMat, LibelléMat, CoeffMat)
EVALUER(N°Etudiant*, CodeMat*, Date, Note)

Q1 - Quel est le nombre total d'étudiants ?


N=CALCULER(ETUDIANT, Comptage())
Et en langage SQL...

SELECT COUNT(*) FROM ETUDIANT ;

Q2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus basse ?


R=CALCULER(EVALUER, Minimum(Note), Maximum(Note))
Et en langage SQL...

SELECT MIN(Note), MAX(Note) FROM EVALUER ;

Q3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?


R1=REGROUPER_ET_CALCULER(EVALUER, N°Etudiant, CodeMat, MoyEtuMat : Moyenne(Note))
R2=JOINTURE(R1, MATIERE, MATIERE.CodeMat=R1.CodeMat)
R3=JOINTURE(R2, ETUDIANT, ETUDIANT.N°Etudiant=R2.N°Etudiant)
MOYETUMAT=PROJECTION(R3, N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat, MoyEtuMat)
Et en langage SQL...

CREATE VIEW MOYETUMAT AS
SELECT ETUDIANT.N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat, AVG(Note) AS MoyEtuMat
FROM EVALUER INNER JOIN MATIERE ON EVALUER.CodeMat = MATIERE.CodeMat
INNER JOIN ETUDIANT ON EVALUER.N°Etudiant = ETUDIANT.N°Etudiant
GROUP BY ETUDIANT.N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat;

Remarque : la commande CREATE VIEW va permettre de réutiliser le résultat de la requête (notamment aux deux questions suivantes) comme s'il s'agissait d'une nouvelle table (bien qu'elle soit regénérée dynamiquement lors de son utilisation).
Sous Access, il ne faut pas utiliser la commande CREATE VIEW mais seulement enregistrer la requête. Il est alors possible de s'en resservir comme une table.

Q4 - Quelles sont les moyennes par matière ?


Idem question 3 puis :
R4=REGROUPER_ET_CALCULER(MOYETUMAT, LibelléMat, Moyenne(MoyEtuMat))
Et en langage SQL...

Avec la vue MOYETUMAT de la question 3 :
SELECT LibelléMat, AVG(MoyEtuMat)
FROM MOYETUMAT
GROUP BY LibelléMat ;

Q5 - Quelle est la moyenne générale de chaque étudiant ?


Idem question 3 puis :
MGETU=REGROUPER_ET_CALCULER(MOYETUMAT, N°Etudiant, Nom, Prénom, MgEtu : Somme(MoyEtuMat*CoeffMat)/Somme(CoeffMat))
Et en langage SQL...

Avec la vue MOYETUMAT de la question 3 :
CREATE VIEW MGETU AS
SELECT N°Etudiant, Nom, Prénom, SUM(MoyEtuMat*CoeffMat)/SUM(CoeffMat) AS MgEtu
FROM MOYETUMAT
GROUP BY N°Etudiant, Nom, Prénom ;

Q6 - Quelle est la moyenne générale de la promotion ?


Idem question 5 puis :
MG=CALCULER(MGETU, Moyenne(MgEtu))
Et en langage SQL...

Avec la vue MGETU de la question 5 :
SELECT AVG(MgEtu) FROM MGETU ;

Q7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la moyenne générale de la promotion ?


Idem question 5 et 6 puis :
R=SELECTION(MGETU, MgEtu>=MG)
Et en langage SQL...

Avec la vue MGETU de la question 5 :
SELECT N°Etudiant, Nom, Prénom, MgEtu
FROM MGETU
WHERE MgEtu >= (SELECT AVG(MgEtu) FROM MGETU) ;

 

Exercice4 :  Soit le schéma relationnel suivant :

EQUIPE(CodeEquipe, NomEquipe, DirecteurSportif)
COUREUR(NuméroCoureur, NomCoureur, CodeEquipe*, CodePays*)
PAYS(CodePays, NomPays)
TYPE_ETAPE(CodeType, LibelléType)
ETAPE(NuméroEtape, DateEtape, VilleDép, VilleArr, NbKm, CodeType*)
PARTICIPER(NuméroCoureur*, NuméroEtape*, TempsRéalisé)
ATTRIBUER_BONIFICATION(NuméroEtape*, km, Rang, NbSecondes, NuméroCoureur*)

Q1 - Quelle est la composition de l'équipe FESTINA (Numéro, nom et pays des coureurs) ?


R1=SELECTION(EQUIPE, NomEquipe="FESTINA")
R2=JOINTURE(R1, COUREUR, R1.CodeEquipe=COUREUR.CodeEquipe)
R3=JOINTURE(R2, PAYS, R2.CodePays=PAYS.CodePays)
R4=PROJECTION(R3, NuméroCoureur, NomCoureur, NomPays)
Et en langage SQL...

SELECT NuméroCoureur, NomCoureur, NomPays
FROM EQUIPE A INNER JOIN COUREUR B ON A.CodeEquipe=B.CodeEquipe
INNER JOIN PAYS C ON B.CodePays=C.CodePays
WHERE NomEquipe="FESTINA" ;

Q2 - Quel est le nombre de kilomètres total du Tour de France 97 ?


N=CALCULER(ETAPE, SOMME(NbKm))
Et en langage SQL...

SELECT SUM(Nbkm) FROM ETAPE ;

Q3 - Quel est le nombre de kilomètres total des étapes de type HAUTE MONTAGNE ?

 
R1=SELECTION(TYPE_ETAPE, LibelléType="HAUTE MONTAGNE")
R2=JOINTURE(R1, ETAPE, R1.CodeType=ETAPE.CodeType)
N=CALCULER(R2, SOMME(NbKm))
Et en langage SQL...

SELECT SUM(Nbkm)
FROM ETAPE A INNER JOIN TYPE_ETAPE B ON A.CodeType=B.CodeType
WHERE LibelléType="HAUTE MONTAGNE" ;

Q4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?


R1=PROJECTION(COUREUR, NuméroCoureur)
R2=PROJECTION(ATTRIBUER_BONIFICATION, NuméroCoureur)
R3=DIFFERENCE(R1,R2)
R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur)
R5=PROJECTION(R4, NomCoureur)
Et en langage SQL...

SELECT NomCoureur
FROM COUREUR
WHERE NuméroCoureur NOT IN (SELECT NuméroCoureur FROM ATTRIBUER_BONIFICATION) ;
ou
SELECT NomCoureur
FROM COUREUR C LEFT JOIN ATTRIBUER_BONIFICATION A ON C.NuméroCoureur=A.NuméroCoureur
WHERE A.NuméroCoureur IS NULL ;
 

Q5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?


R1=PROJECTION(PARTICIPER, NuméroCoureur, NuméroEtape)
R2=PROJECTION(ETAPE, NuméroEtape)
R3=DIVISION(R1, R2)
R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur)
R5=PROJECTION(R4, NomCoureur)

ou

N=CALCULER(ETAPE, Comptage())
R1=REGROUPER_ET_CALCULER(PARTICIPER, NuméroCoureur, Nb:Comptage())
R2=SELECTION(R1, Nb=N)
R3=JOINTURE(R2, COUREUR, R2.NuméroCoureur=COUREUR.NuméroCoureur)
R4=PROJECTION(R3, NomCoureur)
Et en langage SQL...

SELECT NomCoureur
FROM PARTICIPER A INNER JOIN COUREUR B ON A.NuméroCoureur=B.NuméroCoureur
GROUP BY NuméroCoureur, NomCoureur
HAVING COUNT(*)=(SELECT COUNT(*) FROM ETAPE) ;

Q6 - Quel est le classement général des coureurs (nom, code équipe, code pays et temps des coureurs) à l'issue des 13 premières étapes sachant que les bonifications ont été intégrées dans les temps réalisés à chaque étape ?


R1=SELECTION(PARTICIPER, NuméroEtape=13)
R2=PROJECTION(R1, NuméroCoureur)
     -> R2 représente l'ensemble des coureurs présents jusqu'à la 13ème étape (ce qui va permettre de ne pas prendre en compte dans le classement ceux qui ont abandonné avant !)
R3=JOINTURE(R2, PARTICIPER, R2.NuméroCoureur=PARTICIPER.NuméroCoureur)
R4=SELECTION(R3, NuméroEtape<=13)
R5=REGROUPER_ET_CALCULER(R4, NuméroCoureur, Total:Somme(TempsRéalisé))
R6=JOINTURE(R5, COUREUR, R5.NuméroCoureur=COUREUR.NuméroCoureur)
R7=PROJECTION(R6, NomCoureur, CodeEquipe, CodePays, Total)
R8=TRI(R7, Totalé)
Et en langage SQL...

SELECT NomCoureur, CodeEquipe, CodePays, SUM(TempsRéalisé) AS Total
FROM PARTICIPER A INNER JOIN COUREUR B ON A.NuméroCoureur=B.NuméroCoureur 
WHERE NuméroEtape<=13 AND A.NuméroCoureur IN
 (SELECT NuméroCoureur FROM PARTICIPER WHERE NuméroEtape=13)
GROUP BY A.NuméroCoureur, NomCoureur, CodeEquipe, CodePays ORDER BY 4 ;