SELECT (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Point de terminaison analytique SQL dans Microsoft FabricEntrepôt dans Microsoft Fabric

Récupère des lignes de la base de données et permet de sélectionner une ou plusieurs lignes ou colonnes d’une ou de plusieurs tables dans SQL Server. La syntaxe complète de l'instruction SELECT est complexe mais en voici les principales clauses :

[ WITH { [ XMLNAMESPACES ,][ <common_table_expression> ] } ]

SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ]

[ HAVING search_condition ]

[ WINDOW window_expression]

[ ORDER BY expression_order [ ASC | DESC ]]

Les opérateurs UNION, EXCEPT et INTERSECT peuvent être utilisés entre plusieurs requêtes pour combiner ou comparer leurs résultats dans un seul jeu de résultats.

Conventions de la syntaxe Transact-SQL

Syntaxe

-- Syntax for SQL Server and Azure SQL Database  
  
<SELECT statement> ::=    
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]  
    <query_expression>   
    [ ORDER BY <order_by_expression> ] 
    [ <FOR Clause>]   
    [ OPTION ( <query_hint> [ ,...n ] ) ]   
<query_expression> ::=   
    { <query_specification> | ( <query_expression> ) }   
    [  { UNION [ ALL ] | EXCEPT | INTERSECT }  
        <query_specification> | ( <query_expression> ) [...n ] ]   
<query_specification> ::=   
SELECT [ ALL | DISTINCT ]   
    [TOP ( expression ) [PERCENT] [ WITH TIES ] ]   
    < select_list >   
    [ INTO new_table ]   
    [ FROM { <table_source> } [ ,...n ] ]   
    [ WHERE <search_condition> ]   
    [ <GROUP BY> ]   
    [ HAVING < search_condition > ]   
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
[ WITH <common_table_expression> [ ,...n ] ]  
SELECT <select_criteria>  
[;]  
  
<select_criteria> ::=  
    [ TOP ( top_expression ) ]   
    [ ALL | DISTINCT ]   
    { * | column_name | expression } [ ,...n ]   
    [ FROM { table_source } [ ,...n ] ]  
    [ WHERE <search_condition> ]   
    [ GROUP BY <group_by_clause> ]   
    [ HAVING <search_condition> ]   
    [ ORDER BY <order_by_expression> ]  
    [ OPTION ( <query_option> [ ,...n ] ) ]  
  

Remarque

Pour afficher la syntaxe Transact-SQL pour SQL Server 2014 (12.x) et versions antérieures, consultez Versions antérieures de la documentation.

Notes

En raison de la complexité de l'instruction SELECT, les éléments et les arguments de la syntaxe sont détaillés par clause :

L'ordre des clauses dans une instruction SELECT est de première importance. Vous pouvez omettre n'importe quelle clause facultative mais, lorsque vous employez les clauses facultatives, elles doivent apparaître dans l'ordre adéquat.

Les instructions SELECT sont autorisées dans les fonctions définies par l'utilisateur uniquement si les listes de sélection de ces instructions contiennent des expressions qui attribuent des valeurs aux variables qui sont locales aux fonctions.

Un nom en quatre parties, dont la partie nom de serveur est établie avec la fonction OPENDATASOURCE, peut être utilisé comme source de table dans tous les cas où il est possible d’inclure un nom de table dans une instruction SELECT. Un nom en quatre parties ne peut pas être spécifié pour Azure SQL Database.

Certaines restrictions syntaxiques s'appliquent aux instructions SELECT impliquant des tables distantes.

Ordre logique de traitement de l’instruction SELECT

Les étapes suivantes indiquent l'ordre de traitement logique, ou ordre de liaison, d'une instruction SELECT. Cet ordre détermine à quel moment les objets définis au cours d'une étape deviennent disponibles pour les clauses des étapes suivantes. Par exemple, si le processeur de requêtes peut se lier (accéder) aux tables ou vues définies dans la clause FROM, ces objets et leurs colonnes deviennent disponibles pour toutes les étapes suivantes. À l'inverse, puisque la clause SELECT correspond à l'étape 8, aucun alias de colonne ni aucune colonne dérivée défini(e) dans cette clause ne peut être référencé(e) par les clauses précédentes. Cependant, ils peuvent être référencés par les clauses suivantes telles que la clause ORDER BY. L’exécution physique réelle de l’instruction est déterminée par le processeur de requêtes, et l’ordre peut différer de cette liste.

  1. FROM
  2. ACTIVÉ
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE ou WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. Haut de la page

Avertissement

La séquence précédente est généralement celle qui est appliquée. Toutefois, dans certains cas rares, la séquence peut s’exécuter différemment.

