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