Tri (ORDER BY) et dédoublonnage (SELECT DISTINCT)

Informations[1]

Objectifs

  • Savoir trier les résultats d'une requête SQL.

  • Savoir enlever les doublons des résultats d'une requête SQL.

Mise en situation

Les enregistrements d'une table ne sont pas ordonnés, ce qui implique que l'ordre des résultats d'une requête de sélection n'est pas prévisible.

Or il peut être très utile de trier les résultats selon un critère, par exemple pour afficher les articles en stock, en allant des prix les plus bas aux pris les plus hauts.

Aussi, lorsque l'on ne récupère que quelques attributs d'une table, comme le nom d'une personne, il y des risques de doublons. Comment supprimer ces doublons de l'affichage ?

SQL fournit des instructions pour le tri et le dédoublonnage des résultats.

FondamentalTri des enregistrement

On peut trier les résultats de sélection en fonction des valeurs de certains attributs des enregistrements retournés.

SyntaxeORDER BY

1
SELECT liste d'attributs projetés
2
FROM liste de relations
3
WHERE condition
4
ORDER BY liste ordonnée d'attributs

Les tuples sont triés d'abord par le premier attribut spécifié dans la clause ORDER BY, puis en cas de doublons par le second, etc.

Exemple

1
SELECT *
2
FROM parent
3
ORDER BY nom, age;

RemarqueTri décroissant

Le tri défini à l'aide de ORDER BY est un tri croissant. Pour effectuer un tri décroissant on fait suivre l'attribut du mot-clé DESC.

Exemple

1
SELECT *
2
FROM parent
3
ORDER BY nom, age DESC;

AttentionDédoublonnage des enregistrement

L'opérateur SELECT n'élimine pas les doublons (i.e. les tuples identiques dans la relation résultat) par défaut. Il faut pour cela utiliser l'opérateur SELECT DISTINCT.

Exemple

1
CREATE TABLE parent (
2
id INTEGER PRIMARY KEY,
3
nom VARCHAR(255),
4
prenom VARCHAR(255), 
5
age INTEGER CHECK (age > 0)
6
);
7
8
INSERT INTO parent VALUES (1, 'Brasseur', 'Alexandre', 91);
9
INSERT INTO parent VALUES (2, 'Brasseur', 'Pierre', 67);
1
SELECT nom
2
FROM parent;
1
   nom    
2
----------
3
 Brasseur
4
 Brasseur
5
(2 rows)

Cette requête sélectionne l'attribut nom de la relation parent et renvoie tous les enregistrements.

1
SELECT DISTINCT nom
2
FROM parent;
1
   nom    
2
----------
3
 Brasseur
4
(1 row)

Cette requête sélectionne l'attribut nom de la relation parent et renvoie les enregistrements sans doublons (donc elle ne renvoie qu'un seul enregistrement si plusieurs parents ont le même nom).