Par exemple, supposons qu’un index cluster est appliqué à un affichage qui exclut certaines lignes de la table, et que la liste de colonnes SELECT dans l’affichage utilise une clause CONVERT qui convertit un type de données varchar en integer. Dans ce cas, la clause CONVERT peut s’exécuter avant la clause WHERE. Ce cas se produit rarement. Il y a souvent un moyen de modifier votre affichage pour éviter tout changement de la séquence, si cela est important dans votre cas.

Autorisations

La sélection de données requiert l'autorisation SELECT sur la table ou la vue, qui pourrait être héritée d'une étendue supérieure telle que l'autorisation SELECT sur le schéma ou l'autorisation CONTROL sur la table. La sélection peut également nécessiter l’appartenance au rôle de base de données fixe db_datareader ou db_owner, ou au rôle de serveur fixe sysadmin. La création d’une nouvelle table à l’aide de SELECT INTO requiert également l’autorisation CREATE TABLE et l’autorisation ALTER SCHEMA sur le schéma qui possède la nouvelle table.

Exemples :

Les exemples suivants utilisent la base de données AdventureWorksPDW2022.

R. Utilisation de SELECT pour extraire des lignes et des colonnes

Cette section présente trois exemples de code. Le premier exemple de code retourne toutes les lignes (aucune clause WHERE n’est définie) et toutes les colonnes (en utilisant *) de la table DimEmployee.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

L’exemple suivant donne le même résultat, mais en utilisant des alias de table.

SELECT e.*  
FROM DimEmployee AS e  
ORDER BY LastName;  

Cet exemple retourne toutes les lignes (aucune clause WHERE n’est définie) et un sous-ensemble des colonnes (FirstName, LastName, StartDate) de la table DimEmployee dans la base de données AdventureWorksPDW2012. L’en-tête de la troisième colonne est renommé FirstDay.

SELECT FirstName, LastName, StartDate AS FirstDay  
FROM DimEmployee   
ORDER BY LastName;  

Cet exemple retourne uniquement les lignes de la table DimEmployee qui ont une valeur EndDate non NULL et une valeur MaritalStatus égale à « M » (marié).

SELECT FirstName, LastName, StartDate AS FirstDay  
FROM DimEmployee   
WHERE EndDate IS NOT NULL   
AND MaritalStatus = 'M'  
ORDER BY LastName;  

B. Utilisation de SELECT avec des en-têtes de colonne et des calculs

L’exemple suivant retourne toutes les lignes de la table DimEmployee, et calcule le salaire brut de chaque employé sur la base de la valeur BaseRate et d’une semaine de 40 heures de travail.

SELECT FirstName, LastName, BaseRate, BaseRate * 40 AS GrossPay  
FROM DimEmployee  
ORDER BY LastName;  

C. Utilisation de DISTINCT avec SELECT

L’exemple suivant utilise DISTINCT pour générer une liste de tous les titres uniques figurant dans la table DimEmployee.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D. Utilisation de GROUP BY

L’exemple suivant calcule le montant total des ventes réalisées par jour.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

Comme la clause GROUP BY est utilisée, une seule ligne contenant la somme de toutes les ventes est retournée pour chaque jour.

E. Utilisation de GROUP BY avec plusieurs groupes

L’exemple suivant calcule le prix moyen et la somme des ventes sur Internet pour chaque jour, en regroupant les résultats en fonction de la date de commande et de la clé de promotion.


SELECT OrderDateKey, PromotionKey, AVG(SalesAmount) AS AvgSales, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey, PromotionKey  
ORDER BY OrderDateKey;   

F. Utilisation de GROUP BY et WHERE

L’exemple suivant regroupe les résultats après avoir récupéré uniquement les lignes dont les dates de commande sont postérieures au 1er août 2002.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
WHERE OrderDateKey > '20020801'  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

G. Utilisation de GROUP BY avec une expression

L'exemple suivant effectue un regroupement en fonction d'une expression. Vous pouvez spécifier un regroupement en fonction d'une expression à condition qu'elle ne contienne pas de fonction d'agrégation.

SELECT SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY (OrderDateKey * 10);  

H. Utilisation de GROUP BY avec ORDER BY

L’exemple suivant calcule la somme des ventes par jour, en triant les résultats par date.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

I. Utilisation de la clause HAVING

Cette requête utilise la clause HAVING pour limiter les résultats.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
HAVING OrderDateKey > 20010000  
ORDER BY OrderDateKey;  

Voir aussi

Exemples SELECT (Transact-SQL)
Indicateurs (Transact-SQL)