Auto-évaluation SQL workshop

Documents pareils
Auto-évaluation SQL. Document: f0453test.fm 19/04/2012. ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Le langage SQL Rappels

Auto-évaluation Oracle: cours de base

SQL Historique

Langage SQL : créer et interroger une base

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Cours SQL. Base du langage SQL et des bases de données

Présentation Windows Azure Hadoop Big Data - BI

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

ISC Système d Information Architecture et Administration d un SGBD Compléments SQL

Optimisation SQL. Quelques règles de bases

Bases de données cours 4 Construction de requêtes en SQL. Catalin Dima

TP base de données SQLite. 1 Différents choix possibles et choix de SQLite : 2 Définir une base de donnée avec SQLite Manager

1. LA GESTION DES BASES DE DONNEES RELATIONNELLES

14/04/2014. un ensemble d'informations sur un sujet : exhaustif, non redondant, structuré, persistant. Gaëlle PERRIN SID2 Grenoble.

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

COMMANDES SQL... 2 COMMANDES DE DEFINITION DE DONNEES... 2

Cours 4 : Agrégats et GROUP BY

Les bases de données

Introduction aux Bases de Données 2004/2005

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

1 Introduction et installation

Cours: Les Jointures 1

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Manuel Viadeis CRM Connecteur intégration L100 étendue.

Plan Général Prévisionnel (1/2) (non contractuel) Internet et Outils L1/IO S2-IO2 Bases de données: Jointures, Transactions

SQL. Oracle. pour. 4 e édition. Christian Soutou Avec la participation d Olivier Teste

Devoir Data WareHouse

MODE OPERATOIRE OPENOFFICE BASE

COMPRENDRE LES DIFFERENTS TYPES DE CONNEXION LORS DE LA

TP Bases de données réparties

Sage 100 CRM - Guide de la Fusion Avancée Version 8. Mise à jour : 2015 version 8

SQL Serveur Programme de formation. France Belgique Suisse - Canada. Formez vos salariés pour optimiser la productivité de votre entreprise

Systèmes de Gestion de Bases de Données

Magasins et entrepôts de données (Datamart, data warehouse) Approche relationnelle pour l'analyse des données en ligne (ROLAP)

Bases de données élémentaires Maude Manouvrier

Mysql avec EasyPhp. 1 er mars 2006

Réplication E-maj Foreign Data Wrapper PostGIS PostgreSQL-f

Présentation du PL/SQL

Corrigés détaillés des exercices

FileMaker 13. Guide de référence SQL

SQL sous SqlServer OLIVIER D. DEHECQ Olivier 0

TD : Requêtes SQL (BDR.TD2-1) INSA 3IF

1. SAS FEDERATION SERVER - POINT D'ACCES UNIQUE ET SECURISE AUX DONNEES DE L'ENTREPRISE

Performance web. Mesurer. Analyser. Optimiser. Benjamin Lampérier - Benoît Goyheneche. RMLL Beauvais. 8 Juillet 2015

Comment Créer une Base de Données Ab Initio

Le Langage SQL version Oracle

BTS/CGO P10 SYSTEME INFORMATION Année

TD n 10 : Ma première Base de Données

PHP. PHP et bases de données

La problématique de la Préservation des Bases de Données. Olivier ROUCHON CINES Groupe PIN Jeudi 7 Octobre

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

MS SQL Express 2005 Sauvegarde des données

Le Langage De Description De Données(LDD)

Administration des bases de données. Jean-Yves Antoine

Notes de cours : bases de données distribuées et repliquées

Olivier Mondet

Session S12 Les bases de l optimisation SQL avec DB2 for i

PHP 5. La base de données MySql. A. Belaïd 1

Bases de données avancées

Auto-évaluation Aperçu de l architecture Java EE

Plan. Bases de Données. Sources des transparents. Bases de SQL. L3 Info. Chapitre 4 : SQL LDD Le langage de manipulation de données : LMD

