1 A lire attentivement! 2 Le sujet 3 Code source `a compléter

Transcription

1 A lire attentivement! 2 Le sujet 3 Code source `a compléter
Corrigé
3I - SQL - Examen
Documents et calculatrices interdits.
Nom :
Prénom :
1
A lire attentivement !
Vous devez compléter un code source à instructions manquantes. Le
sujet a été conçu de sorte qu’il n’existe à chaque fois qu’une (ou presque)
solution. Soyez très attentifs et méticuleux, chaque détail est important.
Toutes les instructions manquantes sont signalées par un -- n où n est
un numéro vous permettant d’être sûr de ne pas en oublier.
2
Le sujet
Nous souhaitons gérer un forum avec une base de données. Cette base
liste des internautes et leur permet de créer des forums (chaque forum
est rattaché à l’internaute qui l’a crée). Chaque internaute peut s’inscrire
sur autant de forums qu’il le souhaite et écrire des messages sur tous les
forums où il est inscrit.
Cette base comporte 4 tables. Le script de création de tables figure
sur la dernière page, il vous est conseillé de la détacher. Vous avez quatorze requêtes à compléter, les commentaires (précédés par des --) vous
indiquent comment remplir les instructions manquantes.
3
Code source à compléter
14 requêtes,
3
points/requête, 15 instructions manquantes.
2
−− Noms de s forums s an s dou b l on dans l ’ o r d r e a l p h a b é t i q u e .
SELECT DISTINCT nomForum
FROM FORUM
ORDER BY nomForum ;
−− L og i n s de s i n t e r n a u t e s n ’ ay an t pas de password .
SELECT Login
FROM INTERNAUTE
WHERE password IS NULL;
−− Login du c r e a t e u r du forum ’ P a s t i s ’ .
SELECT l o g i n
FROM INTERNAUTE I , FORUM F
WHERE I . numInt = F . numCreateur
AND nomForum = ’ P a s t i s ’ ;
−− Noms de s forums s u r l e s q u e l s
’ Marcel ’ a e c r i t .
SELECT nomForum
FROM INTERNAUTE I , FORUM F , MESSAGE M
WHERE I . numInt = M. numInt
AND F . numCreateur = M. numCreateur
AND F . numForum = M. numForum
AND l o g i n = ’ Marcel ’ ;
−− Contenus de s messages p u b l i e s par ’ Gertrude ’ s u r l e forum ’ P a s t i s ’ .
SELECT contenuMessa ge
FROM INTERNAUTE I , FORUM F , MESSAGE M
WHERE I . numInt = M. numInt
AND M. numCreateur = F . numCreateur
AND M. numForum = F . numForum
AND nomForum = ’ P a s t i s ’
AND l o g i n = ’ Ger tr u d e ’ ;
−− Noms de s forums s u r l e s q u e l s
’ Gertrude ’ e t ’ Marcel ’ s o n t t o u s deux i n s c r i t s .
SELECT DISTINCT nomForum
FROM FORUM F , INSCRIPTION IM , INSCRIPTION IG , INTERNAUTE M, INTERNAUTE G
WHERE M. Login = ’ Marcel ’
AND G. Login = ’ Ger tr u d e ’
AND IM . numInt = M. numInt
AND IG . numInt = G. numInt
AND F . numCreateur = IG . numCreateur
AND F . numCreateur = IM . numCreateur
AND F . numForum = IG . numForum
AND F . numForum = IM . numForum ;
−− L og i n s de s i n t e r n a u t e s i n s c r i t s u r un forum c r e e par ’ Marcel ’
−− ( s an s a f f i c h e r Marcel dans l e r é s u l t a t ) .
SELECT DISTINCT I . Login
FROM INSCRIPTION IM , INSCRIPTION INSC , INTERNAUTE M, INTERNAUTE I
WHERE M. Login = ’ Marcel ’
AND IM . numInt = M. numInt
AND INSC . numInt = I . numInt
AND INSC . numCreateur = IM . numCreateur
AND INSC . numForum = IM . numForum
AND M. numInt <> I . numInt ;
−− Nombre d ’ i n t e r n a u t e s i n s r i t s a aucun forum .
SELECT COUNT(DISTINCT A. numInt ) − COUNT(DISTINCT B . numInt )
FROM INTERNAUTE A, INSCRIPTION B ;
−− Nombre de messages par i n t e r n a u t e .
CREATE VIEW NB MESSAGES PAR INT AS
SELECT numInt , COUNT( ∗ ) AS NB MESSAGES
FROM MESSAGE M
GROUP BY numInt ;
−− Nombre maximal de messages p u b l i e s
SELECT MAX(NB MESSAGES)
FROM NB MESSAGES PAR INT ;
Page 2
−− L og i n s de s u t i l i s a t e u r s ay an t p u b l i e au moins deux messages .
SELECT l o g i n
FROM INTERNAUTE I , NB MESSAGES PAR INT N
WHERE I . numInt = N. numInt
AND NB MESSAGES > 1 ;
−− Login de s i n t e r n a u t e s i n s c r i t s a e x ac t e m e n t un forum .
SELECT Login
FROM INTERNAUTE I , INSCRIPTION INSC
WHERE I . numInt = INSC . numInt
GROUP BY I . numInt , Login
HAVING COUNT( ∗ ) = 1 ;
−− Pour chaque forum e t chaque i n t e r n a u t e , l e nombre de messages p u b l i e s .
CREATE VIEW NB MESSAGES PAR INT F AS
SELECT numCreateur , numForum , numInt , COUNT( ∗ ) AS NB MESSAGES
FROM MESSAGE
GROUP BY numCreateur , numForum , numInt ;
−− Noms de s forums s u r l e s q u e l s au moins deux i n t e r n a u t e s d i f f é r e n t s on t
−− p u b l i e s de s messages .
SELECT nomForum
FROM FORUM F , NB MESSAGES PAR INT F N
WHERE F . numCreateur = N. numCreateur
AND F . numForum = N. numForum
GROUP BY F . numCreateur , F . numForum , nomForum
HAVING COUNT( ∗ ) > 1 ;
4
Script de création de tables
CREATE TABLE INTERNAUTE
(
numInt NUMBER PRIMARY KEY,
l o g i n VARCHAR2( 1 6 ) ,
password VARCHAR2( 1 6 )
);
CREATE TABLE FORUM
(
numCreateur NUMBER REFERENCES INTERNAUTE ( numInt ) ,
numForum NUMBER,
nomForum VARCHAR2( 1 6 ) ,
PRIMARY KEY ( numCreateur , numForum )
);
CREATE TABLE INSCRIPTION
(
numCreateur NUMBER,
numForum NUMBER,
numInt NUMBER REFERENCES INTERNAUTE ( numInt ) ,
PRIMARY KEY ( numCreateur , numForum , numInt )
);
CREATE TABLE MESSAGE
(
numCreateur NUMBER,
numForum NUMBER,
Page 3
numInt NUMBER,
numMessage NUMBER,
contenuMessa g e CLOB, −− grande c h a i n e de c a r a c t e r e s
PRIMARY KEY ( numCreateur , numForum , numInt , numMessage ) ,
FOREIGN KEY ( numCreateur , numForum , numInt )
REFERENCES INSCRIPTION ( numCreateur , numForum , numInt )
);
INSERT INTO INTERNAUTE VALUES ( 1 , ’ Marcel ’ , ’ a z e r t y ’ ) ;
INSERT INTO INTERNAUTE VALUES ( 2 , ’ Ger tr u d e ’ , ’ aqwzsx ’ ) ;
INSERT INTO INTERNAUTE VALUES ( 3 , ’ Raymond ’ , ’ k j h e r t ’ ) ;
INSERT INTO
INSERT INTO
−− G e r t r u de
INSERT INTO
FORUM VALUES ( 1 , 1 , ’ P a s t i s ’ ) ;
FORUM VALUES ( 1 , 2 , ’ Vin r o u g e ’ ) ;
c r e e l e forum ’ whisky ’
FORUM VALUES ( 2 , 1 , ’ Whisky ’ ) ;
−− chaque c r e a t e u r de forum e s t i n s c r i t s u r son pr opr e forum
INSERT INTO INSCRIPTION VALUES ( 1 , 1 , 1 ) ;
INSERT INTO INSCRIPTION VALUES ( 1 , 2 , 1 ) ;
INSERT INTO INSCRIPTION VALUES ( 2 , 1 , 2 ) ;
−− G e r t r u de e t Raymond s ’ i n s c r i v e n t t o u s deux s u r l e forum ’ P a s t i s ’
INSERT INTO INSCRIPTION VALUES ( 1 , 1 , 2 ) ;
INSERT INTO INSCRIPTION VALUES ( 1 , 1 , 3 ) ;
INSERT INTO INSCRIPTION VALUES ( 1 , 2 , 3 ) ;
INSERT INTO MESSAGE VALUES ( 1 , 1 ,
−− Raymond repond ’ Moi a u s s i ’ s u r
INSERT INTO MESSAGE VALUES ( 1 , 1 ,
INSERT INTO MESSAGE VALUES ( 1 , 1 ,
INSERT INTO MESSAGE VALUES ( 1 , 1 ,
1,
le
3,
3,
2,
2 , ’ moi j ” aime l e p a s t i s ’ ) ;
meme forum .
1 , ’ moi a u s s i ’ ) ;
2 , ’ e t a t o u t e h eu r e . . . ’ ) ;
2 , ’ t ” as bien r a i s o n ’ ) ;
Page 4