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)