INSTITUT NATIONAL DES TELECOMMUNICATIONS
CONTROLE DES CONNAISSANCES
Bloc : Bases de données Code : BD21
Durée : 1h30 Date : 10/03/99
Documents autorisés : Coordonnateur :
ceux distribués en cours Mr Defude
____________________________________________________
Avertissements
1/ Lisez attentivement le sujet.
2/ Les questions sont indépendantes les unes des autres
3/ Essayez d’être clair et précis dans vos réponses.
4/ Soignez la présentation, dans la mesure du possible.
5/ Barême indicatif
Question 1 : 6 points (Q1.1 = 5 pts, Q1.2 = 1 pt)
Question 2 : 4 points (Q2.1 = 2 pts, Q2.2 = 2 pts)
Question 3 : 6 points (Q3.1 = 2 pts, Q3.2 = 2 pts, Q3.3 = 2 pts)
Question 4 : 4 points (Q4.1 = 2 pts, Q4.2 = 2 pts)
MESSAGE(nomsg, sujet, date, corps, adremetteur)
DESTINATAIRE(nomsg, adrdestinataire)
REPONSE(nomsgrep, nomsginit)
LOCUTEUR(adremail, nom, type)
COMPOSITION(adremailgroupe, adremailpers)
Les clés sont soulignées et les clés étrangères sont en gras. Schéma Entité-Association
1.2. Contraintes d’intégrité
Question 2
Exprimer chacune des 2 questions suivantes, d’une part en algèbre relationnelle sous la forme d’un arbre algébrique, et d’autre part en SQL.
(Q2.1) Donner le nom des locuteurs qui ont envoyé un message au locuteur d’adresse email ‘liste-ig2.int-evry.fr’.
SELECT DISTINCT L.nom
FROM LOCUTEUR L, MESSAGE M, DESTINATAIRE D
WHERE M.nomsg=D.nomsg AND L.adremail=M.adremetteur
AND D.adrdestinataire=‘liste-ig2.int-evry.fr’
Remarque : le DISTINCT évite les doublons puique L.nom n’est pas une clé. La réponse obtenue ne donne pas forcément que des locuteurs de type personne. Par contre s’il s’agit d’un locuteur de type groupe, on donne juste son nom et pas le nom des locuteurs de type personne qui le compose.
(Q2.2) Donner l’adresse email et le nom des locuteurs qui composent le groupe d’adresse email ‘liste-adm.int-evry.fr’.
SELECT L.adremail, L.nom
FROM COMPOSITION C, LOCUTEUR L
WHERE C.adrmailpers=L.adremail AND
C.adremailgroupe=‘liste-adm.int-evry.fr’
Question 3 Exprimer les 3 questions suivantes en SQL : (Q3.1) Donner le nombre de messages reçus par le locuteur d’adresse email ‘defude@int-evry.fr’.SELECT COUNT(*)
FROM DESTINATAIRE
WHERE adrdestinataire=‘defude@int-evry.fr’
(Q3.2) Donner pour chaque groupe (adresse email et nom) le nombre de personnes qui le compose.SELECT L.adremail, L.nom, COUNT(*)
FROM COMPOSITION C, LOCUTEUR L
WHERE C.adremailgroupe=L.adremail
GROUP BY L.adremail, L.nom
Attention : les attributs du SELECT doivent tous apparaitre dans le GROUP BY. (Q3.3) Donner l’adresse email de la personne qui appartient au plus grand nombre de groupes.SELECT adremailpers
FROM COMPOSITION
GROUP BY adremailpers
HAVING COUNT(*) =
(SELECT MAX(COUNT(*)) FROM COMPOSITION GROUP BY adremailpers)
Remarque : autre écriture possible pour le HAVING :
HAVING COUNT(*) >= ALL (SELECT COUNT(*) FROM COMPOSITION GROUP BY adremailpers)
Question 4 Exprimer les 2 questions suivantes en algèbre relationnelle ou en SQL :(Q4.1) Donner les messages (nomsg et sujet) qui n’ont fait l’objet d’aucune réponse.
SELECT nomsg, sujet
FROM MESSAGE
MINUS
SELECT M.nomsg, M.sujet
FROM MESSAGE M, REPONSE R
WHERE M.nomsg=R.nomsginit
Attention : on utilise un opérateur ensembliste donc il faut que les schémas produits par les deux requêtes SQL soient compatibles (notamment qu’ils aient même nombre d’attributs!). (Q4.2) Donner les locuteurs (adremail et nom) qui appartiennent à tous les groupes.
SELECT L.adremail, L.nom
FROM LOCUTEUR L, COMPOSITION C
WHERE L.adremail=C.adremailpers
GROUP BY L.adremail, L.nom
HAVING COUNT(*) = (SELECT COUNT(*) FROM LOCUTEUR WHERE type=’G’)
Remarque : on peut calculer le nombre de groupes d’une autre manière :SELECT COUNT(DISTINCT adremailgroupe) FROM COMPOSITION
Solution avec les NOT EXISTS :
SELECT L.adremail, L.nom
FROM LOCUTEUR L
WHERE NOT EXISTS
(SELECT * FROM LOCUTEUR L1
WHERE type=’G’ AND NOT EXISTS
(SELECT * FROM COMPOSITION C
WHERE C.adremailgroupe=L1.adremail
AND C.adremailpers=L.adremail)