SQL - Sélectionner des données#

Schéma relationnel

Sélectionner des données#

L'instruction SELECT ... FROM ... permet de rechercher des données dans une table. On fait suivre le mot-clef SELECT du nom de(s) colonne(s) que l'on souhaite afficher, et le FROM de la table contenant ces données. Ainsi, la requête suivante nous permet d'afficher tous les titres et auteurs de notre table Livre.

SELECT titre, auteur FROM Livre

Et celle-ci affiche le nom et le prénom de tous les utilisateurs de la bibliothèque.

SELECT nom, prenom FROM Utilisateur

Si on souhaite ne pas avoir de lignes "doublons" dans les résultats, on peut faire suivre SELECT du mot-clef DISTINCT afin de les retirer du résultat de la recherche et n'avoir ainsi que des lignes uniques.

SELECT DISTINCT auteur FROM Livre

On peut également utiliser SELECT * pour sélectionner toutes les colonnes d'un seul coup.

SELECT * FROM Livre

Trier les données#

Les requêtes SELECT peuvent être suivies des mots-clef ORDER BY afin de trier les résultats par ordre croissant/ascendant (ASC) ou décroissant/descendant (DESC). Pour cela, il faut faire suivre le ORDER BY de la colonne selon laquelle trier les données, ainsi que de ASC ou DESC pour donner l'ordre de tri. La requête suivant permet ainsi d'afficher tous les livres du plus cher au moins cher.

SELECT titre, prix FROM Livre
ORDER BY prix DESC

Filtrer les données#

Les résultats obtenus à l'aide d'une requête SELECT ... FROM ... peuvent être filtrés en faisant suivre cette requête d'un WHERE. Ce mot-clef est suivi d'une condition qui s'écrit de manière similaire à Python en utilisant les opérateurs de comparaisons =, !=, >, >=, <, <=. La requête suivante permet par exemple de sélectionner toutes les lignes où le prix est inférieur ou égal à 10CHF.

SELECT * FROM Livre WHERE prix <= 10

Celle ci-dessous permet de sélectionner les titres de livre écrit par J.K. Rowling.

SELECT titre FROM Livre WHERE auteur = 'J.K. Rowling'

Opérateurs logiques#

Comme en Python, il est possible de chaîner plusieurs conditions avec les opérateurs logiques AND et OR. La requête suivante permet d'afficher tous les livres écrits par Alexandre Dumas ou par Gustave Flaubert.

SELECT titre FROM Livre WHERE auteur = 'Alexandre Dumas' OR Auteur = 'Gustave Flaubert'

La requête suivante permet d'afficher les titres des livres écrits par J.K. Rowling après 2003.

SELECT titre FROM Livre WHERE auteur = 'J.K. Rowling' AND date_pub > '2003-12-31'

Important

Une date s'écrit entre guillemets simples et se compare comme du texte, caractère par caractère. Il faut donc toujours donner une date complète au format 'AAAA-MM-JJ'. Écrire date_pub > 2003 (sans guillemets et sans mois ni jour) ne produit aucune erreur, mais donne un résultat faux : SQL compare alors un nombre à du texte et retourne tous les livres.

Opérateur LIKE#

Le mot-clef LIKE peut s'utiliser comme un opérateur de comparaison sur du texte, de manière similaire à un =. Il permet de vérifier qu'une colonne soit semblable à une valeur que l'on définit. Ces similitudes peuvent se décliner de trois manières

  • La valeur commence par un certain texte. Par exemple, pour trouver tous les prénoms d'utilisateur qui commencent par "M" ou pour trouver tous les livres dont le titre commence par "Harry". Pour cela, il faut ajouter le signe % (qui peut être compris par "n'importe quel texte") après la valeur commençant le mot.

    SELECT * FROM Livre WHERE titre LIKE 'Harry%'
    
  • La valeur se termine par un certain texte. Par exemple pour trouver tous les livres dont la date de publication se termine par "2". Cette fois, le signe % doit précéder la valeur terminant le mot.

    SELECT * FROM Livre WHERE date_pub LIKE '%2'
    
  • La valeur contient un certain texte. Par exemple pour trouver tous les livres dont le titre contient "le". Le signe % doit ici entourer la valeur à contenir.

    SELECT * FROM Livre WHERE titre LIKE '%le%'
    

Exercices#

Exercice 15#

Voici la table canton, qui servira de base aux deux prochains exercices.

Avant d'exécuter les requêtes ci-dessous, lisez-les attentivement et prédisez leur résultat. La requête est-elle correcte ou produira-t-elle une erreur ? Si elle est correcte, combien de lignes affichera-t-elle ? Indiquez ce nombre dans la case à droite (ou le mot erreur si la requête ne fonctionne pas), puis exécutez la requête pour vérifier.

  1. select * from canton where nb_communes = 45;
    
  2. select * from canton where chef_lieu = Coire;
    
  3. select nom, superficie from canton where nom = 'Fribourg';
    
  4. select * from canton where population > 500000;
    
  5. select * from canton where abr < 'GR';
    
  6. select * from canton order by superficie asc;
    
  7. select * from canton where nom like 'F';
    
  8. select * from canton where chef_lieu = 'coire';
    
  9. select nom, superficie from canton order by nb_communes desc;
    
  10. select * from canton
      where nb_communes > 100 and population > 300000 and superficie < 3000;
    
  11. select nom from canton where nom = 'Fribourg' and nom = 'Genève';
    

