Académique Documents
Professionnel Documents
Culture Documents
Exercice 1 (9 points)
On considère le schéma relationnel suivant :
IMMEUBLE (Adresse, Nbre_Etages, Date_Construction, Nom_Propriétaire)
APPARTEMENT(Adresse_Immeuble, Num_Appart, Nom_Occupant, Type_Appart,
Superficie, Etage)
PERSONNE (Nom, Age, Profession, Adresse, Num_Appart)
ÉCOLE (Nom_Ecole, Adresse_Ecole, Nbre_Classes, Directeur)
CLASSE (Nom_Ecole, Nom_Classe, Nom_Maître, Nbre_élèves)
ENFANT (Nom_Responsable, Prénom_Enfant, Année_Naissance, Nom_Ecole, Nom_Classe)
On trouve dans un SGBD relationnel les relations ci-dessous. Les clés primaires sont
soulignées, mais pas les clés étrangères.
IMMEUBLE (Adresse, Nb-étages, Date-construction, Nom-Gérant)
APPART (Adresse, Numéro, Type, Superficie, Etage)
PERSONNE (Nom, Age, Code-Profession)
OCCUPANT (Adresse, Numéro-Appart, Nom-Occupant, Date-arrivée, Date-départ)
PROPRIÉTÉ (Adresse, Nom-Propriétaire, Quote-part)
TYPE-APPART (Code, Libellé)
PROFESSION (Code, Libellé)
1) Identifier toutes les contraintes de clés étrangères dans chaque relation sous la forme :
Entité1[clé_étrangère] ⊆ Entité2[clé_primaire]
2) Reconstruire le schéma Entité/Relation.
3) Définir en SQL les schémas des relations Occupant et Appart.
Exercice 3 (6 points)
Bon Courage.
Page 2/2
Correction de l'examen semestriel (Janvier 2006)
Exercice 1 (9 points)
1) Donner l’adresse des immeubles ayant plus de 10 étages et construits avant 1970. (1 pt)
projAdresse(SelectNbre_Etages > 10 ET Date-construction < 1970 (IMMEUBLE))
SELECT Adresse
FROM IMMEUBLE
WHERE Nbre_Etages > 10 AND Date-construction < 1970;
2) Donner les noms des personnes qui habitent dans un immeuble dont ils sont propriétaires
(occupants et habitants) (1 pt).
ProjNom (joinPersonne.Adresse=Immeuble.Adresse
ET Personne.Nom= Immeuble.Nom_Propriétaire (PERSONNE,IMMEUBLE))
SELECT Nom
FROM PERSONNE P, IMMEUBLE I
WHERE P.Adresse = I.Adresse
AND Nom = Nom_Propriétaire;
3) Donner les noms des personnes qui ne sont pas propriétaires (1 pt).
ProjNom(PERSONNE) - ProjNom_Propriétaire(IMMEUBLE)
SELECT Nom
FROM PERSONNE
WHERE Nom NOT IN (SELECT Nom_Propriétaire FROM IMMEUBLE)
4) Donner les adresses des immeubles possédés par des informaticiens dont l’âge est
inférieur à 40 ans (1 pt).
projAdresse(SelectAge<40 ET Profession = ‘INFORMATICIEN’
(joinPersonne.Nom = Immeuble.Nom_Propriétaire(PERSONNE,IMMEUBLE)))
SELECT Adresse SELECT Adresse
FROM PERSONNE, IMMEUBLE FROM IMMEUBLE
WHERE Nom = Nom_Propriétaire WHERE Nom_Propriétaire IN
AND Age < 40 (SELECT Nom
AND Profession = ’INFORMATICIEN’ FROM PERSONNE
AND Age < 40
AND Profession = ’INFORMATICIEN’
5) Donner la liste des occupants (nom, âge, profession) des immeubles possédés par Mr.
BEN SALEH (1 pt).
ProjNom,Age,Profession(SelectNom_Propriétaire=’Ben Saleh’(
joinPersonne.Adresse =Immeuble.Adresse(PERSONNE,IMMEUBLE))))
Page 1/5
SELECT P.Nom, P.Age, P.Profession
FROM PERSONNE P, IMMEUBLE I
WHERE I.Adresse = P.Adresse
AND I.Nom_Propriétaire = ’BEN SALEH’;
7) Donner les noms des maîtres qui habitent dans le même immeuble (à la même adresse)
qu’au moins un de leurs élèves (on suppose que les enfants vivent sous le même toit que leur
responsable) (1 pt).
SELECT C.Nom_Maître
FROM CLASSE C, PERSONNE P1, Enfant E, Personne P2
WHERE C.Nom_Maître = P1.Nom
AND P2.Nom = E.Nom_Responsable
AND P1.Adresse = P2.Adresse
AND E.Nom_Ecole = C.Nom_Ecole
AND E.Nom_Classe = C.Nom_Classe;
Page 2/5
Exercice 2 (5 points)
1) (1 pt) APPART[Adresse] ⊆ IMMEUBLE[Adresse]
APPART[Type] ⊆ TYPE-APPART[Code]
Occupant[Nom-Occupant] ⊆ PERSONNE[NOM]
Occupant[Adresse, Numéro-Appart] ⊆ APPART[Adresse, Numéro]
IMMEUBLE[Nom-Gérant] ⊆ PERSONNE[NOM]
PROPRIÉTÉ[Adresse] ⊆ IMMEUBLE[Adresse]
PROPRIÉTÉ[Nom-Propriétaire] ⊆ PERSONNE[NOM]
PERSONNE[Code-Profession] ⊆ PROFESSION[Code]
2) (2 pts)
1-N
1-N 1-1
PROPRIÉTÉ Est géré
Occupant
- Quote-part
- Date-arrivée
- Date-départ A comme
PROFESSION type
1-N 1-N 1-N 1-N
- Code 1-N
- Libellé A comme
profession Personne TYPE-APPART
- Nom
1-1 - Age - Code
- Libellé
Schéma du MCD
3. Création du schéma des relations (2 points)
CREATE TABLE Occupant (
Adresse VARCHAR(30),
Numéro-Appart NUMBER(4),
Nom-Occupant VARCHAR(30),
Date-arrivée DATE,
Date-départ DATE,
Constraint Occupant_PK PRIMARY KEY (Adresse,Numéro-Appart,Nom-Occupant)
Constraint Occupant_Adresse_Numéro-Appart_FK FOREIGN KEY
(Adresse,Numéro-Appart) REFERENCES Appart,
Constraint Occupant_Nom-Occupant_FK FOREIGN KEY(Nom-Occupant)
REFERENCES Personne);
CREATE TABLE Appart (
Adresse VARCHAR(30),
Numéro NUMBER(4),
Type VARCHAR(30),
Superficie NUMBER(4),
Etage NUMBER(4),
Constraint Appart_PK PRIMARY KEY (Adresse, Numéro),
Constraint Appart_Adresse_FK FOREIGN KEY (Adresse)
REFERENCES Immeuble ON DELETE CASCADE ON UPDATE CASCADE,
Constraint Appart_Type_FK FOREIGN KEY (Type)
REFERENCES Type-Appart
);
Page 3/5
Exercice 3 (6 points)
1. Donner le salaire et le nom des employés gagnant plus que tous les vendeurs. (0,5 pt)
SELECT NomEmp, Salaire
FROM Employé
WHERE Salaire > ALL (SELECT Salaire FROM Employé
WHERE Profession=’Vendeur’);
2. Donner les noms des employés et les noms de leurs directeurs. (0,5 pt)
SELECT E1.NomEmp, E2.NomEmp
FROM Employé E1, Employé E2, Département D
WHERE E1.NumDept =D.NumDept
AND E2.NumEmp = D.Directeur;
3. Donner les numéros des départements qui n’ont pas d’employés. (0,5 pt)
SELECT NumDept
FROM Département
WHERE NumDept NOT IN (SELECT NumDept FROM Employé);
4. Donner le nom et la date d’embauche des employés embauchés avant leur directeur; donner
également le nom et la date d’embauche de leur directeur (0,5pt).
SELECT E1.NomEmp, E1.DateEmbauche, E2.NomEmp, E2.DateEmbauche
FROM Employé E1, Employé E2, Département D
WHERE E2.NumEmp =D.Directeur
AND E1.NumDept =D.NumDept
AND E1.DateEmbauche <E2.DateEmbauche;
5. Trouver noms des employés ayant le même directeur que Karim. Attention : un employé peut être
directeur de plusieurs départements (1pt).
SELECT NomEmp
FROM Employé
WHERE NumDept IN (SELECT D2.NumDept
FROM Employé, Département D1, Département D2
WHERE NomEmp =’Karim’
AND D1.NumDept = Employé.NumDept
AND D1.Directeur = D2.Directeur);
6. Donner les noms des employés du département COMMERCIAL embauchés le même jour
qu’un employé du département PRODUCTION. (1pt).
SELECT NomEmp
FROM Employé, Département
WHERE Employé.NumDept = Département.NumDept
AND NomDept =’COMMERCIAL’
AND DateEmbauche IN (SELECT DateEmbauche
FROM Employé, Département
WHERE Employé.NumDept = Département.NumDept
AND NomDept =’PRODUCTION’);
Page 4/5
8. Donner le nombre d’employés du département PRODUCTION. (0,5pt)
SELECT COUNT(*)
FROM Employé, Département
WHERE Employé.NumDept = Département.NumDept
AND Département.NomDept = ’PRODUCTION’;
10. Donner les noms des employés ayant le salaire maximum de chaque département. (0,5pt)
SELECT NomEmp
FROM Employé E1
WHERE Salaire >= ALL(SELECT Salaire
FROM Employé E2
WHERE E1.NumDept = E2.NumDept);
Page 5/5