«Un tableau de bord médical en temps- réel à moindre coût»

Introduction au Système de Gestion de Base de Données et aux Base de Données

INTRODUCTION : Données structurées et accès simplifié

Cours 3. Développement d une application BD. DBA - Maîtrise ASR - Université Evry

Bases de données Outils de gestion

Création de Sous-Formulaires

Bases de Données relationnelles et leurs systèmes de Gestion

Comment Connecter une Base de Données MySQL via un Driver JDBC Avec OpenOffice.org

Bases de Données. Le cas des BD relationnelles ouverture sur les BD relationnelles spatiales Séance 2 : Mise en oeuvre

Support de Cours REQUÊTES TRANSACT-SQL DANS MICROSOFT SQL SERVER Stéphane N GUESSAN Groupe Pigier Abidjan Version 1.

FORMATION A L UTILISATION DE PMB QUELQUES NOTIONS DE SQL

INTRODUCTION AU DATA MINING

Master Exploration Informatique des données DataWareHouse

Les bases fondamentales du langage Transact SQL

SQL pour. Oracle 10g. Razvan Bizoï. Tsoft, Groupe Eyrolles, 2006, ISBN : , ISBN 13 :

Cours Bases de données 2ème année IUT

TP2_1 DE BUSINESS INTELLIGENCE ISIMA ZZ3 F3

PRODUCTS LIST (updated 11th January 2010)

Laboratoires de bases de données. Laboratoire n 6. Programmation SQL. par Danièle BAYERS et Louis SWINNEN

La rencontre du Big Data et du Cloud

Master I Génie Logiciel

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Configurer la supervision pour une base MS SQL Server Viadéis Services

1 Modélisation d une base de données pour une société de bourse

16H Cours / 18H TD / 20H TP

Comment Accéder à des Bases de Données MySQL avec Windows lorqu'elles sont sur un Serveur Linux

Bases de données relationnelles

Bases de Données Avancées

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Bases de SQL. Hacks 1-6 CHAPITRE UN

Guide d'installation rapide TFM-560X YO.13

Transcription:

Auto-évaluation SQL workshop Document: f0087test.fm 05/02/2016 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING

INTRODUCTION AUTO-ÉVALUATION SQL WORKSHOP Indications Ce test a pour objectif de vous permettre d évaluer vos connaissances en matière de SQL. Vous serez alors en mesure de décider, en connaissance de cause, s il vous est utile de participer au cours SQL workshop ou si vous pouvez vous inscrire directement pour le cours SQL pour utilisateurs avancés. Ce test comporte 15 questions, pour la plupart à choix multiples. Pour quelques questions, plusieurs réponses correctes sont possibles: ceci sera bien indiqué. Cochez les solutions qui vous semblent bonnes. Après avoir répondu à toutes les questions, vous pourrez comparer vos réponses avec celles que vous trouverez dans la partie Evaluation. Ce test vous prendra à peu près une demie heure. Remarques: La syntaxe SQL à utiliser est celle du ANSI/ISO SQL:2003, supportée par tous les systèmes modernes (DB2, Oracle, MySQL, SQLServer, PostgreSQL,...) Ce test est destiné aux personnes qui ont déjà de bonnes connaissances en SQL. Si ce n est pas votre cas, il serait sans doute préférable que vous essayiez d abord le test lié au cours SQL et RDBMS: cours de base. Informations sur les tables et les colonnes. Les questions qui suivront font référence aux tables suivantes: COURSES: contient la liste des différents cours (matières) donnés. SESSIONS: décrit tous les cours donnés à une certaine date et place. PERSONS: toutes les personnes, qu elles soient formateurs, participants ou autres. ENROLMENTS: contient l information sur les inscriptions aux sessions. Relations entre les tables: COURSES - SESSIONS - indique la matière donnée lors d une session particulière. - COURSES.CID = SESSIONS.S_CID SESSIONS - ENROLMENTS - indique pour quelle session une inscription a-t-elle été enregistrée. - SESSIONS.SNO = ENROLMENTS.E_SNO PERSONS - SESSIONS - indique le formateur (numéro de personne) pour une session particulière. - PERSONS.PNO = SESSIONS.SINS_PNO PERSONS - ENROLMENTS - indique le participant (numéro de personne) pour une inscription. - PERSONS.PNO = ENROLMENTS.E_PNO 05/02/2016 Auto-évaluation SQL workshop 2

