CodeGym /Cours /SQL SELF /Extraction des valeurs uniques avec DISTINCT

Extraction des valeurs uniques avec DISTINCT

SQL SELF
Niveau 6 , Leçon 1
Disponible

Parfois, les bases de données, c'est un peu comme un pote qui a la mémoire courte : il note tout, mais oublie ce qu'il a déjà noté. Résultat, tu ouvres une table avec les villes des clients, et là tu vois dix "Berlin", cinq "Seattle" et plein d'autres doublons. Ça arrive quand plusieurs clients viennent de la même ville. Mais bon, tu veux pas faire une campagne de pub pour dix "Berlin" alors que c'est juste une seule ville, non ?

Pour choper uniquement les valeurs uniques — sans doublons — il y a la commande DISTINCT. C'est un peu comme une baguette magique : d'un coup, elle vire toutes les lignes en double et te laisse que ce qui est vraiment différent.

DISTINCT te permet de sortir uniquement les lignes uniques du résultat de ta requête. C'est super utile quand tu veux te débarrasser des données qui se répètent, genre :

  • Les produits uniques dans les commandes.
  • Les prénoms de clients uniques.
  • Les combinaisons uniques de données, genre "ville + pays".

Comment marche DISTINCT ?

La syntaxe de DISTINCT est simple et claire, comme souvent avec SQL :

SELECT DISTINCT colonne1, colonne2, ...
FROM table;

Quand tu ajoutes DISTINCT dans ta requête, la base de données te garantit que chaque ligne du résultat sera unique.

Exemples d'utilisation de DISTINCT

On commence avec des exemples classiques pour piger comment DISTINCT fonctionne.

Exemple 1 : Valeurs uniques d'une seule colonne

Imaginons qu'on a une table students avec des infos sur les étudiants :

-- Table students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

On veut savoir de quelles villes viennent les étudiants. On écrit la requête

SELECT city
FROM students;

et voilà le résultat :

city
Seattle
Toronto
Seattle
Chicago
Seattle

C'est pas vraiment ce qu'on voulait :(

Pour virer les doublons, il faut utiliser DISTINCT :

SELECT DISTINCT city
FROM students;

Résultat :

city
Seattle
Toronto
Chicago

Sans DISTINCT, on aurait vu "Seattle" trois fois, alors qu'on voulait juste une fois chaque ville.

Exemple 2 : Valeurs uniques de plusieurs colonnes

Maintenant, imaginons qu'on veut choper les combinaisons uniques "prénom + nom", parce qu'il peut y avoir des gens avec le même prénom ou le même nom.

On a toujours la même table students :

-- Table students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

La requête :

SELECT DISTINCT first_name, last_name
FROM students;

Résultat :

first_name last_name
Maria Chi
Alex Lin
Anna Song
Nat Cole

Donc, DISTINCT agit comme un filtre : il regarde toutes les colonnes que t'as indiquées et enlève les doublons seulement pour les lignes où toutes ces colonnes sont identiques.

Exemple 3 : Combinaisons uniques et tri

Maintenant, on combine DISTINCT avec le tri ORDER BY, pour avoir les valeurs uniques, triées par nom de famille dans l'ordre alphabétique.

On a la table students :

-- Table students

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Toronto
3 Anna Song Seattle
4 Nat Cole Chicago
5 Maria Chi Seattle

La requête :

SELECT DISTINCT first_name, last_name
FROM students
ORDER BY last_name ASC;

Résultat :

first_name last_name
Maria Chi
Nat Cole
Alex Lin
Anna Song

Les lignes en double sont parties, et les noms de famille sont triés par ordre alphabétique.

Exemple 4 : Utilisation avec les agrégations

Et si on essayait d'utiliser DISTINCT avec une fonction, genre COUNT ?

SELECT COUNT(DISTINCT city) AS unique_city_count
FROM students;

Résultat :

unique_city_count
3

Cette requête te donne le nombre de villes uniques. Pratique, non ?

Particularités de DISTINCT

Quand tu utilises DISTINCT, faut bien piger qu'il bosse sur toutes les colonnes que t'as mises. Si tu ajoutes plus de colonnes dans la requête, le résultat peut changer.

Exemple 5 : Pourquoi c'est important de comprendre le contexte ?

Si tu ajoutes des champs en plus dans la requête, ça peut changer l'unicité des lignes.

SELECT DISTINCT first_name, city
FROM students;

Table students :

id first_name last_name city
1 Maria Chi Seattle
2 Alex Lin Austin
3 Anna Song Seattle
4 Otto Art Denver
5 Maria Chi Portland

Résultat :

first_name city
Maria Seattle
Alex Austin
Anna Seattle
Otto Denver
Maria Portland

Chaque combinaison "prénom + ville" est maintenant unique. Donc retiens bien : l'unicité dépend de toutes les colonnes indiquées, pas de chaque colonne séparément.

Erreurs classiques avec DISTINCT

Une des erreurs les plus courantes avec DISTINCT, c'est de mal piger ce que fait vraiment la requête. Par exemple, si tu mets trop de colonnes dans la requête, tu risques d'avoir un résultat qui n'a rien à voir avec ce que tu voulais, parce que l'unicité sera calculée sur toutes les colonnes.

Par exemple :

SELECT DISTINCT *
FROM students;

Là, chaque ligne sera considérée comme unique, parce que toutes les colonnes sont prises en compte.

Une autre erreur — utiliser DISTINCT là où t'en as pas besoin. Si tu sais que les données sont déjà uniques (genre une colonne qui est une clé primaire), alors DISTINCT va juste rajouter de la charge inutile sur la base de données.

Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION