Vous êtes sur la page 1sur 16

PREMIERE ANNEE

TD1 : SERIE D’EXERCICE N°1 (Modèle E-A + Modèle relationnel)

ÉNONCES :

Exercice 1 :
1) Définir ce qu’est une base de données et donner les différentes étapes d’implantation dans le
SGBD Microsoft Access
2) Qu’appelle-t-on propriété d’association ? Donnez un exemple.

Exercice 2 :
Soit le schéma conceptuel de données suivant qui décrit une population où chaque personne a un père
et une mère :
Père
PERSONNE
N°Pers
Nom_Pers 1, 1
A pour
Prenom_Pers
1, 1
DateNais_Pers
Sexe_Pers
Mère
1- Comment appelle-ton ce type d’association ? Pourquoi ?
2- On ajoute les règles de gestion suivantes : Dans cette population chaque personne peut exercer
plusieurs activités professionnelles et une activité peut être exercée par plusieurs personnes. En
plus, certaines personnes n’ont pas de père (Ex : Statut de PND=Père Non Déterminé). Ajoutez
l’entité « ACTIVITE PROFESSIONNELLE» et modifiez le schéma pour prendre en compte ces
nouvelles règles.
3- Déduire le schéma logique de données correspondant.
4- Écrire la requête SQL qui permet de créer la table PERSONNE

Exercice 3
1) Qu’est-ce un SGBD. Donnez-en 3 exemples.
2) Comment procède-t-on pour monter un « état » dans Microsoft Access ?

Exercice 4
1- Proposer un schéma conceptuel pour la gestion des inscriptions d’étudiants de votre
établissement. On s’intéressera uniquement aux années académiques de formation, filières,
cycles et niveaux de formation.
2- Déduire le schéma logique de données correspondant.

Écrire la requête SQL qui permet d’insérer l’étudiant "KAFFO Douglas" de matricule "13BQ029", né le
"17 janvier 1990" à "Bangoulap", de sexe "M" et répondant au n° de téléphone "670 80 83 03".
Exercice 5 :
Pour décrire les employés d’une entreprise, et leur répartition entre les différents services, la table
suivante a été créée.
N°_Empl Nom_Empl Prénom_Empl Date_Nais_Empl N°_Service Nom_Service Date_Creation
1 TCHOFFO Merlin Isidore 01/10/1980 20 Financier 01/01/1970
2 LAGMAGHO Ghislain 12/09/1981 10 Administratif 01/01/1975
3 KAMTA Barnabé 15/04/1978 20 Financier 01/01/1970
4 DJIFFO W. Collins 21/06/1980 20 Financier 01/01/1970
5 ZILONG Jean Claude 27/11/1982 10 Administrative 01/01/1975
6 LOMPA Dieudonné 20/08/1979 30 Juridique 01/04/1980
7 DJITOUO Jacqueline 04/05/1985 10 Administratif 01/01/1957
8 MAFOTSING Carole 06/04/1979 30 Juridique 01/04/1980
9 TALA KAFFO Léonard 14/03/1981 20 Financier 01/01/1970
10 ATIWO Yves Lorent 13/07/1978 20 Financier 01/01/1970

1) Indiquer les anomalies de cette structure


2) Proposer une façon de restructurer cette base de données.

Exercice 6 :
Selon la structure proposée à l’exercice ci-dessus, dégager les schémas relationnel et conceptuel pour
cette base de données.

Donnez le script SQL qui permet de recruter au service administratif l’employée MAKOUDJOU Eléonore,
née le 19 février 1982.

Exercice 7
3) Définir la notion de persistance
4) Qu’est-ce qu’un SGBD et quelle est son utilité?

Exercice 8
On se propose de créer la base de données « SPORTIVE » définie par le schéma relationnel suivant :

EQUIPE (Code_Eq, NomEq, DateCreation, NbJ)


JOUEUR (NumJ, NomJ, AgeJ)
MATCH (NumM, DateM, Equipe1#, Equipe2#)

3- Sachant qu’une équipe contient plusieurs joueurs et qu’un joueur peut jouer un rôle dans
plusieurs matchs, et qu’un match donne droit à un résultat, réécrire la nouvelle représentation
textuelle de cette base et en déduire le schéma conceptuel correspondant.
4- Écrire la requête SQL de création de la table JOUEUR.

Exercice 9 :
Le reverse engineering ou rétro-conception en analyse informatique consiste à reconstituer certains modèles
de conception à partir d’autres modèles. Soit le modèle logique relationnel suivant produit avec Win’ Design :
Les flèches donnent le sens de migration des clés entre les tables. On veut reconstituer le modèle conceptuel des
données (MCD). Répondez aux questions suivantes :

1) Que représente l’attribut EMP_ID dans la table SERVICE ? (0.5pt)