Contenu des tables et descriptions des colonnes La table COURSES CID CTITLE CDUR 7890 DB2 5 7910 Unix 4 8500 Oracle 5 8000 SQLServer 5 9000 SQL workshop 3 - CID: obligatoire, alphanumérique: numéro du cours (clé primaire). - CTITLE: obligatoire, alphanumérique: titre du cours. - CDUR: obligatoire, numérique: durée du cours (numéro de jours). La table SESSIONS (8 lignes) SNO S_CID SDATE SINS_PNO SCANCEL 10 7890 2015-12-02 3 (NULL) 11 7910 2015-11-04 1 (NULL) 12 7890 2016-01-08 3 C 13 7890 2016-02-02 3 (NULL) 14 8000 2016-04-05 2 C 15 7910 2016-01-08 36 C 16 8500 2016-04-05 36 (NULL) 17 9000 2016-06-07 36 (NULL) - SNO: obligatoire, numérique: numéro de session (clé primaire). - S_CID: optionnel, alphanumérique: numéro du cours donné lors d une session particulière (clé étrangère faisant référence à la table COURSES). - SDATE: optionnel: date de début d une session particulière. - SINS_PNO: obligatoire, numérique: personne qui est désignée comme formateur pour une session particulière (clé étrangère vers la table PERSONS). - SCANCEL: optionnel, alphanumérique: indique si une session est annulée ou pas ( C signifie que la session est annulée, vide (NULL) signifie pas annulée). 05/02/2016 Auto-évaluation SQL workshop 3

La table PERSONS - PNO: obligatoire, numérique: numéro de personne (clé primaire) - PNAME: optionnel, alphanumérique: nom de la personne - P_CONO: optionnel, numérique: société pour laquelle une personne travaille. La table ENROLMENTS: PNO PNAME P_CONO 1 SMITHS 3 2 TAVERNIER 3 3 DE KEYSER 3 4 HEBBELYNCK 5 5 VAN DE BROECK 5 6 VAN HEIJKOOP 10 7 DE WINDT 2 8 SPENSER 10 9 BENOIT 1 10 BENOIT 1 11 LOOSE (NULL) 13 PARKER 6 15 DEHEM 7 17 PIELAGE 4 18 GELADE 2 33 BUENK 9 36 ADAMSON 8 45 MOORS 4 50 MAK (NULL) E_SNO E_PNO ECANCEL 10 4 (NULL) 10 7 C 11 45 (NULL) 11 13 (NULL) 12 4 (NULL) 13 15 C 13 36 (NULL) 14 3 (NULL) 14 18 C 14 1 (NULL) 15 4 (NULL) 15 7 (NULL) 16 3 (NULL) 16 18 (NULL) - E_SNO: obligatoire, numérique: session pour laquelle une inscription est enregistrée (clé étrangère vers SESSIONS) (partie de la clé primaire, avec E_PNO). - E_PNO: obligatoire, numérique: personne inscrite (clé étrangère vers PERSONS). - ECANCEL: optionnel, alphanumérique: indique si une inscription est annulée ou pas ( C signifie que l inscription est annulée, NULL signifie non annulée). 05/02/2016 Auto-évaluation SQL workshop 4

