Recherche…
Utilisez ORDER BY avec TOP pour renvoyer les x premières lignes en fonction de la valeur d'une colonne
Dans cet exemple, nous pouvons utiliser GROUP BY non seulement pour déterminer le type des lignes renvoyées, mais également quelles lignes sont renvoyées, car nous utilisons TOP pour limiter le jeu de résultats.
Disons que nous voulons renvoyer les 5 meilleurs utilisateurs de réputation depuis un site de questions / réponses peu connu.
Sans COMMANDE PAR
Cette requête renvoie les 5 premières lignes triées par défaut, qui dans ce cas est "Id", la première colonne de la table (même si ce n'est pas une colonne affichée dans les résultats).
SELECT TOP 5 DisplayName, Reputation
FROM Users
résultats...
Afficher un nom | Réputation |
---|---|
Communauté | 1 |
Geoff Dalgas | 12567 |
Jarrod Dixon | 11739 |
Jeff Atwood | 37628 |
Joel Spolsky | 25784 |
Avec ORDER BY
SELECT TOP 5 DisplayName, Reputation
FROM Users
ORDER BY Reputation desc
résultats...
Afficher un nom | Réputation |
---|---|
JonSkeet | 865023 |
Darin Dimitrov | 661741 |
BalusC | 650237 |
Hans Passant | 625870 |
Marc Gravell | 601636 |
Remarques
Certaines versions de SQL (telles que MySQL) utilisent une clause LIMIT
à la fin d'un SELECT
, au lieu de TOP
au début, par exemple:
SELECT DisplayName, Reputation
FROM Users
ORDER BY Reputation DESC
LIMIT 5
Tri par plusieurs colonnes
SELECT DisplayName, JoinDate, Reputation FROM Users ORDER BY JoinDate, Reputation
Afficher un nom | JoinDate | Réputation |
---|---|---|
Communauté | 2008-09-15 | 1 |
Jeff Atwood | 2008-09-16 | 25784 |
Joel Spolsky | 2008-09-16 | 37628 |
Jarrod Dixon | 2008-10-03 | 11739 |
Geoff Dalgas | 2008-10-03 | 12567 |
Tri par numéro de colonne (au lieu de nom)
Vous pouvez utiliser le numéro d'une colonne (où la colonne la plus à gauche est «1») pour indiquer la colonne sur laquelle baser le tri, au lieu de décrire la colonne par son nom.
Pro: Si vous pensez qu'il est probable que vous modifieriez les noms de colonnes plus tard, cela ne briserait pas ce code.
Con: Cela réduira généralement la lisibilité de la requête (il est clair que «ORDER BY Reputation» signifie, alors que «ORDER BY 14» nécessite un comptage, probablement avec un doigt sur l'écran.)
Cette requête trie le résultat en fonction des informations dans la position relative de la colonne 3
partir de l'instruction select au lieu du nom de la colonne Reputation
.
SELECT DisplayName, JoinDate, Reputation FROM Users ORDER BY 3
Afficher un nom | JoinDate | Réputation |
---|---|---|
Communauté | 2008-09-15 | 1 |
Jarrod Dixon | 2008-10-03 | 11739 |
Geoff Dalgas | 2008-10-03 | 12567 |
Joel Spolsky | 2008-09-16 | 25784 |
Jeff Atwood | 2008-09-16 | 37628 |
Commande par alias
En raison de l'ordre de traitement des requêtes logiques, des alias peuvent être utilisés dans l'ordre.
SELECT DisplayName, JoinDate as jd, Reputation as rep
FROM Users
ORDER BY jd, rep
Et peut utiliser l'ordre relatif des colonnes dans l'instruction select. Considérez le même exemple que ci-dessus et, au lieu d'utiliser des alias, utilisez l'ordre relatif comme pour le nom d'affichage, il est 1, pour Jd il est 2 et ainsi de suite
SELECT DisplayName, JoinDate as jd, Reputation as rep
FROM Users
ORDER BY 2, 3
Ordre de tri personnalisé
Pour trier cette table Employee
par département, vous utiliseriez ORDER BY Department
. Toutefois, si vous souhaitez un ordre de tri différent de celui par ordre alphabétique, vous devez mapper les valeurs du Department
en différentes valeurs qui sont triées correctement. cela peut être fait avec une expression CASE:
prénom | département |
---|---|
Hasan | IL |
Yusuf | HEURE |
Hillary | HEURE |
Joe | IL |
Joyeux | HEURE |
Ken | Comptable |
SELECT *
FROM Employee
ORDER BY CASE Department
WHEN 'HR' THEN 1
WHEN 'Accountant' THEN 2
ELSE 3
END;
prénom | département |
---|---|
Yusuf | HEURE |
Hillary | HEURE |
Joyeux | HEURE |
Ken | Comptable |
Hasan | IL |
Joe | IL |