2 acétates par page
Transcription
2 acétates par page
Cours 5 ‐ SQL (suite et fin) 30 septembre 2016 École de bibliothéconomie et des sciences de l’information SCI6306 – Bases de données documentaires Cours 5 SQL – partie 3 de 3 Faculté des arts et des sciences 30 septembre 2016 © Christine Dufour, 2016 30 septembre 2016 SCI6306 1 / 12 2 / 12 Au programme aujourd’hui SQL (suite et fin) Sous-requêtes Autres types de requêtes Requête Suppression Requête Mise à jour Requête Ajout Laboratoire : TP Requêtes SQL – niveau 3 + Partie B SCI6306 (A2016) / Christine Dufour (EBSI, UdeM) 1 Cours 5 ‐ SQL (suite et fin) 30 septembre 2016 30 septembre 2016 SCI6306 3 / 12 SQL Sous-requêtes [1/5] Comme une requête retourne comme résultat une table de données, elle peut donc être utilisée comme sous-requête dans une autre requête (appelée requête principale) 2 types de sous-requête Sous-requête corrélée, c’est-à-dire liée à la requête principale Son résultat peut changer à chacun des enregistrements de la requête principale Sous-requête non corrélée, c’est-à-dire indépendante de la requête principale Son résultat est le même pour tous les enregistrements de la requête principale 3 scénarios principaux (peuvent être cumulés) Sous-requête utilisée dans une condition (clause WHERE) Sous-requête utilisée pour afficher une valeur dans les résultats (dans la liste des champs affichés après SELECT) Sous-requête utilisée comme table de données (clause FROM) 30 septembre 2016 SCI6306 4 / 12 SQL Sous-requêtes [2/5] Scénario 1 : Utilisation d'une sous-requête dans une clause WHERE Liste des étudiants non inscrits à des cours SELECT no_etud, nom FROM etud WHERE no_etud NOT IN (SELECT no_etud FROM suit); Sous-requête qui retourne l’ensemble des numéros d’étudiants inscrits à des cours (sous-requête non corrélée c’est-à-dire qui s’exécute sans l’apport du reste de la requête principale (elle est autonome)) SCI6306 (A2016) / Christine Dufour (EBSI, UdeM) 2 Cours 5 ‐ SQL (suite et fin) 30 septembre 2016 30 septembre 2016 SCI6306 5 / 12 SQL Sous-requêtes [3/5] Scénario 2 : Utilisation d'une sous-requête dans la liste des champs de résultats Liste des étudiants avec nombre de cours suivis SELECT no_etud, nom, (SELECT count(*) FROM suit WHERE etud.no_etud = suit.no_etud) AS 'Nb cours suivis' FROM etud ORDER BY no_etud; Sous-requête qui compte le nombre de cours suivis pour chaque étudiant; elle retourne un seul chiffre par enregistrement (sous-requête corrélée car exploite la table ETUD présente dans la requête principale) 30 septembre 2016 SQL Sous-requêtes [4/5] équivalent sauf pour les étudiants ne suivant aucun cours SCI6306 6 / 12 Besoin : étudiants avec nombre de cours suivis SELECT no_etud, nom, (SELECT count(*) FROM suit WHERE etud.no_etud = suit.no_etud) AS 'Nb cours suivis' FROM etud Version ORDER BY no_etud; avec sous-requête SELECT etud.no_etud, nom, count(suit.no_etud) AS 'Nb cours suivis' FROM etud, suit Version WHERE etud.no_etud=suit.no_etud avec jointure GROUP BY etud.no_etud; SCI6306 (A2016) / Christine Dufour (EBSI, UdeM) 3 Cours 5 ‐ SQL (suite et fin) 30 septembre 2016 30 septembre 2016 SCI6306 7 / 12 SQL Sous-requêtes [5/5] Scénario 3 : Utilisation d'une sous-requête comme table de données Liste des étudiants suivant des cours sans local SELECT etud.no_etud, nom FROM (SELECT cours.no_cours FROM cours WHERE isnull(local)) as sanslocal, etud, suit WHERE etud.no_etud=suit.no_etud AND suit.no_cours=sanslocal.no_cours; Sous-requête qui fait la liste des cours sans locaux (sous-requête non corrélée c’est-à-dire qui s’exécute sans l’apport du reste de la requête principale (elle est autonome)) 30 septembre 2016 SCI6306 8 / 12 SQL Exercice : Que fait cette requête? SELECT aux.no_etud, nom, COUNT(no_prof), (SELECT count(*) FROM suit WHERE aux.no_etud=suit.no_etud AND suit.no_cours IN (SELECT no_cours FROM cours WHERE no_prof is null)) FROM (SELECT DISTINCT suit.no_etud, etud.nom, cours.no_prof FROM cours, suit, etud WHERE etud.no_etud=suit.no_etud AND suit.no_cours=cours.no_cours) AS aux GROUP BY aux.no_etud; SCI6306 (A2016) / Christine Dufour (EBSI, UdeM) 4 Cours 5 ‐ SQL (suite et fin) 30 septembre 2016 30 septembre 2016 SCI6306 9 / 12 SQL Exercice : Que fait cette requête? SELECT aux.no_etud, nom, COUNT(no_prof), (SELECT count(*) FROM suit WHERE aux.no_etud=suit.no_etud AND suit.no_cours IN (SELECT no_cours FROM cours WHERE no_prof is null)) FROM (SELECT DISTINCT suit.no_etud, etud.nom, cours.no_prof FROM cours, suit, etud WHERE etud.no_etud=suit.no_etud AND suit.no_cours=cours.no_cours) AS aux GROUP BY aux.no_etud; Affichage : Source : Jointure : Conditions : Groupement : Tri : 30 septembre 2016 SCI6306 10 / 12 SQL Requête Ajout Forme générique INSERT INTO nom de la table (nom(s) de champ) obligatoire VALUES (valeur(s)); Exemple : insertion d’un nouvel étudiant (numéro + nom + programme) INSERT INTO etud (no_etud, nom, prog) VALUES ('10009', 'Bauer, Jack', 'Musique'); SCI6306 (A2016) / Christine Dufour (EBSI, UdeM) 5 Cours 5 ‐ SQL (suite et fin) 30 septembre 2016 30 septembre 2016 SCI6306 11 / 12 SQL Requête Mise à jour Forme générique UPDATE nom de la table SET valeur(s) WHERE critère(s); facultatif obligatoire Exemple : changement de programme de M. Bauer pour la littérature UPDATE etud SET etud.prog = 'Littérature' WHERE nom = 'Bauer, Jack'; 30 septembre 2016 SCI6306 12 / 12 SQL Requête Suppression Forme générique DELETE FROM nom de la table WHERE critère(s); obligatoire Exemple : Abandon des études de M. Bauer qui a été recruté par la Delta Force DELETE FROM etud WHERE no_etud='10009'; SCI6306 (A2016) / Christine Dufour (EBSI, UdeM) 6