QUESTIONS AUTO-ÉVALUATION SQL WORKSHOP 1. Lesquelles des requêtes suivantes produisent exactement 1 ligne de résultat? [2 réponses.] [_] [a] [_] [b] [_] [c] [_] [d] [_] [e] [_] [f] SELECT COUNT(*) WHERE PNO > 100 Un group by implicite produit toujours exactement une ligne de résultats, même avec une nullité (donc fausse condition). SELECT PNO, COUNT(*) WHERE PNO = 2 Erreur de syntaxe ( PNO n est pas syntactiquement unique dans une groupe implicite) donc aucune ligne de résultat. Produit 19 lignes. Produit 3 lignes identiques. SELECT COUNT(*) GROUP BY PNO INNER JOIN SESSIONS ON PNO = SINS_PNO WHERE PNO = 36 LEFT OUTER JOIN ENROLMENTS ON PNO = E_PNO WHERE PNO = 2 GROUP BY PNAME Même pour les non étudiants (PNO=2), PNAME est affiché par le LEFT OUTER JOIN; Le group by garantit qu il n aura pas de doublons. SELECT SUM(CDUR) FROM COURSES, SESSIONS, ENROLMENTS WHERE CID = S_CID AND SNO = E_SNO GROUP BY CID Une ligne sera produite par cours, contenant le nombre total de jour de cours. 2. Combien de lignes seront produites par la requête suivante? 8 SELECT E_SNO FROM ENROLMENTS UNION SELECT SNO WHERE SNO BETWEEN 15 AND 17 Réponse:... 7 valeurs uniques de la première requête, et additionnellement la valeur 17 de la deuxième requête. UNION enlèves doublures, même s ils viennent tous de la première requête. 05/02/2016 Auto-évaluation SQL workshop 5

3. Quelles requêtes génèrent le résultat suivant? [3 bonnes réponses.] [_] [a] [_] [b] [_] [c] [_] [d] SELECT PNO, PNAME, 'ENROLLEE OR INSTRUCTOR' INNER JOIN SESSIONS ON PNO = SINS_PNO INNER JOIN ENROLMENTS ON PNO = E_PNO ORDER BY 3, 1 Dans ce cas ENROLLEE OR INSTRUCTOR ira dans la colonne 3. SELECT PNO, PNAME, CASE PNO WHEN E_PNO THEN 'ENROLLEE' ELSE 'INSTRUCTOR' END INNER JOIN SESSIONS ON PNO = SINS_PNO INNER JOIN ENROLMENTS ON PNO = E_PNO ORDER BY 3, 1 Cette requête donne les instructeurs qui sont inscrits à leur propre session. SELECT PNO, PNAME, 'INSTRUCTOR' WHERE PNO IN (SELECT SINS_PNO ) UNION ALL SELECT PNO, PNAME, 'ENROLLEE' INNER JOIN ENROLMENTS ON PNO = E_PNO ORDER BY 3, 1 La première requête donne en effet les 4 premières lignes, mais la seconde produits des doublons. SELECT DISTINCT PNO, PNAME, 'INSTRUCTOR' INNER JOIN SESSIONS ON PNO = SINS_PNO UNION ALL SELECT PNO, PNAME, 'ENROLLEE' WHERE PNO IN (SELECT E_PNO FROM ENROLMENTS) ORDER BY 3, 1 DISTINCT supprime les doublons de la première requête la seconde ne produit pas des doublons. PNO PNAME 1 SMITHS ENROLLEE 3 DE KEYSER ENROLLEE 4 HEBBELYNCK ENROLLEE 7 DE WINDT ENROLLEE 13 PARKER ENROLLEE 15 DEHEM ENROLLEE 18 GELADE ENROLLEE 36 ADAMSON ENROLLEE 45 MOORS ENROLLEE 1 SMITHS INSTRUCTOR 2 TAVERNIER INSTRUCTOR 3 DE KEYSER INSTRUCTOR 36 ADAMSON INSTRUCTOR 05/02/2016 Auto-évaluation SQL workshop 6