2) Que représente l’attribut SERV_ID dans la table EMPLOYEE ?(0.5pt)
3) Que représentent les attributs EMP_ID et PRJ_ID dans la table WORK FOR ? Qu’appelle-t-on ce type de
table et pourquoi est-elle créée ? (1pt)
Pouvez-vous donc à partir des réponses aux questions ci-dessus donner la représentation conceptuelle de ce
schéma ? N’oubliez pas les cardinalités. (2.0 pts)

Exercice 10 :

Une entreprise commerciale reçoit des commandes de la part de ses clients aux jours ouvrables. Les livraisons sont
effectuées en fin de semaine. Une facturation mensuelle est établie pour toutes les livraisons effectuées au cours du
mois écoulé. Dans cet exemple une occurrence de date peut tout aussi être une date quelconque, une date de fin de
semaine ou de mois. Mais toutes les dates ne sont pas des dates de fin de mois ou de semaine.

exercice 11
Date N°Produit
N°Client
Soit le Graphe suivant :

Libellé_Produit
Tel_Client
Nom_Client Code_Categorie
Adresse_Client

QtéCom, MtantLigneCom

Libellé_Categorie
N°Fournisseur

Prix d’achat produit


Nom_Four Adresse_Four

1- Enumerer 5 règles de gestion


2- Traduire ce schéma en schéma logique de données relationnelles
CORRECTIONS

Exercice 1
1- Deux avantages d’un SGBD : propose des outils d’interrogation et de manipulation des données,
gestion de la sécurité, gestion de la concurrence d’accès, etc.
2- Une propriété d’association est un élément d’information dont l’existence dépend de deux ou plusieurs
entités liées entre elles. Ex. : Si dans une entreprise de distribution de produits on se retrouve dans
une situation où chaque fournisseur négocie ses prix, le prix du produit ne peut être simplement une
propriété de l’entité Produit, il doit être une propriété d’association entre Produit et Fournisseur.

Exercice 2
1- C’est une association réflexive car elle concerne une entité en association avec elle-même.
2- Nouveau schéma obtenu (notez les parties en rouge):

ACTIVITES_PROF Père
PERSONNE
Num_Activ
Nom_Activ Exerce N°Pers
0, n 0, n Nom_Pers 0, 1
Description_Activ
Lieu_Activ DateDébut Prenom_Pers A pour
Categorie_Activ DateFin DateNais_Pers 1, 1
Sexe_Pers

