Corrigé du contrôle pour les EI 99/00

INSTITUT NATIONAL DES TELECOMMUNICATIONS

 

CONTROLE DES CONNAISSANCES

 

Bloc : Bases de données Code : BD21

Durée : 1h30 Date : 22/02/2000

Documents autorisés : Coordonnateurs :

ceux distribués en cours Mme Carpentier, 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 : 5 points (Q1 = 5 pts)

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 : 3 points (Q4.1 = 1,5 pts, Q4.2 = 1,5 pts)

Question 5 : 2 points (Q5 = 2pts)

 

La région Ile de France nous demande de gérer une base de données dont le schéma est le suivant :

DEPARTEMENT(numdept, nomdept, superficie)

VILLE(numdept, nomville, nbhabitants)

SITE(nomsite, descriptif, type, prix)

LOCALISATIONSITE(nomsite, numdept, nomville)

HOTEL(numdept, nomville, nomhotel, adresse, nbétoiles)

Les clés sont soulignées et les clés étrangères sont en gras.

Question 1

En vous aidant des règles de passage d’une modélisation
Entité/association à une modélisation relationnelle "à l’envers",
proposer un schéma Entité/Association équivalent à ce schéma
relationnel. Ce schéma devra comporter la description des entités (avec
leurs propriétés), des entités faibles (s’il y a lieu), des
associations (avec leurs propriétés) ainsi que les cardinalités minimum
et maximum des associations binaires.

 

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 villes (ainsi que leur nombre d’habitants) du département de nom ‘Essonne’.

SELECT V.nomville, V.nbhabitants

FROM VILLE V, DEPARTEMENT D

WHERE V.numdept=D.numdept AND D.nomdept=’Essonne’

(Q2.2) Donner le nom et le prix des sites situés dans la ville de nom ‘Versailles’ et de numéro de département 78.

SELECT S.nomsite, S.prix

FROM SITE S, LOCALISATIONSITE L

WHERE S.nomsite=L.nomsite AND L.numdept=78 AND L.nomville=’Versailles’


Question 3

Exprimer les 3 questions suivantes en SQL :

(Q3.1) Donner le nombre de sites d’accès gratuit du département de numéro 92.

SELECT COUNT(*)

FROM SITE S, LOCALISATIONSITE L

WHERE S.nomsite=L.nomsite AND L.numdept=92 AND S.prix=0

(Q3.2) Donner pour chaque département (numéro et nom) le nombre d’hôtels 2 étoiles qui le compose.

SELECT D.numdept, D.nomdept, COUNT(*)

FROM DEPARTEMENT D, HOTEL H

WHERE D.numdept=H.numdept AND H.nbétoiles=2

GROUP BY D.numdept, D.nomdept

Bien penser à grouper par nomdept bien que cela ne
soit pas nécessaire au niveau du groupement, mais cela permet de
pouvoir le sélectionner.

(Q3.3) Donner le numéro du département qui possède le plus grand nombre de sites.

SELECT numdept

FROM LOCALISATIONSITE

GROUP BY numdept

HAVING COUNT(*) = (SELECT MAX(COUNT(*))

FROM LOCALISATIONSITE GROUP BY numdept)

Autre écriture possible :

SELECT numdept

FROM LOCALISATIONSITE

GROUP BY numdept

HAVING COUNT(*) >= ALL (SELECT COUNT(*)

FROM LOCALISATIONSITE GROUP BY numdept)

Question 4

Exprimer les 2 questions suivantes en algèbre relationnelle ou en SQL :

(Q4.1) Donner les villes (nom et nombre d’habitants) qui ne possèdent aucun hôtel.

SELECT nomville, nbhabitants

FROM VILLE

MINUS

SELECT V.nomville, V.nbhabitants

FROM VILLE V, HOTEL H

WHERE V.nomville=H.nomville AND V.numdept=H.numdep

On fait la différence entre les villes et les villes
qui possèdent un hôtel. Ici faire attention à bien se ramener au même
schéma entre les deux requêtes (nomville et nbhabitants pour les deux).

(Q4.2) Donner les départements (numéro et nom) qui possèdent au moins un site de chaque type.

SELECT D.numdept, D.nomdept

FROM DEPARTEMENT D, LOCALISATIONSITE L, SITE S

WHERE D.numdept=L.numdept AND L.nomsite=S.nomsite

GROUP BY D.numdept, D.nomdept

HAVING COUNT(DISTINCT S.type)=(SELECT COUNT(DISTINCT type) FROM SITE)

Il faut penser à utiliser le DISTINCT pour ne pas compter plusieurs fois le même type de site.

Pour la division il faut d’une part calculer le
diviseur (tous les types de sites) et d’autre part le dénominateur (les
triplets numdept, nomdept et type de site). Le résultat est l’ensemble
des couples (numdept et nomdept) qui sont associés à tous les types de
site.


Question 5

Voici les erreurs dans le formulaire.

<html>

<body>

<h1>Insertion dans site</h1><p>

<form name=’f1’ action=’http://mica/~oracle/cgi-bin/mowi_sql.cgi’method=’GET’>

<input type =’hidden’ name=’login’ value=’conc5/conc@MICA’>

Première erreur, le nom de la variable doit être uid et non pas login

<input type=’hidden’ name=’sqlstatement’ value=’’>

<input type=’hidden’ name=’table’ value=’SITES’>

Deuxième erreur le nom de la relation est SITE et non pas SITES.

Troisième erreur, il manque la déclaration de la variable de nom mode avec comme valeur INS.

<input type=’button’ value=’inserer’ onClick=’for1.submit() ;’>

Quatrième erreur, le formulaire s’appelle f1 et on soumet un formulaire de nom for1.

</form>

</body>

</html>