[_] [e] SELECT PNO, PNAME, 'INSTRUCTOR' INNER JOIN SESSIONS ON PNO = SINS_PNO UNION SELECT PNO, PNAME, 'ENROLLEE' WHERE PNO IN (SELECT E_PNO FROM ENROLMENTS) ORDER BY 3, 1 Les doublons de la première requête sont supprimés par l utilisation du UNION au lieu du UNION ALL. [_] [f] SELECT DISTINCT PNO, PNAME, 'INSTRUCTOR' INNER JOIN SESSIONS ON PNO = SINS_PNO UNION SELECT PNO, PNAME, 'ENROLLEE' P WHERE EXISTS (SELECT E_PNO FROM ENROLMENTS WHERE E_PNO = P.PNO) ORDER BY 3, 1 La sous requête corrélée produit tous les inscrits. 4. Combien de lignes seront produites par la requête suivante? 19 Réponse:... Le nombre de PERSONS (car left outer join ). 5. Quelle requête fournit les informations demandées par la question suivante? [2 réponses.] Donnez le numéro des sessions pour lesquelles aucune inscription n a été annulée. [_] [a] SELECT DISTINCT SNO, ENROLMENTS WHERE SNO = E_SNO AND ECANCEL IS NULL Cela donne les sessions où il y a au moins 1 inscription non annulée. [_] [b] SELECT DISTINCT SNO, ENROLMENTS WHERE SNO = E_SNO AND ECANCEL IS NOT NULL [_] [c] Cela donne les sessions où il y a au moins 1 inscription annulée; donc le complément de ce qui est demandé. anti-join WITH E AS (SELECT E_SNO FROM ENROLMENTS WHERE ECANCEL IS NOT NULL) SELECT SNO LEFT OUTER JOIN E ON SNO = E_SNO WHERE E_SNO IS NULL 05/02/2016 Auto-évaluation SQL workshop 7

[_] [d] SELECT SNO WHERE SNO IN (SELECT E_SNO FROM ENROLMENTS WHERE ECANCEL IS NULL) Cela donne les sessions où il y a au moins 1 inscription non annulée. [_] [e] SELECT SNO EXCEPT -- ou MINUS en Oracle SELECT E_SNO FROM ENROLMENTS WHERE ECANCEL IS NOT NULL [_] [f] SELECT SNO S WHERE NOT EXISTS (SELECT 1 FROM ENROLMENTS WHERE E_SNO = S.SNO AND ECANCEL IS NOT NULL) [_] [g] SELECT SNO INNER JOIN ENROLMENTS ON SNO = E_SNO WHERE ECANCEL IS NULL Cela donne les sessions où il y a au moins 1 inscription non annulée. [_] [h] SELECT SNO INNER JOIN ENROLMENTS ON SNO = E_SNO WHERE ECANCEL IS NOT NULL Cela donne les sessions où il y a au moins 1 inscription non annulée; donc le complément de ce qui est demandé. 6. Quelles requêtes génèrent le résultat suivant ( tous les participants )? [3 bonnes réponses.] [_] [a] [_] [b] WHERE PNO IN (SELECT E_PNO AS PNO FROM ENROLMENTS) INNER JOIN ENROLMENTS ON PNO = E_PNO La table de résultats contiendra des doublons. PNAME SMITHS DE KEYSER HEBBELYNCK VAN HEIJKOOP DE WINDT PARKER DEHEM GELADE MOORS 05/02/2016 Auto-évaluation SQL workshop 8