Mère
3- SLDR :
PERSONNE (N°Pers, Nom_Pers, Prenom_Pers, DateNais_Pers, Sexe Pers, N°Pers_Pere#,
N°Pers_Mere#)
ACTIVITES_PROF (Num_Activ, Nom_Activ, Description_Activ, Lieu_Activ, Categorie_Activ)
ACTIVITES_EXERCEES (Num_Activ#, N°Pers#, DateDebut, DateFin)

4- create table PERSONNE ( N°_Persvarchar(20) not null Primary key, N°_Pers_Perevarchar(20) not
null, N°_Pers_Merevarchar(20) not null, Nom_Pers varchar(50) not null, Prenom_Pers varchar(50)
not null, DateNais_Pers varchar(10), Sexe_Pers char not null, primary key (N°_Pers), foreign
key(N°_Pers_Pere) references PERSONNE(N°_Pers), foreign key(N°_Pers_Mere) references
PERSONNE(N°_Pers) );

Exercice 3 :

1- Il existe plusieurs types de contraintes d’intégrité :


- Contrainte d’intégrité de domaine: Si l’attribut N°Client de la relation CLIENT est défini sur le
domaine de valeurs numériques, il ne peut contenir de lettre.
- Contrainte d’intégrité de référence : Si l’attribut N°Client de la relation CLIENT prend des
valeurs 001, 002, 003 jusqu’à 150, la clé étrangère N°CLIENT# de la table COMMANDE ne peut
prendre la valeur 250. Autrement dit, cela voudrait dire qu’on peut attribuer une commande à un
client qui n’existe pas.
2- Une relation peut ne pas avoir de clé candidate mais la clé primaire dans une relation est obligatoire
pour identifier de manière unique chaque tuple. Donc même en l’absence de clé candidate elle doit
être créée.

Exercice 4 :

1- D’après les règles énoncées, la proposition de schéma idéal est la suivante :

ANNEE
Id_Annee
Code_Annee ETUDIANT
0, n
Matricule_Etud
NIVEAU 0, n S’inscrire 1, n
Nom_Etud
Id_Niv Date d’ins Prenom_Etud
Intitule_Niv DateNais
0, n LieuNais
1, 1 Sexe
SEMESTRE Telephone
Id_Sem Email
du cycle Intitule_sem Dernière institution
Dernier resultat
Dernière moyenne
Redoublant
1, n

CYCLE-FOR FILIERE
De la filière
Code_Cycle 1, 1 1, n Code_Fil Designation_Fil
Designation_Cycle
EVALUATION

2- SLDR correspondant : Id_Eval


Note_Obtenue
FILIERE(Code_Fil, Designation_Fil) Type_Eval
CYCLE_FOR (Code_Cycle, Designation_Cycle, #Code_Fil) Date

NIVEAU (Code_Niv, Intitule_Niv, #Code_Cycle)


ETUDIANT (Matricule_Etud, Nom_Etud, Prenom_Etud, DateNais, LieuNais, Sexe, Telephone, Email,
Derniere institution, Dernier resultat, Derniere moyenne, redoublant)
INSCRIPTION (#Matricule_Etud, #Code_Niv, #Id_Sem, #Id_Annee, Date d’ins)

3- insert into ETUDIANT (Matricule_Etud, Nom_Etud, Prenom_Etud, DateNais, LieuNais, Sexe,


Telephone) values ( ‘13BQ029’, ‘KAFFO’, ‘Douglas’, ‘17/01/1990’, ‘Bangoulap’, ‘M’, 670808303);

Exercice 5

3- Les anomalies de cette structure :


- Non-respect de la notion de dépendance fonctionnelle : Si Nom_Service est en dépendance
fonctionnelle avec N°_Service, il n’en demeure pas pour autant avec N°_Empl. La table Service
est imbriquée dans la table Employé.
- Redondance des informations : les mêmes services reviennent dans plusieurs tuples de la table
- Incohérence des informations : Service administratif et Administrative ; service administratif
crée le 01/01/1975 et service administratif crée le 01/01/1957, sûrement des fautes au moment
de la saisie à répétition des informations.

4- Meilleure Proposition
2 tables séparées et reliées par un champ. la colonne N°_serv de la table EMPLOYE référence la
colonne N°_Service de la table SERVICE

Table EMPLOYE Table


SERVICE
N°_E Nom_Empl Prénom_Empl Date_Nais_E N° N°_Service Nom_Service Date_Creation
mpl mpl _serv
1 TCHOFFO Merlin Isidore 01/10/1980 20 10 Administratif 01/01/1975
2 LAGMAGHO Ghislain 12/09/1981 10 20 Financier 01/01/1970
3 KAMTA Barnabé 15/04/1978 20 30 Juridique 01/04/1980
4 DJIFFO W. Collins 21/06/1980 20
5 ZILONG Jean Claude 27/11/1982 10
6 LOMPA Dieudonné 20/08/1979 30
7 DJITOUO Jacqueline 04/05/1985 10
8 MAFOTSING Carole 06/04/1979 30
9 TALA KAFFO Léonard 14/03/1981 20
10 ATIWO Yves Lorent 13/07/1978 20

Exercice 6 :
5- Schéma relationnel :
EMPLOYE (N°_Empl, Nom_Empl, Prenom_Empl, Date_Nais_Empl, N°_Service#)
SERVICE (N°_Service, Nom_Service, Date_Création)

Schéma conceptuel : SERVICE


EMPLOYE

N°_Empl N°_Service
1, 1 affecter 1, n Nom_Service
Nom_Empl
DateNais_Pers

6- Script sql d’insertion nouvel employé :


insert into EMPLOYE values (11, ‘MAKOUDJOU’, ‘Eléonore, ‘19/02/1982, 10);

Exercice 7 :

1- La persistance traduit la sauvegarde des données et conservation de leur état entre plusieurs


sollicitations par des applications. C’est aussi l’indépendance entre données et applications installées.
2- Un SGBD est un logiciel qui permet de décrire, modifier, interroger et administrer les données d’une
base de données. il propose un interface graphique intuitif qui facilite la manipulation des données et
masquant de ce fait les traitements intermédiaires ou les simplifiant

Exercice 8 :

4- Nouvelle représentation textuelle = schéma relationnel


EQUIPE (Code_Eq, NomEq, DateCreation, NbJ)
JOUEUR (NumJ, NomJ, AgeJ)
APPARTENIR (NumJ#, CodeEq#)
MATCH (NumM, DateM, Equipe1#, Equipe2#)
ROLEJOUE (NumJ#,NumM#, Role)

SCD :
équipe1
1, n
JOUEUR EQUIPE MATCH
NumJ CodeEq
Appartenir 1, 1 NumM
NomJ NomEq DateM
AgeJ DateCreation Résultat
1, n 1, n
NbJ 1, 1
1, n
0, n 0, n

équipe2

Rôle joué
Rôle

5- Script SQL de création de la table JOUEUR :


create table JOUEUR ( Numj integer (03) not null Primary Key, NomJ varchar(20), AgeJ
integer(03));

Exercice 9 :
1) Clé étrangère issue de la table EMPLOYEE
2) Clé étrangère issue de la table SERVICE
3) Ces attributs sont non seulement des clés primaires pour la nouvelle table WORK FOR mais aussi des clés
étrangères issues respectivement de la table EMPLOYEE et de la table PROJECT. Ce type de table s’appelle
table de jointure ou d’association. Elle doit sa présence grâce à une association ayant toutes les
cardinalités maximales égales à n entre les entités EMPLOYEE et PROJECT.
4) MCD correspondant :

Exercice 10
MCD Correspondant Livrer
Qté livrée

Fin de semaine

0, n
Facturer 0, n CALENDRIER
Mtant fact Fin de mois Date

0, n
1, n 1, n Date de commande
1, n
CLIENT
PRODUIT
Commander Num_Produit
Num_Client 1, n 1, n Libellé_Produit
Qté Cmandée
Nom_client Prix d’achat
Adresse_client
Telephone_Client
MLD
CLIENT(Num_client, Nom_client, Adresse_client, Telephone_client)
PRODUIT(Num_Produit, Libellé_Produit, Prix d’achat)
DATE(Date)
COMMANDER(#Num_Produit, #Num_client, Qté Cmandée)
LIVRER(#Num_Produit, #Num_client, Qté Livrée)
FACTURER(#Num_client, #Date, Mtant fact)

Exercice 11 :
5 Règles de gestion :
1- La Quantité Commandée ainsi que le Montant d’une ligne de commande dépendent du client, de la date
etdu produit.
2- Le prix d’achat dépend du produit et du fournisseur
3- Un produit appartient à une catégorie
4- Une catégorie de produit est identifiée par un Code et décrite par un Libellé
5- Les clients sont identifiés par un numéro et décrits par un nom, une adresse et un téléphone.

CALENDRIER
Date

CLIENT PRODUIT
N°_Client N°_Produit
SCD : Nom_client Libellé_Produit
Adresse_client 1, n
1, n 1, n
Tel_Client
Commander 1, n 1, 1
QtéCom
MtantLigneCom Appartenir
FOURNISSEUR
1, n
N°_Four
Nom_Four 1, n Fournir CATEGORIE
Adresse_Four Prix d’achat Code_Categorie
SLD : Libellé_Categorie
CLIENT(N°Client, Nom_Client, Adresse_Client, Tel_client)
CALENDRIER(Date)
PRODUIT(N°Produit,Libellé_Produit,#Code_Categorie)
CATEGORIE(Code_Categorie, Libellé_Catégorie)
FOURNISSEUR(N°_Four, Nom_Four, Adresse_Four)
COMMANDER(#N°_Client, #Date, #N°_Produit, QtéCom, MtantLigneCom)
FOURNIR(#N°_Four, #N°_Produit, Prix d’achat)

TP1 : PREMIER TP (Voir Protocole n°1)


Mise en place d’une BD dans OOoBase ou Access
Voir Protocole TP n°1

DEUXIEME ANNEE

TP : DEUXIEME TP (Voir protocole N°2)


Mise en place d’une BD dans un autre SGBD que OOoBase ou Access
Enoncé : Implanter dans Oracle ou autre SGBD que OOoBase et Access la base de données trouvée dans
l’exemple complet introductif sur les notions avancées.

Solution :
ANNEE
Id_Annee
Code_Annee ETUDIANT
0, n Matricule_Etud
Dernière institution
NIVEAU 0, n S’inscrire 1, n
Dernier resultat
Code_Niv Intitule_Niv Dernière moyenne
Redoublant
0, n
1, n
1, 10, n
SEMESTRE
Id_Sem 1, n
du cycle Intitule_sem
1, n

Pour le Fait au PERSONNE


1, n Id_Pers
1, 1 1, 1 Nom_Pers
CYCLE_FOR Prenom_Pers
Code_Cycle Designation_cycle COURS Participer DateNais
1, n Note finale
Id_Cours LieuNais
Intitule_cours Sexe
Telephone
1, 1 Email
1, 1
Enseigné par
de la filière

1, n
Appliquons les règles pratiques. ENSEIGNANT
1, n
Matricule_Ens
EVALUATION
Règle 1 : Les entités1,deviennent
n des relations
Formation
Qualification
ANNEE(Id_Annee, Code_Annee)
FILIERE Grade
Id_Eval
ETUDIANT(Matricule_Etud, Dernière institution,
Code_Fil Designation_Fil Dernier resultat, Note_Obtenue
Dernière moyenne, Redoublant)
Institution d’origine
SEMESTRE(Id_Sem, Intitule_sem) Type_Eval
Date
NIVEAU(Code_Niv, Intitule_Niv)
CYCLE_FOR(Code_Cycle, Designation_cycle)
FILIERE(Code_Fil, Designation_Fil)
PERSONNE(Id_Pers, Nom_Pers, Prenom_Pers, DateNais, LieuNais, Sexe, Telephone, Email)
ENSEIGNANT(Matricule_Ens, Formation, Qualification, Grade, Institution d’origine)
EVALUATION(Id_Eval, Note_Obtenue, Type_Eval, Date)
COURS(Id_Cours, Intitule_cours)

Règle 2 : Traitement des cardinalités entièrement x, n


ANNEE(Id_Annee, Code_Annee)
SEMESTRE(Id_Sem, Intitule_sem)
FILIERE(Code_Fil, Designation_Fil)
EVALUATION(Id_Eval, Note_Obtenue, Type_Eval, Date)

Règle 3 : Traitement des cardinalités 1,1


NIVEAU(Code_Niv, Intitule_Niv, Code_Cycle#)
COURS(Id_Cours, Intitule_cours, Code_niv#, Id_sem#, Matricule_Ens#)
CYCLE_FOR(Code_Cycle, Designation_cycle, Code_Fil#)

Règle 4 : Traitement des associations x,n--y,n)


INSCRIPTION(Matricule_Etud, Code_Niv, Id_Sem, Id_Annee)
NOTES(Matricule_Etud, Id_Eval, Id_Cours, Note finale)
Règle 5 : Traitement des entités spécialisées et générique
PERSONNE(Id_Pers, Nom_Pers, Prenom_Pers, DateNais, LieuNais, Sexe, Telephone, Email)
ETUDIANT(Matricule_Etud, Dernière institution, Dernier resultat, Dernière moyenne, Redoublant, Id_Pers)
ENSEIGNANT(Matricule_Ens, Formation, Qualification, Grade, Institution d’origine, Id_Pers#)

En définitive, on obtient le schéma relationnel suivant :


ANNEE(Id_Annee, Code_Annee)
SEMESTRE(Id_Sem, Intitule_sem)
FILIERE(Code_Fil, Designation_Fil)
EVALUATION(Id_Eval, Note_Obtenue, Type_Eval, Date)
NIVEAU(Code_Niv, Intitule_Niv, Code_Cycle#)
COURS(Id_Cours, Intitule_cours, Code_niv#, Id_sem#, Matricule_Ens#)
CYCLE_FOR(Code_Cycle, Designation_cycle, Code_Fil#)
INSCRIPTION(Matricule_Etud, Code_Niv, Id_Sem, Id_Annee)
NOTES(Matricule_Etud, Id_Eval, Id_Cours, Note finale)
PERSONNE(Id_Pers, Nom_Pers, Prenom_Pers, DateNais, LieuNais, Sexe, Telephone, Email)
ETUDIANT(Matricule_Etud, Dernière institution, Dernier resultat, Dernière moyenne, Redoublant, Id_Pers)
ENSEIGNANT(Matricule_Ens, Formation, Qualification, Grade, Institution d’origine, Id_Pers#)

TD3 : SERIE D’EXERCICES N°3 (Algèbre Relationnel)


Exercices :
On considère les deux relations suivantes :
LESFILMS (TITRE, PAYS, ANNEE, REALISATEUR, DUREE)
LESACTEURS (TITRE, ACTEUR)
1) Q1: Liste des films français (titre, année, réalisateur).
2) Q2: Donnez les années de sortie des films tournés par GABIN.
3) Q3: Trouver les acteurs qui ont tourné avec TRUFFAUT comme réalisateur.
4) Q4: Liste des films où le réalisateur est aussi acteur
5) Q5: Liste des acteurs partenaires de DENEUVE
6) Q6: Réalisateurs ayant joué comme acteurs dans des films qu'ils ne réalisaient pas eux-mêmes.
7) Q7: Réalisateurs qui ne jouent pas dans un de leur propre film.
8) Q8: Donnez les acteurs qui jouent dans tous les films de Truffaut.

Solutions :
Q1: Liste des films français (titre, année, réalisateur).
projection(titre, année, réalisateur; sélection(pays='France', LESFILMS))

Q2: Donnez les années de sortie des films tournés par GABIN.
projection(année; jointure(LESFILMS.titre=LESACTEURS.titre,LESFILMS;sélection(acteur='Gabin';
LESACTEURS)))

Q3: Trouver les acteurs qui ont tourné avec TRUFFAUT comme réalisateur.
projection(acteur, jointure(LESFILMS.titre=LESACTEURS.titre;
LESACTEURS;sélection(réalisateur='Truffaut'; LESFILMS)))
Q4: Trouver tous les acteurs qui ont été partenaires de DENEUVE.
LESACTEURS1 := sélection(acteur='Deneuve';LESACTEURS)
RES := projection(LESACTEURS.acteur,sélection(LESACTEURS1.titre=LESACTEURS.titre; sélection(acteur!
='Deneuve';LESACTEURS) X LESACTEURS1)))
Q5: Liste des films où le réalisateur est aussi acteur
projection(LESFILMS.titre; sélection(acteur=réalisateur; jointure(LESFILMS.titre=LESACTEURS.titre;
LESFILMS; LESACTEURS)))
Q6: Réalisateurs ayant joué comme acteurs dans des films qu'ils ne réalisaient pas eux-mêmes.
RES1 := projection(acteur;sélection(acteur!=réalisateur; jointure(LESFILMS.titre=LESACTEURS.titre;
LESFILMS; LESACTEURS)))
RES1 donne les acteurs d'un film qui n'ont pas réalisé ce film.
RES2 := projection(LESFILMS; réalisateur)
RES2 donne les réalisateurs
RES := RES1 INTERSECTION RES2
RES donne les réalisateurs ayant joué comme acteurs dans des films qu'ils ne réalisaient pas eux-mêmes.

Q7: Réalisateurs qui ne jouent pas dans un de leur propre film.


RES1 := projection(réalisateur; LESFILMS) intersection projection(acteur;
LESACTEURS)
RES1 donne les réalisateurs / acteurs.
RES2 := projection(LESFILMS.réalisateur; sélection(acteur=réalisateur; jointure (LESFILMS.titre =
LESACTEURS.titre; LESFILMS; LESACTEURS)))
RES2 donne les réalisateurs qui sont acteurs dans leur propre film.
RES := RES1 - RES2
RES donne les réalisateurs qui ne jouent pas dans un de leurs propres films.

Q8: Donnez les acteurs qui jouent dans tous les films de Truffaut.
LESACTEURS / projection(titre;sélection(réalisateur='Truffaut;LESFILMS))

TD4 : SERIE D’EXERCICES N°4 (SQL)


Exercices :
Soit la base de données suivante permettant de gérer les consultations entre des médecins identifiés par
leurs numéros RPPS (répertoire partagé des professionnels de santé) et des patients identifiés par leur
numéro de sécurité social et associés à un médecin traitant.

Patient (numSS, nomP, prenomP, sexe, dateNaiss, numRPPS#)


Medecin (numRPPS, nomM, prenomM, specialite, ville, adresse)
Consulte (numRPPS#, numSS#, date, diagnostic)

Écrire en SQL les requêtes qui permettent d’effectuer les actions suivantes:

1) Afficher la liste de tous les médecins


SELECT * FROM Medecin ;

2) Afficher le nom et le prénom de tous les patients, trier par ordre inverse sur les noms;
SELECT nomP, prenomP
FROM Patient ORDERED BY 1 DESC ;

3) Afficher le nom, le prénom et la spécialité de tous les médecins de Lyon, si le médecin n’a
pas de spécialité, afficher ‘généraliste’ ;
SELECT nomM, prenomM, , nvl(specialite, 'généraliste')
FROM Medecin WHERE ville = ‘Lyon’ ;

4) Afficher tous les patients nés après le 01/05/1985 ;


SELECT nomP, prenomP
FROM Patient
WHERE dateNaiss > ‘01051985’ ;
5) Afficher le nom et le prénom des médecins dont la spécialité contient la chaîne "logue" ;
SELECT nomM, prenomM
FROM Medecin
WHERE specialite LIKE ‘%logue%’ ;

6) Afficher les prénoms des patients dont le nom est Dupont, Durant ou Martin ;
SELECT prenomP
FROM Patient
WHERE nomP IN (‘Dupont’, ‘Durant’, ‘Martin’) ;

7) Afficher le nombre de médecins à Lyon ;


SELECT COUNT(*)
FROM Medecin
WHERE ville = ‘Lyon’ ;

8) Afficher la liste des consultations qui n’ont pas donné lieu à une ordonnance;
SELECT numRPPS, numSS FROM Consulte WHERE numOrd = NULL ;

9) Afficher tous les médecins qui ont la même spécialité et qui sont dans la même ville que le
médecin Paul DESMON ;
SELECT nomM,prenomM
FROM Medecin
WHERE (specialite,ville) = (SELECT specialite, ville FROM Medecin WHERE
nomM=’DESMON’ AND prenomM=‘Paul’) ;
Ecole Nationale des Sciences A.U. 08/09
de l’Informatique

10) Afficher la liste des patients (nom, prénom) avec le nom de leur médecin traitant, par
ordre alphabétique inverse sur les noms puis sur les prénoms ;
SELECT nomP, prenomP, nomM
FROM Patient NATURAL JOIN Medecin
ORDERED BY nomP DESC, prenomP DESC ;

11) Afficher pour chaque patient (nom, prénom) le nom et le prénom des médecins qu’il a
consulté ;
SELECT nomP, prenomP, nomM, prenomM
FROM Patient, Medecin, Consulte
WHERE Patient.numSS=Consulte.numSS AND Consulte.numRPPS =
Medecin.numRPPS ;

12) Afficher le nombre de consultations de chaque médecin (numRPPS) pour la journée du


14-10-2008, étiqueter cette colonne ‘nbConsult’ ;
SELECT numRPPS, COUNT(*) AS nbConsult
FROM Consulte
WHERE date = ‘14102008’
GROUP BY numRPPS ;

13) Numéro de sécurité sociale du patient qui a le plus de consultations ;


