Une instruction SELECT extrait zéro ou plusieurs lignes d'une ou plusieurs tables ou vues de base de données . Dans la plupart des applications, il s'agit de la commande de langage de manipulation de donnéesSELECT (LMD) la plus couramment utilisée . SQL étant un langage de programmation déclaratif , les requêtes spécifient un ensemble de résultats, mais pas la méthode de calcul. La base de données traduit la requête en un « plan d'exécution », qui peut varier selon les exécutions, les versions de la base de données et le logiciel de base de données. Cette fonctionnalité est appelée « optimiseur de requêtes », car elle est chargée de trouver le meilleur plan d'exécution possible pour la requête, en tenant compte des contraintes applicables.SELECT
L'instruction SELECT comporte de nombreuses clauses facultatives :
SELECTLa liste correspond aux colonnes ou expressions SQL renvoyées par la requête. Cela correspond approximativement à l' opération de projection en algèbre relationnelle .ASFournit éventuellement un alias pour chaque colonne ou expression de laSELECTliste. Il s'agit de l' opération de renommage en algèbre relationnelle .FROMindique de quelle table extraire les données.WHERESpécifie les lignes à récupérer. Cela correspond approximativement à l' opération de sélection en algèbre relationnelle .GROUP BYregroupe les lignes partageant une propriété afin qu'une fonction d'agrégation puisse être appliquée à chaque groupe.HAVINGsélectionne parmi les groupes définis par la clause GROUP BY.ORDER BYspécifie comment ordonner les lignes renvoyées.
SELECTLes requêtes standard n'ont pas d'effet persistant sur la base de données. Certaines implémentations non standard SELECTpeuvent avoir des effets persistants, comme la SELECT INTOsyntaxe proposée par certaines bases de données. Les requêtes permettent à l'utilisateur de décrire les données souhaitées, laissant au système de gestion de base de données (SGBD) le soin de planifier , d'optimiser et d'effectuer les opérations physiques nécessaires pour produire ce résultat comme il l'entend.
Une requête comprend une liste de colonnes à inclure dans le résultat final, généralement immédiatement après le SELECTmot-clé. Un astérisque (* *) permet de spécifier que la requête doit renvoyer toutes les colonnes de toutes les tables interrogées. SELECTest l'instruction la plus complexe en SQL, avec des mots-clés et des clauses optionnels, notamment :
- Cette
FROMclause indique les tables à partir desquelles extraire les données. ElleFROMpeut inclureJOINdes sous-clauses facultatives précisant les règles de jointure. - Cette
WHEREclause inclut un prédicat de comparaison qui restreint les lignes renvoyées par la requête.WHEREElle élimine du jeu de résultats toutes les lignes pour lesquelles le prédicat de comparaison n'est pas vrai. - Cette
GROUP BYclause regroupe les lignes ayant des valeurs communes en un ensemble plus restreint.GROUP BYElle est souvent utilisée conjointement avec les fonctions d'agrégation SQL ou pour éliminer les doublons d'un résultat. CetteWHEREclause est appliquée avant laGROUP BYclause WHERE. - Cette
HAVINGclause inclut un prédicat permettant de filtrer les lignes résultant de laGROUP BYclause précédente. Comme elle agit sur les résultats de cetteGROUP BYdernière, des fonctions d'agrégation peuvent être utilisées dans sonHAVINGprédicat. - Cette
ORDER BYclause spécifie les colonnes à utiliser pour trier les données résultantes, ainsi que le sens du tri (ascendant ou descendant). Sans cetteORDER BYclause, l'ordre des lignes renvoyées par une requête SQL est indéfini. - Le
DISTINCTmot-clé élimine les données dupliquées.
L'exemple de SELECTrequête suivant renvoie une liste de livres chers. La requête extrait toutes les lignes de la table Book dont la colonne « prix » contient une valeur supérieure à 100,00. Le résultat est trié par ordre croissant de titre . L'astérisque (*) dans la clause SELECT indique que toutes les colonnes de la table Book doivent être incluses dans le résultat.
SELECT * FROM Book WHERE price > 100 . 00 ORDER BY title ;
L'exemple ci-dessous illustre une requête portant sur plusieurs tables, un regroupement et une agrégation, en renvoyant une liste de livres et le nombre d'auteurs associés à chaque livre.
AVGreçoit en entrée le résultat d'une sous-requête :Depuis 1999, la norme SQL autorise les clauses WITH, c'est-à-dire les sous-requêtes nommées, souvent appelées expressions de table communes (CTE) (nommées et conçues d'après l'implémentation IBM DB2 version 2 ; Oracle les appelle factorisation de sous-requêtes ). Les CTE peuvent également être récursives en faisant référence à elles-mêmes ; le mécanisme qui en résulte permet les parcours d'arbres ou de graphes (lorsqu'ils sont représentés par des relations), et plus généralement les calculs de point fixe .
Tableau dérivé
Une table dérivée est une sous-requête dans une clause FROM. Concrètement, il s'agit d'une sous-requête à partir de laquelle des données peuvent être sélectionnées ou jointes. La fonctionnalité de table dérivée permet à l'utilisateur de référencer la sous-requête comme une table. On parle également de vue en ligne ou de sélection dans une liste FROM .
Dans l'exemple suivant, la requête SQL effectue une jointure entre la table initiale « Books » et la table dérivée « Sales ». Cette dernière contient les informations relatives aux ventes de livres, la jointure avec la table « Books » se faisant par l'ISBN. Par conséquent, la table dérivée fournit au jeu de résultats des colonnes supplémentaires (le nombre d'articles vendus et l'entreprise vendeuse).
| C1 | C2 |
|---|---|
| 1 | un |
| 2 | b |
projection en algèbre relationnelle , à ceci près que, dans le cas général, le résultat peut contenir des lignes dupliquées. On parle également de partition verticale dans certains jargons de bases de données ; cette technique permet de limiter l’affichage des résultats de la requête à des champs ou colonnes spécifiques.Avec la même table, la requête affichera tous les éléments de toutes les lignes où la valeur de la colonne C1 est « 1 » . En termes d'algèbre relationnelle , une sélection est effectuée grâce à la clause WHERE. On parle également de partition horizontale, qui permet de limiter les lignes renvoyées par une requête selon des conditions spécifiées.
Avec plusieurs tables, le résultat sera l'ensemble de toutes les combinaisons de lignes. Ainsi, si deux tables sont T1 et T2, le résultat sera l'ensemble de toutes les combinaisons de lignes de T1 avec toutes les lignes de T2. Par exemple, si T1 contient 3 lignes et T2 5 lignes, le résultat sera de 15 lignes.ISO SQL:2003 , les ensembles de résultats peuvent être limités en utilisant
- curseurs , ou
- en ajoutant une fonction de fenêtre SQL à l'instruction SELECT
La norme ISO SQL:2008 a introduit cette FETCH FIRSTclause.
D'après la documentation de PostgreSQL v.9, une fonction de fenêtre SQL « effectue un calcul sur un ensemble de lignes de table liées d'une manière ou d'une autre à la ligne courante », de façon similaire aux fonctions d'agrégation. Son nom rappelle les fonctions de fenêtre utilisées en traitement du signal . Un appel de fonction de fenêtre contient toujours une clause OVER .
Fonction de fenêtre ROW_NUMBER()
ROW_NUMBER() OVERpeut être utilisé pour un tableau simple sur les lignes renvoyées, par exemple pour ne renvoyer pas plus de dix lignes :
non déterministe : si sort_key n'est pas unique, il est possible que chaque requête renvoie des numéros de ligne différents pour une même ligne ayant la même valeur de sort_key . En revanche, si sort_key est unique, chaque ligne se verra toujours attribuer un numéro de ligne unique.Fonction de fenêtre RANK()
La RANK() OVERfonction de fenêtre agit comme ROW_NUMBER , mais peut renvoyer plus ou moins de n lignes en cas d'égalité, par exemple pour renvoyer les 10 personnes les plus jeunes :Mimer SQL .
Microsoft SQL Server 2008 et versions ultérieures prennent en charge cette fonctionnalitéFETCH FIRST , mais elle est considérée comme faisant partie de la ORDER BYclause `WHERE`. Les clauses ` ORDER BYWHERE`, OFFSET`WHERE` et FETCH FIRST`WHERE` sont toutes requises pour cet usage.
MS SQL Server (Cette requête fonctionne également sur Microsoft SQL Server 6.5, contrairement à la requête SELECT TOP 10 * FROM T ) Netezza , MySQL , MariaDB (y compris la version standard depuis la version 10.6), SAP SQL Anywhere , PostgreSQL (y compris la version standard depuis la version 8.4), SQLite , HSQLDB , H2 , Vertica , Polyhedra , Couchbase Server , Snowflake Computing , OpenLink Virtuoso Oracle SELECT FIRST 10 * from T Ingres SELECT FIRST 10 * FROM T order by a Informix SELECT SKIP 20 FIRST 10 * FROM T order by c, d Informix (les numéros de ligne sont filtrés après l'évaluation de la clause ORDER BY. La clause SKIP a été introduite dans le correctif v10.00.xC4) SELECT TOP 10 * FROM TMS SQL Server , SAP ASE , MS Access , SAP IQ , Teradata Teradata SELECT TOP 20, 10 * FROM TOpenLink Virtuoso (ignore 20, fournit les 10 suivants) SELECT TOP 10 START AT 20 * FROM TSAP SQL Anywhere (prend également en charge la norme, depuis la version 9.0.1) SELECT FIRST 10 SKIP 20 * FROM TOiseau de feu Firebird (depuis la version 2.1) 10 FETCH FIRST 10 ROWS ONLY" SELECT * FROM T WHERE ID_T > 10 FETCH FIRST 10 ROWS ONLY
IBM Db2 20 FETCH FIRST 10 ROWS ONLY" SELECT * FROM T WHERE ID_T > 20 RÉCUPÉRER LES 10 PREMIÈRES LIGNES UNIQUEMENT
IBM Db2 (les nouvelles lignes sont filtrées après comparaison avec la colonne clé de la table T) Pagination des lignes
La pagination des lignes est une technique permettant de limiter l'affichage des données d'une requête à une partie seulement des résultats de la base de données. Au lieu d'afficher simultanément des centaines, voire des milliers de lignes, le serveur ne reçoit qu'une seule page (un nombre limité de lignes, par exemple 10). L'utilisateur navigue ensuite en demandant la page suivante, puis la suivante, et ainsi de suite. Cette technique est particulièrement utile dans les systèmes web, où l'absence de connexion dédiée entre le client et le serveur permet au client de ne pas avoir à attendre la lecture et l'affichage de toutes les lignes du serveur.
Approche de pagination des données
{rows}= Nombre de lignes dans une page{page_number}= Numéro de la page actuelle{begin_base_0}= Numéro de la ligne - 1 où la page commence = (numéro_de_page-1) * lignes
Méthode la plus simple (mais très inefficace)
- Sélectionnez toutes les lignes de la base de données
- Lire toutes les lignes, mais les afficher uniquement lorsque le numéro de ligne des lignes lues est compris entre
{begin_base_0 + 1}et{begin_base_0 + rows}
SQL Dialecte SQL Dialecte Première page Page suivante Page précédente Dialecte une syntaxe spécialisée pour les données hiérarchiques .Une fonction de fenêtre en SQL:2003 est une fonction d'agrégation appliquée à une partition de l'ensemble de résultats.
Par exemple,
Plus d articles de Worldlex Wiki
Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.
Explorer l index