SELECT (Transact-SQL)SELECT (Transact-SQL)

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database ouiAzure Synapse Analytics (SQL DW) ouiParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

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 ServerSQL Server.Retrieves rows from the database and enables the selection of one or many rows or columns from one or many tables in SQL ServerSQL Server. La syntaxe complète de l'instruction SELECT est complexe mais en voici les principales clauses :The full syntax of the SELECT statement is complex, but the main clauses can be summarized as:

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

SELECT select_list [ INTO new_table ]SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ][ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ][ GROUP BY group_by_expression ]

[ HAVING search_condition ][ HAVING search_condition ]

[ ORDER BY order_expression [ ASC | DESC ] ][ ORDER BY order_expression [ 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.The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

-- Syntax for SQL Server and Azure SQL Database  
  
<SELECT statement> ::=    
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]  
    <query_expression>   
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }   
  [ ,...n ] ]   
    [ <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 SQL Data Warehouse 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 ] ) ]  
  

NotesRemarks

En raison de la complexité de l'instruction SELECT, les éléments et les arguments de la syntaxe sont détaillés par clause :Because of the complexity of the SELECT statement, detailed syntax elements and arguments are shown by clause:

WITH XMLNAMESPACESWITH XMLNAMESPACES

WITH common_table_expressionWITH common_table_expression
HAVINGHAVING
SELECT (Clause)SELECT Clause UNIONUNION
Clause INTOINTO Clause EXCEPT et INTERSECTEXCEPT and INTERSECT
FROMFROM ORDER BYORDER BY
WHEREWHERE Clause FORFOR Clause
GROUP BYGROUP BY OPTION, clauseOPTION Clause

L'ordre des clauses dans une instruction SELECT est de première importance.The order of the clauses in the SELECT statement is significant. Vous pouvez omettre n'importe quelle clause facultative mais, lorsque vous employez les clauses facultatives, elles doivent apparaître dans l'ordre adéquat.Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

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.SELECT statements are permitted in user-defined functions only if the select lists of these statements contain expressions that assign values to variables that are local to the functions.

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.A four-part name constructed with the OPENDATASOURCE function as the server-name part can be used as a table source wherever a table name can appear in a SELECT statement. Un nom en quatre parties ne peut pas être spécifié pour Azure SQL DatabaseAzure SQL Database.A four-part name cannot be specified for Azure SQL DatabaseAzure SQL Database.

Certaines restrictions syntaxiques s'appliquent aux instructions SELECT impliquant des tables distantes.Some syntax restrictions apply to SELECT statements that involve remote tables.

Ordre de traitement logique de l'instruction SELECTLogical Processing Order of the SELECT statement

Les étapes suivantes indiquent l'ordre de traitement logique, ou ordre de liaison, d'une instruction SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Cet ordre détermine à quel moment les objets définis au cours d'une étape deviennent disponibles pour les clauses des étapes suivantes.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. 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.For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. À 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.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Cependant, ils peuvent être référencés par les clauses suivantes telles que la clause ORDER BY.However, they can be referenced by subsequent clauses such as the ORDER BY clause. 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.The actual physical execution of the statement is determined by the query processor and the order may vary from this list.

  1. FROMFROM
  2. ONON
  3. JOINJOIN
  4. WHEREWHERE
  5. GROUP BYGROUP BY
  6. WITH CUBE ou WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. Haut de la pageTOP

Avertissement

La séquence précédente est généralement celle qui est appliquée.The preceding sequence is usually true. Toutefois, dans certains cas rares, la séquence peut s’exécuter différemment.However, there are uncommon cases where the sequence may differ.

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.For example, suppose you have a clustered index on a view, and the view excludes some table rows, and the view's SELECT column list uses a CONVERT that changes a data type from varchar to integer. Dans ce cas, la clause CONVERT peut s’exécuter avant la clause WHERE.In this situation, the CONVERT may execute before the WHERE clause executes. Ce cas se produit rarement.Uncommon indeed. 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.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

AutorisationsPermissions

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.Selecting data requires SELECT permission on the table or view, which could be inherited from a higher scope such as SELECT permission on the schema or CONTROL permission on the 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.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. La création d’une table à l’aide de SELECTINTO nécessite également l’autorisation CREATETABLE et l’autorisation ALTERSCHEMA sur le schéma propriétaire de la nouvelle table.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

Exemples :Examples:

Les exemples suivants utilisent la base de données AdventureWorksPDW2012AdventureWorksPDW2012.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Utilisation de SELECT pour extraire des lignes et des colonnesUsing SELECT to retrieve rows and columns

Cette section présente trois exemples de code.This section shows three code examples. 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.This first code example returns all rows (no WHERE clause is specified) and all columns (using the *) from the DimEmployee table.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

L’exemple suivant donne le même résultat, mais en utilisant des alias de table.This next example using table aliasing to achieve the same result.

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.This example returns all rows (no WHERE clause is specified) and a subset of the columns (FirstName, LastName, StartDate) from the DimEmployee table in the AdventureWorksPDW2012 database. L’en-tête de la troisième colonne est renommé FirstDay.The third column heading is renamed to 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é).This example returns only the rows for DimEmployee that have an EndDate that is not NULL and a MaritalStatus of 'M' (married).

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

B.B. Utilisation de SELECT avec des en-têtes de colonne et des calculsUsing SELECT with column headings and calculations

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.The following example returns all rows from the DimEmployee table, and calculates the gross pay for each employee based on their BaseRate and a 40-hour work week.

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

C.C. Utilisation de DISTINCT avec SELECTUsing DISTINCT with SELECT

L’exemple suivant utilise DISTINCT pour générer une liste de tous les titres uniques figurant dans la table DimEmployee.The following example uses DISTINCT to generate a list of all unique titles in the DimEmployee table.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D.D. Utilisation de GROUP BYUsing GROUP BY

L’exemple suivant calcule le montant total des ventes réalisées par jour.The following example finds the total amount for all sales on each day.

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.Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

E.E. Utilisation de GROUP BY avec plusieurs groupesUsing GROUP BY with multiple groups

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.The following example finds the average price and the sum of Internet sales for each day, grouped by order date and the promotion key.


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

F.F. Utilisation de GROUP BY et WHEREUsing GROUP BY and 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.The following example puts the results into groups after retrieving only the rows with order dates later than August 1, 2002.

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

G.G. Utilisation de GROUP BY avec une expressionUsing GROUP BY with an expression

L'exemple suivant effectue un regroupement en fonction d'une expression.The following example groups by an expression. Vous pouvez spécifier un regroupement en fonction d'une expression à condition qu'elle ne contienne pas de fonction d'agrégation.You can group by an expression if the expression does not include aggregate functions.

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

H.H. Utilisation de GROUP BY avec ORDER BYUsing GROUP BY with ORDER BY

L’exemple suivant calcule la somme des ventes par jour, en triant les résultats par date.The following example finds the sum of sales per day, and orders by the day.

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

I.I. Utilisation de la clause HAVINGUsing the HAVING clause

Cette requête utilise la clause HAVING pour limiter les résultats.This query uses the HAVING clause to restrict results.

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

Voir aussiSee Also

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