SELECT numSS
FROM CONSULTE
GROUP BY numSS
HAVING COUNT(*)= (SELECT MAX(COUNT(*)) FROM CONSULT GROUP BY
numSS) ;
14) Afficher tous les patients (numSS, nom, prénom) qui ont consulté un autre médecin que
leur médecin traitant ;
SELECT numSS, nomP, prénomP
FROM PATIENT pt
WHERE EXISTS
(SELECT * FROM CONSULTE WHERE numSS=pt.numSS AND
numRPPS!=pt.numRPPS);

15) Afficher le nom et le prénom du ou des médecins qui sont médecins traitants du plus
grand nombre de patients ;
SELECT DISTINCT nomM, prénomM
FROM MEDECIN
WHERE MEDECIN.numRPPS =
(SELECT numRPPS
FROM PATIENT
GROUP BY numRPPS
HAVING COUNT(numSS) =
(SELECT MAX(COUNT(numSS))
FROM PATIENT
GROUP BY numRPPS));

16) Afficher tous les patients (nom, prénom) qui ont consulté le médecin ayant le numRPPS
‘12345’ entre le 18-06-2008 et le 17-07-2008 ;
SELECT nomP, prenomP
FROM Patient INNER JOIN Consulte ON Patient. numSS=Consulte.numSS
WHERE Consulte.numRPPS=’12345’ AND Consulte.date BETWEEN ‘18062008’ AND
‘17072008’ ;
Ecole Nationale des Sciences A.U. 08/09
de l’Informatique

