Requêtes SQL sur la base de données INSCRIP 1/4 Université de Montréal, EBSI SCI6306 – Bases de données documentaires Automne 2016 BASE DE DONNÉES INSCRIP REQUÊTES SQL * TRAVAIL INDIVIDUEL * Objectif : Date de remise : Pondération : Notes : Le but de ce travail est de vous pratiquer à traduire des besoins en requête SQL et viceversa ainsi qu’à manipuler les données des tables par le truchement de requêtes SQL. 21 octobre 2016, 13h 25% Jusqu'à 10% de la note peut être retranché pour la qualité du français. Vous devez respecter le format du gabarit fourni pour le journal de bord Contexte Le travail se divise en deux parties. La première partie vous fera travailler sur des requêtes pour extraire des informations de la base de données INSCRIP. Dans la deuxième partie, vous travaillerez avec des requêtes pour manipuler le contenu d’une table de données. Partie A – Requêtes SELECT [74 points] Vous aurez 8 besoins d’information sur la base de données INSCRIP à traduire en requêtes SQL. Les besoins sont classés par niveau de difficulté (le niveau 1 étant le plus facile) et suivent la progression de la matière présentée en classe. De plus, vous aurez une requête SQL à examiner pour découvrir le besoin auquel elle répond. Vous pouvez travailler directement dans phpMyAdmin (http://www.gin-ebsi.umontreal.ca/phpmyadmin) en important dans votre compte individuel la base de données INSCRIP que vous retrouverez sur le site du cours (fichier inscrip.sql). Vous pouvez aussi travailler en utilisant l’espace de pratique libre de l’environnement KeSQiL fait? (http://dufour.ebsi.umontreal.ca/mooc_bd/pratique_libre.php), mais vous devrez, à un certain moment, passer par phpMyAdmin pour pouvoir y enregistrer vos requêtes. Vous enregistrerez dans phpMyAdmin les requêtes correspondant à chacun des 8 besoins énoncés ainsi que préparerez un journal de bord où se retrouveront les informations suivantes pour chacun des besoins : • Résumé du besoin • Décomposition du besoin o Information(s) à afficher dans la table des résultats o Table(s) à utiliser pour la requête principale o Jointure(s) à faire pour la requête principale sous la forme « jointure entre la table x et la table y sur la base du champ z » (s’il y a lieu) o Condition(s) à valider pour la requête principale (s’il y a lieu) o Regroupement pour la requête principale (s’il y a lieu) o Tri pour la requête principale (s’il y a lieu) o Informations complémentaires (s’il y a lieu; par ex., le détail d’une sous-requête) • Requête SQL • Nom de la requête sauvegardée dans phpMyAdmin (forme : nom_partiea_n1_req1; ne sauvegardez pas vos requêtes comme des signets visibles aux autres utilisateurs) • Résultats obtenus (copie d’écran si vous travaillez dans phpMyAdmin, ou copier-coller du tableau des résultats si vous travaillez dans KeSQiL fait?) • Commentaires pour justifier ou expliquer certains choix (s’il y a lieu) SCI6306 (Automne 2016) Professeure : Christine Dufour Copyright © 2016 Christine DUFOUR Requêtes SQL sur la base de données INSCRIP 2/4 Il est fortement conseillé, pour chaque besoin, de commencer par remplir le journal de bord avant de débuter la construction de la requête SQL. La décomposition d’un besoin en ses différentes parties en amont permet souvent d’éviter de multiples itérations lorsque l’on écrit une requête SQL, comme elle contribue à mieux le comprendre selon la logique SQL. Vous retrouverez sur le site du cours un gabarit pour le journal de bord (fichier sci6306_travail_requetes_SQL_gabarit_journaldebord.doc). Pour les éléments qui ne s’appliquent pas à une requête, indiquez simplement « ne s’applique pas » ou « N/A ». Assurez-vous, dans les résultats affichés : • De toujours inclure les clés primaires des objets représentés. Par exemple, si on demande une liste d’étudiants, en sus d’y indiquer le nom de l’étudiant, il faut inclure le numéro d’étudiant. • De penser à inclure les champs pertinents par rapport au besoin énoncé. Par exemple, si on demande la liste des étudiants ayant obtenu plus de 80% dans un cours spécifique, il faut inclure dans les résultats, la note obtenue. • D’éliminer les répétitions. Par exemple, si on demande la liste des étudiants, il ne faut pas y retrouver deux fois le même étudiant. • De choisir un ordre de tri logique. • De faciliter la lecture des tables de résultats. Finalement, toutes les requêtes doivent respecter le principe d’indépendance c’est-à-dire qu’elles doivent retourner la bonne réponse peu importe les données que l’on retrouve dans les tables. Requêtes de niveau 1 8 points par besoin (4 points pour la décomposition du besoin et 4 points pour la requête SQL); total = 24 points 1. Liste des étudiants qui portent le même nom (prénom et nom de famille) qu’un professeur 2. Utilisation des salles de classe par jour de la semaine (en ordre chronologique) c’est-à-dire, avoir, pour chaque jour de la semaine, la liste des salles occupées (une ligne par salle) 3. Horaire des étudiants en ordre chronologique c’est-à-dire, avoir, pour chaque étudiant, la liste des cours auxquels il est inscrit en ordre croissant de jour et d’heure Requêtes de niveau 2 8 points par besoin (4 points pour la décomposition du besoin et 4 points pour la requête SQL); total = 24 points 1. Moyenne des notes par programme 2. Conflits d’horaire dans les inscriptions (c’est-à-dire identification des étudiants inscrits à deux cours se donnant dans la même plage horaire) 3. Bottin du collège avec le nom des personnes, leur numéro d’identification, leur statut (professeur ou étudiant), ainsi que le nombre de cours donnés ou suivis (selon le statut) Requêtes de niveau 3 8 points par besoin (4 points pour la décomposition du besoin et 4 points pour la requête SQL); total = 16 points 1. Liste des étudiants n’ayant pas de cours le mardi 2. Statistiques sur les salles de classe; pour chaque salle : nombre de cours optionnels qui s’y donnent, nombre de cours obligatoires qui s’y donnent, nombre d'étudiants qui l’occupent, nombre de professeurs qui y enseignent SCI6306 (Automne 2016) Professeure : Christine Dufour Copyright © 2016 Christine DUFOUR Requêtes SQL sur la base de données INSCRIP 3/4 Compréhension d’une requête SQL 10 points (5 points pour la décomposition du besoin et 5 points pour l’explication du besoin) Expliquez en vos mots le besoin qui se cache derrière la requête SQL suivante : (SELECT etud.no_etud, etud.nom, IFNULL((SELECT COUNT(*)*3 FROM etud AS etud2, suit, cours WHERE etud.no_etud=etud2.no_etud AND etud2.no_etud=suit.no_etud AND suit.no_cours=cours.no_cours AND cours.statut = 'obligatoire' GROUP BY etud2.no_etud),0) AS 'Cours obligatoire', IFNULL((SELECT COUNT(*)*3 FROM etud AS etud2, suit, cours WHERE etud.no_etud=etud2.no_etud AND etud2.no_etud=suit.no_etud AND suit.no_cours=cours.no_cours AND cours.statut = 'optionnel' GROUP BY etud2.no_etud),0) AS 'Cours optionnel', IFNULL((SELECT COUNT(*)*3 FROM etud AS etud2, suit, cours WHERE etud.no_etud=etud2.no_etud AND etud2.no_etud=suit.no_etud AND suit.no_cours=cours.no_cours GROUP BY etud2.no_etud),0) AS 'Total' FROM etud) UNION (SELECT '', 'TOTAL', COUNT(*)*3, (SELECT COUNT(*)*3 FROM cours, suit WHERE cours.no_cours=suit.no_cours AND cours.statut='optionnel'), (SELECT COUNT(*)*3 FROM cours, suit WHERE cours.no_cours=suit.no_cours) FROM cours, suit WHERE cours.no_cours=suit.no_cours AND cours.statut='obligatoire') Vous réutiliserez le même tableau que précédemment pour vous aider à décortiquer la requête et en comprendre le besoin sous-jacent. Faites suivre ce tableau de votre explication du besoin. Partie B – Requêtes INSERT INTO, UPDATE et DELETE [26 points] 1 Dans un premier temps, vous construirez dans la partie B des requêtes SQL qui vous permettront d’insérer de nouveaux enregistrements, d’en modifier ainsi que d’en supprimer. Par la suite, vous aurez trois requêtes SQL à examiner pour découvrir la tâche sous-jacente et, s’il y a lieu, à critiquer. Vous enregistrerez dans phpMyAdmin les requêtes correspondant à chacune des tâches demandées. Dans votre journal de bord, consignez les informations suivantes : • Besoin • Décomposition du besoin o Table(s) impliquée(s) o Condition(s) à valider (s’il y a lieu) o Informations complémentaires (s’il y a lieu; par exemple, l’information à ajouter ou à modfier) • Requête SQL • Nom de la requête sauvegardée dans phpMyAdmin (forme : nom_partieb_req1; ne sauvegardez pas vos requêtes comme des signets visibles aux autres utilisateurs) • Message retourné par phpMyAdmin après l’exécution de la requête (copie d’écran) • Commentaires pour justifier ou expliquer certains choix (s’il y a lieu) 1 Vous ne pourrez ici que travailler dans phpMyAdmin, dans votre compte individuel. L’espace de pratique libre de l’environnement KeSQiL fait? ne permet en effet que les requêtes SELECT. SCI6306 (Automne 2016) Professeure : Christine Dufour Copyright © 2016 Christine DUFOUR Requêtes SQL sur la base de données INSCRIP 4/4 Requêtes SQL total = 14 points (pour chaque requête, la moitié des points est accordée à la décomposition du besoin et l’autre moitié à la requête SQL) 1. Vous devez mettre à jour INSCRIP pour vous y ajouter comme professeur ainsi que vous associer à un nouveau cours (remarque : deux requêtes seront nécessaires). (6 points) 2. Vous devez mettre à jour la base de données pour refléter le fait, qu’en raison de rénovations, le professeur Simard s’installera temporairement dans le bureau du professeur Turmel. (4 points) 3. Il s’avère que l’étudiant Isaac Asimov n’a jamais été inscrit au cours Philosophie 813. Une erreur de saisie, fort probablement, que vous devez corriger en effaçant cette inscription. (4 points) Compréhension d’une requête SQL 4 points par requête (2 points pour la décomposition du besoin et 2 points pour l’explication du besoin et la critique de la requête (s’il y a lieu); total = 12 points) Expliquez en vos mots le besoin qui se cache derrière les requêtes SQL suivantes. De plus, examinez les requêtes et faites-en ressortir les faiblesses (s’il y en a) en proposant des solutions. Requête 1 INSERT INTO SUIT (no_etud, no_cours, note, note_p) SELECT no_etud, (select no_cours from cours where titre like 'Chimie 110'), 0, 0 FROM etud WHERE nom like 'Wagner, Richard'; Requête 2 UPDATE SUIT SET NOTE = NOTE-10 WHERE no_cours=20005 AND note_p=1; Requête 3 DELETE FROM COURS WHERE (jour = 1 AND heure = '9:00') OR (jour = 5 AND heure = '13:00'); Vous réutiliserez le même tableau que précédemment pour vous aider à décortiquer la requête et en comprendre le besoin sous-jacent. Faites suivre ce tableau de votre explication du besoin ainsi que, s’il y a lieu, des améliorations à apporter à la requête. À remettre sur StudiUM • Le journal de bord, nommé sci6306_tprequetes_prenom_nom_journaldebord, en format Word ou RTF ainsi qu’en format PDF Assurez-vous d’avoir bien sauvegardé vos requêtes sur phpMyAdmin, comme demandé. Une copie des requêtes sera sauvegardée en local le 21 octobre à 13h (date limite de remise). Les modifications que vous pourriez apporter par la suite à ces requêtes ne seront pas prises en considération dans la correction. SCI6306 (Automne 2016) Professeure : Christine Dufour Copyright © 2016 Christine DUFOUR