Jusqu'à présent, nous avons appris à filtrer les lignes (WHERE), à les trier (ORDER BY) et à restreindre le nombre de résultats (LIMIT). Dans des scénarios réels, vous utiliserez presque toujours ces clauses ensemble pour obtenir exactement les données dont vous avez besoin.
SQL impose un ordre strict pour l'apparition de ces clauses dans le texte de la requête. Si vous les placez dans le mauvais ordre, la base de données renverra une erreur.
La séquence ci-dessous est correcte uniquement pour les clauses que nous avons déjà étudiées dans ce module. L'ordre complet des parties d'une requête SQL est plus large et sera enrichi à mesure que vous découvrirez de nouvelles constructions du langage.
La séquence correcte dans le texte de la requête est :
SELECT (Quelles colonnes ?)FROM (Quelle table ?)WHERE (Filtrer les lignes d'abord)ORDER BY (Trier les lignes filtrées)LIMIT (Prendre les X premiers résultats de la liste triée)OFFSET (Sauter X lignes si nécessaire)Important : cet ordre décrit la manière d'écrire la requête, et non son ordre logique d'exécution. Logiquement, SQL traite les différentes parties autrement.
Lorsque vous exécutez une requête combinée, la base de données la traite conceptuellement de cette manière :
FROM.WHERE.SELECT.ORDER BY.OFFSET pour ignorer des lignes si nécessaire, puis LIMIT pour renvoyer la partie requise des lignes triées.C'est pourquoi WHERE ne peut pas faire référence à des alias définis dans SELECT : au moment du filtrage, la liste des colonnes sélectionnées n'est pas encore logiquement formée.
Dans cet exemple, nous filtrons d'abord par coût de remplacement, puis nous trions par durée, et enfin nous limitons les résultats.
SELECT title, length, replacement_cost
FROM film
WHERE replacement_cost < 20.00
ORDER BY length ASC
LIMIT 5;
Cette requête trouve les 10 locations les plus récentes ayant duré plus de 5 jours.
SELECT rental_id, rental_date, return_date
FROM rental
WHERE return_date - rental_date > 5
ORDER BY rental_date DESC
LIMIT 10;
Trouver les 3 premiers acteurs dont le nom commence par 'B', triés par ordre alphabétique de leur prénom.
SELECT first_name, last_name
FROM actor
WHERE last_name LIKE 'B%'
ORDER BY first_name
LIMIT 3;
Dans la leçon précédente, nous avons vu la pagination de base avec LIMIT et OFFSET. Dans les applications réelles, vous paginez généralement sur une liste filtrée et triée.
ORDER BY, la base de données peut renvoyer les lignes dans un ordre différent à chaque passage à la page suivante, ce qui fait que certains éléments apparaissent deux fois tandis que d'autres sont manqués.Pour implémenter la pagination pour la "Page N" avec "S" résultats par page :
LIMIT SOFFSET (N - 1) * SSi nous voulons afficher la deuxième page (5 résultats par page) des acteurs dont le prénom commence par 'A', triés par leur nom :
SELECT first_name, last_name
FROM actor
WHERE first_name LIKE 'A%'
ORDER BY last_name
LIMIT 5 OFFSET 5; -- Page 2 : Sauter 5, prendre 5
Points clés de cette leçon :
WHERE -> ORDER BY -> LIMIT.WHERE sont appliquées avant que le tri et la limitation ne se produisent.LIMIT avec ORDER BY si vous voulez que vos résultats soient cohérents.Dans le module suivant, nous irons au-delà de la simple récupération de lignes et explorerons les fonctions d'agrégation, qui nous permettent de calculer des totaux, des moyennes et des comptages sur des ensembles de données entiers.