17) Afficher tous les patients (nom, prénom) qui ont consulté le médecin ayant le numRPPS
‘12345’ le 18-06-2008 et le 17-07-2008 ;
SELECT nomP, prenomP FROM Patient INNER JOIN Consulte ON Patient.
numSS=Consulte.numSS WHERE Consulte.numRPPS=’12345’ AND Consulte.date
IN (‘18062008’, ‘17072008’) ;

18) Liste des patients qui ont consulté au moins deux médecins de la même spécialité le
même jour ;
SELECT nomP, prénomP
FROM PATIENT pt
WHERE
(SELECT COUNT(DISTINCT numRPPS)
FROM CONSULTE, MEDECIN
WHERE CONSULTE.numRPPS = MEDECIN.numRPPS AND CONSULTE.numSS =
pt.numRPPS
GROUP BY CONSULTE.numSS, CONSULTE.date, MEDECIN.spécialite) >2
On souhaite maintenant ajouter les deux tables suivantes pour pouvoir gérer les prescriptions
des médecins.
Prescription (numOrd, idMed#, nbBoites)
Medicament (idMed, nomMed, prix, categorie)
19) Créer la table PRESCRIPTION ;
CREATE TABLE Prescription (
numOrd INTEGER CONSTRAINT keyP1 PRIMARY KEY,
idMed SMALLINT CONSTRAINT keyP2 REFERENCES Medicament (idMed)
[ON DELETE CASCADE],
nbBoites SMALLINT) ;

