Cours SQL et MySQL · Module 2: Interroger les données (SELECT)
DISTINCT - uniquement les valeurs uniques
Dans cette leçon5
Le marchand de Rhodes demande : « De quels pays viennent vos auteurs ? ». La réponse se trouve dans le champ kraj du rayon autorzy. Mais quand tu demandes un seul champ à un rayon, la même valeur se répète souvent - beaucoup d'auteurs viennent du même pays, beaucoup de lecteurs de la même ville. Le marchand veut une liste de pays, pas une liste d'auteurs. DISTINCT supprime les doublons.
Sans DISTINCT - avec répétitions
Commençons par une requête ordinaire sur un seul champ. La Bibliothèque donne le pays de chaque auteur, ligne par ligne :
1SELECT kraj FROM autorzy;Huit auteurs, huit lignes :
| kraj |
|---|
| Grecja |
| Grecja |
| Grecja |
| Grecja |
| Grecja |
| Polska |
| Polska |
| USA |
Cinq auteurs viennent de Grèce, donc le mot Grecja apparaît cinq fois. Une telle liste n'apprend rien au marchand.
Avec DISTINCT - sans répétitions
Ajoutons maintenant un mot juste après SELECT. Le reste de la requête ne change pas :
1SELECT DISTINCT kraj FROM autorzy;Chaque pays n'apparaît plus qu'une seule fois :
| kraj |
|---|
| Grecja |
| Polska |
| USA |
Sur huit lignes, il en reste trois. C'est comme la liste des sections dans les Pinakes - chaque sujet nommé une seule fois. Le rayon contient toujours huit auteurs : DISTINCT ne supprime rien de la table, il tamise seulement la réponse.
DISTINCT et plusieurs colonnes
Quand tu donnes plusieurs champs, DISTINCT compare toute la ligne du résultat, et non des valeurs isolées. Regarde d'abord les prénoms et noms des lecteurs sans DISTINCT :
1SELECT imie, nazwisko FROM czytelnicy;Deux lectrices différentes portent le même prénom et le même nom : Anna Nowak de Cracovie et Anna Nowak de Gdańsk. Il y a aussi Jan Nowak. Voici le début du résultat :
| imie | nazwisko |
|---|---|
| Anna | Nowak |
| Jan | Kowalski |
| Anna | Nowak |
| Piotr | Wiśniewski |
| Ewa | Zielińska |
| Jan | Nowak |
| … | … |
Maintenant, la même requête avec DISTINCT :
1SELECT DISTINCT imie, nazwisko FROM czytelnicy;La seconde « Anna Nowak » a disparu, car elle a le même prénom et le même nom que la première ligne :
| imie | nazwisko |
|---|---|
| Anna | Nowak |
| Jan | Kowalski |
| Piotr | Wiśniewski |
| Ewa | Zielińska |
| Jan | Nowak |
| … | … |
Remarque trois choses. De deux lignes identiques, il en reste une - elles ne disparaissent pas toutes les deux. Jan Nowak reste, bien qu'il porte le même nom qu'Anna, car son prénom est différent : une ligne disparaît seulement quand le prénom et le nom réunis se répètent dans une autre ligne. Et DISTINCT ne voit que les champs de la liste - nous n'avons pas choisi la ville, donc deux Anna différentes se sont fondues en une seule ligne. Sur seize lignes, il en reste quinze.
Où se place DISTINCT ?
On écrit DISTINCT une seule fois, juste après SELECT, et il s'applique à tous les champs de la liste. Écrire SELECT imie, DISTINCT nazwisko FROM czytelnicy; est une erreur de syntaxe - on ne peut pas tamiser une colonne et laisser l'autre intacte.
Utilisations courantes
- De quelles villes viennent les lecteurs ? →
SELECT DISTINCT miasto FROM czytelnicy; - Quels pays d'origine avons-nous pour les auteurs ? →
SELECT DISTINCT kraj FROM autorzy;
Mon conseil : quand une demande dit « quels sont… », « de quels… » ou « sans répétitions », pense à DISTINCT. Souviens-toi aussi que DISTINCT ne trie pas. Les pays sont sortis par ordre alphabétique uniquement parce qu'ils sont rangés ainsi sur le rayon. Dans la leçon « Tout ensemble », tu ajouteras un tri à DISTINCT pour en être sûr.
DISTINCT est le tamis du scribe - il filtre les parchemins et ne garde que les fiches de catalogue uniques.
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. À quoi sert le mot-clé DISTINCT dans une requête SELECT ?
2. Que supprime DISTINCT quand on lui donne plusieurs colonnes, par exemple « SELECT DISTINCT imie, nazwisko FROM czytelnicy; » ?
Tâches pratiques dans le jeu
- Éditeur de code
Écris une requête qui récupère les valeurs uniques de la colonne miasto de la table czytelnicy (sans répétitions).
- Tri horizontal
Ordonne les éléments dans le bon ordre pour construire une requête sur les pays uniques des auteurs (de gauche à droite) :
- Éditeur de code
Écris une requête qui récupère les valeurs uniques de la colonne kraj de la table autorzy (sans répétitions).