SQL : Chapitre 9
Operations sur les sous ensembles
Learning by Doing.
Le monde du SQL.
Chapitre 9.
-> Comparez les requêtes suivantes. Que pouvez-vous en conclure ?
SELECT * FROM student
WHERE unv_name='PSB'
UNION
SELECT * FROM student
WHERE std_nationality='French';
SELECT * FROM student
WHERE unv_name='PSB'
UNION ALL
SELECT * FROM student
WHERE std_nationality='French';
Notez que l'opérateur UNION enlève les doublons par défaut. UNION ALL permet de garder les doublons dans le résultat.
-> Comparez les requêtes suivantes. Pourquoi la première requête fonctionne et la deuxième ne fonctionnent pas ? Notez l’erreur qui s’affiche. Que pouvez-vous en conclure ?
SELECT std_name, std_surname FROM student
UNION
SELECT unv_name, unv_country FROM university
SELECT * FROM student
UNION
SELECT * FROM university
La première requête fonctionne même si elle n’a pas beaucoup de sens, car il y a le même nombre de colonnes dans les résultats de 2 SELECT ce qui permet de les réunir. La deuxième requête doit produire l'erreur suivante, car le nombre de colonnes dans les résultats de deux SELECT est différent.
#1222 - The used SELECT statements have a different number of columns
1 Les visites guidées
-> Afficher les utilisateurs qui ne sont pas guides ?
SELECT *
FROM utilisateur u
WHERE u.usr_email NOT IN (SELECT t.tour_guide FROM tour t)
-> Afficher les tours qui n’ont reçu aucun commentaire ou note ?
SELECT *
FROM tour t
WHERE t.tour_id NOT IN (SELECT c.tour_id FROM commentaire c);
-> Nous souhaitons connaitre des utilisateurs qui ont plus incline à promouvoir notre plateforme. Si l’utilisateurs a laissé une note supérieure à 3, on le considère comme « Promoteur ». Si l’utilisateurs a laissé une note inferieur à 4, on le considère comme « Détracteur ». Les autres utilisateurs sont considérés « Neutre ». Proposez une requête qui permet de connaitre cette information.
SELECT c.usr_email, "Promoteur" FROM commentaire c WHERE c.cmt_note>3
UNION
SELECT c2.usr_email, "Détracteur" FROM commentaire c2 WHERE c2.cmt_note<4
UNION
SELECT u.usr_email, "Neutre" FROM utilisateur u WHERE u.usr_email NOT IN (SELECT c3.usr_email FROM commentaire c3)
-> Affichez les guides qui sont aussi des touristes : les guide qui ont déjà effectué une réservation ou laissé un commentaire dans le passé.
SELECT DISTINCT t.tour_guide
FROM tour t
WHERE t.tour_guide IN (SELECT c.usr_email FROM commentaire c)
OR t.tour_guide IN (SELECT b.usr_customer FROM booking b);
-> Afficher les tours qui n’ont jamais au de réservations ?
SELECT *
FROM tour t
WHERE t.tour_id NOT IN (SELECT b.tour_id FROM booking b)