20) Créer la table MEDICAMENT ;


CREATE TABLE Medicament (
idMed SMALLINT CONSTRAINT keyM1 PRIMARY KEY,
nomMed VARCHAR(30),
prix DECIMAL (9, 2),
categorie VARCHAR(30)) ;

21) Ajouter la numOrd comme clé étranger dans la table Consulte : Consulte (numRPPS#,
numSS#, date, diagnostic, numOrd#)
ALTER TABLE Consulte ADD (numOrd INTEGER CONSTRAINT keyC2
REFERENCES Prescription (numOrd)) ;
22) Ajouter le médicament n° 5432, avec le nom ‘aspirine’ et le prix ’11,05’ et de catégorie
‘Antalgique’;
INSERT INTO Medicament VALUES (5432, ‘aspirine’, 11,05, ‘Antalgique’) ;
Ecole Nationale des Sciences A.U. 08/09
de l’Informatique

23) Donner le prix et le nom des médicaments dont le prix est supérieur au prix moyen de leur
catégorie.
SELECT nomMed, prix
FROM Medicament me
WHERE prix > (SELECT AVG(prix) FROM Medicament WHERE
categorie=me.categorie) ;

24) Donner le nom de la catégorie et le prix du médicament le moins cher de la catégorie


ayant le plus grand prix moyen.
SELECT categorie, MIN(prix)
FROM MEDICAMENT
GROUP BY categorie
HAVING avg (prix) = (SELECT MAX(AVG(prix)) FROM MEDICAMENT GROUP
BY categorie);