[_] [c] WHERE PNO = ANY (SELECT E_PNO FROM ENROLMENTS) [_] [d] WHERE EXISTS (SELECT E_PNO FROM ENROLMENTS) Ce n est pas une sous requête corrélée; cette requête montrera toute les personnes. [_] [e] FROM (SELECT E_PNO FROM ENROLMENTS WHERE E_PNO IS NOT NULL) E INNER JOIN PERSONS ON PNO = E.E_PNO La table de résultats contiendra des doublons. [_] [f] LEFT OUTER JOIN ENROLMENTS ON PNO = E_PNO GROUP BY PNAME La table de résultats contiendra tout le monde même des non inscrits. [_] [g] RIGHT OUTER JOIN ENROLMENTS ON PNO = E_PNO GROUP BY PNAME Par l utilisation de group by, on évite les doublons; le right join est effectivement un inner join, car e_pno est une clé étrangère sans NULLs. 7. Quelle question correspond le mieux à la requête suivante? SELECT P_CONO, COUNT(*) P WHERE EXISTS (SELECT SNO WHERE SINS_PNO = P.PNO) GROUP BY P_CONO O (a) Donnez par formateur, le nombre de sessions qu il a données. Donnez également l entreprise pour laquelle il travaille. Le calcul survient dans la table PERSONS et ne peut donc pas compter le nombre de sessions. O (b) Donnez par entreprise, le nombre de personnes qui ont déjà suivi au moins un cours. La condition dans la sous requête parle à propos des instructeurs, pas des étudiant. O (c) Donnez le nombre de sessions par cours, ainsi que l entreprise où le formateur travaille. Dans ce cas, la table COURSES ou bien la colonne s_cid au minimum doit être consultée. O (d) Donnez le nombre de formateurs par entreprise. 8. Indiquez les requêtes qui donnent le même résultat que la requête suivante. [2 réponses.] [_] [a] WHERE PNO = ( SELECT MAX(PNO) ) Cela donne le nom de la personne avec la plus grande valeur PNO. WHERE PNO >= ANY (SELECT PNO ) Cela donne tout le monde car la condition est toujours vraie. 05/02/2016 Auto-évaluation SQL workshop 9

[_] [b] WHERE PNO >= ALL (SELECT PNO ) La condition est uniquement vraie pour la plus grande valeur de PNO. [_] [c] P1 WHERE EXISTS (SELECT MAX(PNO) P2 WHERE P1.PNO = P2.PNO) La condition est toujours vraie.la requête corrélée génère toujours 1 ligne pour max(pno) = p1.pno. [_] [d], MAX(PNO) GROUP BY PNAME Tous les groupes consistent d une ligne, donc cette requête génère toutes les personnes (avec leur propre PNO). [_] [e] SELECT P1.PNAME P1 LEFT OUTER JOIN PERSONS P2 ON P1.PNO < P2.PNO GROUP BY P1.PNO, P1.PNAME HAVING COUNT(P2.PNO) = 0 Cette jointure à elle même génère des groupes plus larges si une personne a un petit PNO. Seul la personne avec le plus grand PNO a un groupe vide. Un INNER JOIN ne contiendra pas ce groupe, d où le LEFT OUTER JOIN. 9. Quelles requêtes fournissent les informations pour la question suivante? [3 bonnes réponses.] [_] [a] Donnez la liste de tous les cours, y compris ceux pour lesquels aucune session n a été organisée. Donnez également les sessions ainsi que la date de début. SELECT CID, SNO, SDATE FROM COURSES INNER JOIN SESSIONS ON CID = S_CID Cela donne seulement une liste de cours planifiés. [_] [b] SELECT S_CID, SNO, SDATE Cela donne seulement une liste de cours planifiés. [_] [c] SELECT CID, SNO, SDATE FROM COURSES LEFT OUTER JOIN SESSIONS ON CID = S_CID Le left outer join garantit le listing de tous les cours même les non planifiés. [_] [d] SELECT CID, SNO, SDATE FROM COURSES RIGHT OUTER JOIN SESSIONS ON CID = S_CID Le right outer join garantit le listing de toute les sessions, pas de tous les cours. 05/02/2016 Auto-évaluation SQL workshop 10