Exercice 16#

En vous basant sur la table canton ci-dessus, écrivez les requêtes SQL répondant aux critères suivants.

  1. Écrire une requête SQL qui retourne toutes les colonnes du canton dont le chef-lieu est Bellinzone.


  1. Écrire une requête SQL qui retourne toutes les colonnes des cantons dont la population est inférieure à 300'000 habitants.


  1. Écrire une requête SQL qui retourne toutes les colonnes des cantons dans l'ordre alphabétique des abréviations.


  1. Écrire une requête SQL qui retourne le nom, l'abréviation et le chef-lieu des cantons.


  1. Écrire une requête SQL qui retourne le nom, l'abréviation et le chef-lieu des cantons ordonnés selon le nombre d'habitants du plus grand au plus petit.


  1. Écrire une requête SQL qui retourne toutes les colonnes des cantons qui ont plus de 100 communes et une population inférieure à 500'000 habitants.


  1. Écrire une requête SQL qui retourne toutes les colonnes des cantons dont le chef-lieu est Altdorf ou le nombre de communes supérieur ou égal à 150.


  1. Écrire une requête SQL qui retourne le nom des cantons dont l'abréviation n'est pas FR.


  1. Écrire une requête SQL qui retourne le nom et l'abréviation des cantons dont la population se trouve entre 300'000 et 500'000 habitants.


Exercice 17#

Chacune des requêtes ci-dessous, écrite sur la base de données de la bibliothèque, comporte une erreur. Parfois l'erreur produit un message rouge, parfois la requête s'exécute mais ne retourne pas ce qui était demandé. Corrigez-les.

  1. On souhaite afficher le titre des livres coûtant moins de 10 CHF.

    SELECT titre WHERE prix < 10
    
  2. On souhaite afficher tous les livres de Victor Hugo.

    SELECT * FROM Livre WHERE auteur = Victor Hugo
    
  3. On souhaite afficher tous les livres du plus cher au moins cher.

    SELECT * FROM Livre ORDER prix BY DESC
    
  4. On souhaite afficher tous les livres de la saga Harry Potter.

    SELECT * FROM Livre WHERE titre LIKE 'Harry'
    
  5. On souhaite afficher les livres qui coûtent moins de 10 CHF ou plus de 20 CHF.

    SELECT * FROM Livre WHERE prix < 10 AND prix > 20
    

Exercice 18#

Les exercices suivants utilisent la table jeu ci-dessous, qui recense quelques jeux vidéo.

Pour commencer, où faut-il placer le signe % ? On cherche ici des auteurs dans une table Livre.

  1. Le nom de l'auteur commence par Zola

  2. Le nom de l'auteur se termine par Zola

  3. Le nom de l'auteur contient Zola

Écrivez maintenant les requêtes suivantes sur la table jeu. Toutes nécessitent un LIKE.

  1. Afficher tous les jeux dont le titre commence par Super.


  1. Afficher tous les jeux dont le titre contient Mario.


  1. Afficher le titre et le studio des jeux dont le nom du studio se termine par o et qui coûtent plus de 50 CHF.


  1. Afficher les jeux dont le genre se termine par ure et dont la note dépasse 9.2.


  1. Afficher les jeux dont le titre contient la lettre a, qui coûtent moins de 20 CHF et dont la note est supérieure ou égale à 8.8.


Exercice 19#

Toujours sur la table jeu, écrivez les requêtes suivantes. Elles nécessitent toutes un DISTINCT, un ORDER BY, ou les deux.

  1. Afficher la liste des genres présents dans la table, sans doublon.


  1. Afficher la liste des studios, sans doublon, par ordre alphabétique.


  1. Afficher les années de sortie, sans doublon, de la plus récente à la plus ancienne.


  1. Afficher le titre et la note des jeux d'aventure ou de plateforme, du mieux noté au moins bien noté.


  1. Afficher le titre et le prix des jeux qui coûtent moins de 20 CHF, sont sortis après 2014 et ont une note supérieure à 8.5, du moins cher au plus cher.


Exercice 20#

Cet exercice fonctionne dans l'autre sens : les requêtes sont données, à vous de dire ce qu'elles font. Répondez en une phrase, en français, sans les exécuter. Elles portent sur la base de données de la bibliothèque.

  1. SELECT DISTINCT auteur FROM Livre ORDER BY auteur ASC

  2. SELECT titre, prix FROM Livre WHERE prix > 15 OR auteur = 'Victor Hugo'

  3. SELECT nom FROM Utilisateur WHERE role != 'élève'

  4. SELECT * FROM Livre WHERE titre LIKE '%Potter%' AND prix < 10 AND date_pub > '2000-01-01'

  5. SELECT titre, date_pub FROM Livre WHERE date_pub < '1900-01-01' ORDER BY date_pub ASC