25) Afficher pour tous les médecins (numRPPS) en activité le ’11-08-2008’ la liste des
patients (numSS) qu’ils ont traité ainsi que le montant total de leurs ordonnances (somme
des médicaments prescrits avec le prix multiplié par le nombre de boites) ;
SELECT numRPPS, numSS, SUM(prix*nbBoite)
FROM CONSULT ct,PRESCRIPTION pt,MEDICAMENT mt
WHERE ct.numOrd=pt.numOrd AND pt.numMed=mt.numMed AND ct.date='11-08-2008'
group by (numRPPS, numSS);

26) Afficher le prix de la plus petite ordonnance ;


SELECT SUM(prix*nbBoites)
FROM PRESCRIPTION,MEDICAMENT
WHERE PRESCRIPTION.idmed = MEDICAMENT.idmed
GROUP BY numOrd
HAVING SUM(prix*nbBoites)=
(SELECT MIN(SUM(prix*nbBoites)) FROM PRESCRIPTION,MEDICAMENT
WHERE PRESCRIPTION.idmed = MEDICAMENT.idmed
GROUP BY numOrd);

27) Afficher la liste des médecins accompagnée du prix maximum de leur ordonnance ;
SELECT nomM,prenomM, max(montant)
FROM MEDECIN,(SELECT numOrd, numRPPS, SUM(prix*nbBoites) AS montant
FROM CONSULTE,PRESCRIPTION,MEDICAMENT
WHERE CONSULTE.numOrd=prescription.numOrd AND
PRESCRIPTION.idmed = MEDICAMENT.idmed
GROUP BY numOrd, numRPPS)
WHERE CONSULTE.numRPPS=MEDECIN.numRPPS;