[_] [e] WITH S AS (SELECT SNO, S_CID, SDATE WHERE S_CID IS NOT NULL) SELECT CID, SNO, SDATE FROM COURSES INNER JOIN S ON CID = S_CID UNION ALL SELECT CID, 0, CAST(NULL AS DATE) FROM COURSES WHERE CID NOT IN (SELECT S_CID FROM S) La première requête donne tous les cours planifiés, la seconde tous les cours qui ne le sont pas. (La condition supplémentaire IS NOT NULL est nécessaire depuis que la colonne S_CID peut contenir NULLs: la condition NOT IN sera perpétuellement fausse si la liste générée dans la sous requête contient un NULL. [_] [f] SELECT C.CID, S.SNO, S.SDATE FROM (SELECT CID FROM COURSES) C LEFT OUTER JOIN (SELECT SNO, S_CID, SDATE ) S ON S_CID = CID La première requête donne tous les cours planifiés, la seconde tous les cours qui ne le sont pas. [_] [g] SELECT CID, SNO, SDATE FROM COURSES INNER JOIN SESSIONS ON CID = S_CID UNION ALL SELECT S_CID, SNO, SDATE WHERE S_CID IS NULL La première requête donne tous les cours planifiés mais la seconde donne rien car S_CID n est jamais NULL dans le contenu actuel de la table. 10. Quelle requête fournit les informations demandées par la question suivante? Donnez le nom des instructeurs qui ont en même temps déjà suivi plus d un cours. O (a) WHERE PNO IN (SELECT E_PNO FROM ENROLMENTS INNER JOIN SESSIONS ON E_SNO = SNO WHERE E_PNO = SINS_PNO AND ECANCEL IS NULL AND SCANCEL IS NULL GROUP BY E_PNO HAVING COUNT(*) > 1) La sous requête donne les instructeurs qui sont inscrits à leur propres sessions. 05/02/2016 Auto-évaluation SQL workshop 11

O (b) WHERE PNO IN (SELECT SINS_PNO WHERE SCANCEL IS NULL AND SNO IN (SELECT E_SNO FROM ENROLMENTS WHERE ECANCEL IS NULL GROUP BY E_PNO HAVING COUNT(*) > 1)) Faute de syntaxe dans la requête la plus ancrée: E_SNO n est pas garantit constant dans un groupe. Le groupement sur E_SNO au lieu de E_PNO va lister tous les profs des sessions qui ont plus d une inscription non annulée. O (c) INNER JOIN (SELECT E_PNO FROM ENROLMENTS WHERE ECANCEL IS NULL AND E_SNO IN (SELECT SNO WHERE SCANCEL IS NULL) GROUP BY E_PNO HAVING COUNT(*) > 1) E ON E_PNO = PNO WHERE PNO IN (SELECT SINS_PNO ) Grouper sur PNAME est moins correcte, dans le cas d un prof avec le même nom. O (d) INNER JOIN ENROLMENTS ON PNO = E_PNO INNER JOIN SESSIONS S1 ON E_SNO = S1.SNO INNER JOIN SESSIONS S2 ON PNO = S1.SINS_PNO WHERE S1.SCANCEL IS NULL AND ECANCEL IS NULL GROUP BY E_PNO, PNAME HAVING COUNT(*) > 1 Les profs donnant plus d un cours mais n ayant suivis qu un cours eux même, ne seront pas listés. O (e) WITH P AS (SELECT PNO, PNAME ), E AS (SELECT E_PNO, E_SNO FROM ENROLMENTS WHERE ECANCEL IS NULL), S AS (SELECT SNO, SINS_PNO WHERE SCANCEL IS NULL) FROM P INNER JOIN E ON PNO = E_PNO INNER JOIN S S1 ON E_SNO = S1.SNO INNER JOIN S S2 ON PNO = S2.SINS_PNO GROUP BY E_PNO, PNAME HAVING COUNT(*) > 1 Les profs donnant plus d un cours mais n ayant suivis qu un cours eux même, ne seront pas listés. 11. Qu est-ce qu on peut dire de la requête suivante? SELECT SNO, PNAME, SDATE, PERSONS WHERE SINS_PNO = PNO UNION SELECT E_PNO, PNAME, ENROLMENTS WHERE PNO = E_PNO ORDER BY 1 O (a) La requête ne peut pas être exécutée (donne une erreur syntaxique). Les deux requêtes ne produisent pas le même nombre de colonnes. 05/02/2016 Auto-évaluation SQL workshop 12

O (b) La requête est exécutable et sensée (selon les définitions des colonnes). O (c) La requête est exécutable mais insensée. 12. Qu est-ce qu on peut dire de la requête suivante? SELECT SNO, SDATE, PNAME FROM SESSIONS INNER JOIN ENROLMENTS ON SNO = E_SNO INNER JOIN PERSONS ON P_CONO = E_PNO WHERE ECANCEL IS NULL AND SCANCEL IS NULL O (a) La requête ne peut pas être exécutée (donne une erreur syntaxique). O (b) La requête est exécutable et sensée (selon les définitions des colonnes). O (c) La requête est exécutable mais insensée. P_CONO et E_PNO n ont pas la même interprétation même si c est syntaxiquement correcte. 13. Qu est-ce qu on peut dire de la requête suivante? SELECT SNO, SDATE, S_CID S WHERE SCANCEL IS NOT NULL AND SDATE >= ALL (SELECT SDATE WHERE S_CID = S.S_CID) O (a) La requête ne peut pas être exécutée (donne une erreur syntaxique). O (b) La requête est exécutable et sensée (selon les définitions des colonnes). La requête donne la dernière session (avec date et numéro de cours) de chaque cours. O (c) La requête est exécutable mais insensée. 14. Qu est-ce qu on peut dire de la requête suivante?, COUNT(*) INNER JOIN SESSIONS ON SINS_PNO = PNO O (a) La requête ne peut pas être exécutée (donne une erreur syntaxique). Il y a un implicite GROUP BY dans lequel PNAME n est pas garanti. O (b) La requête est exécutable et sensée (selon les définitions des colonnes). O (c) La requête est exécutable mais insensée. 15. Qu est-ce qu on peut dire de la requête suivante? SELECT (SELECT COUNT(*) AS nr_8000 WHERE S_CID = '8000') * 100.0 / COUNT(S_CID) AS percent_8000 O (a) La requête ne peut pas être exécutée (donne une erreur syntaxique). O (b) La requête est exécutable et sensée (selon les définitions des colonnes). La sous-requête génère un nombre seul et peut donc être utilisé comme une sous requête scalaire. La requête entière produit aussi un nombre et précisément le pourcentage de sessions pour le cours 8000 en relation avec le total de sessions organisés. Remarque importante: quelques plate-forme, en particulier Oracle et DB2 LUW, incorrectement signalent un erreur de syntaxe ( S_CID utilisé sans GROUP BY ); ceci est un bug de ces plate-formes: l SQL standard doit accepter cette requête. DB2 z/os, SQL Server, MySQL et PostgreSQL le font correctement. O (c) La requête est exécutable mais insensée. 05/02/2016 Auto-évaluation SQL workshop 13

EVALUATION. Ici sont les réponses correctes: 1. a e 2. 8 3. d e f 4. 19 5. c e f 6. a c g 7. d 8. b e 9. c e f 10. c 11. a 12. c 13. b 14. a 15. b Comptez 1 point par bonne réponse. Pour les questions avec plusieurs bonnes réponses, comptez 1 point seulement si vous avez coché toutes les bonnes alternatives. Si votre score atteint 80% ou plus, vous êtes prêt pour notre cours SQL pour utilisateurs avancés. Si votre score se situe entre 50% et 80%, le cours SQL workshop vous permettra de compléter vos connaissances en SQL. Si votre score est inférieur à 50%, il vous est vivement conseillé de suivre le cours SQL workshop car vous y apprendrez certainement beaucoup. N oubliez cependant pas de vérifier si vous disposez des connaissances préalables suffisantes pour suivre efficacement ce cours; conaissances traîtées dans SQL et RDBMS: cours de base et son teste d auto-évaluation. 05/02/2016 Auto-évaluation SQL workshop 14