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