28) Donner le nom et le prénom des patients qui ont eu la plus grosse prescription ;
SELECT nomP,prenomP
FROM PATIENT,CONSULT
WHERE PATIENT.numSS=CONSULT.numSS AND CONSULT.numOrd IN
(SELECT numOrd
FROM PRESCRIPTION,MEDICAMENT
WHERE PRESCRIPTION.idmed = MEDICAMENT.idmed
GROUP BY (numOrd)
HAVING SUM(prix*nbBoites)=
(SELECT MAX(SUM(prix*nbBoites)) FROM PRESCRIPTION,MEDICAMENT
WHERE PRESCRIPTION.idmed = MEDICAMENT.idmed
GROUP BY (numOrd);

29) Donner le nom du médicament le plus prescrit par les ‘pneumologues’ ;


SELECT idMed
FROM MEDECIN, CONSULT, PRESCRIPTION
WHERE MEDECIN.specialite = ‘pneumologue’
AND MEDECIN.numRPPS=CONSULT.numRPPS
AND CONSULT.numOrd=PRESCRIPTION.numOrd
GROUP BY idMed
HAVING count(*)=(SELECT MAX(COUNT(*))
FROM MEDECIN, CONSULT, PRESCRIPTION
WHERE MEDECIN.specialite = ‘pneumologue’
AND MEDECIN.numRPPS=CONSULT.numRPPS
AND CONSULT.numOrd=PRESCRIPTION.numOrd
GROUP BY idMed) ;

Vous aimerez peut-être aussi