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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Возвращает строки из базы данных и позволяет делать выборку одной или нескольких строк или столбцов из одной или нескольких таблиц в 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. Полный синтаксис инструкции SELECT сложен, однако основные предложения можно вкратце описать следующим образом: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 ] ]

Операторы UNION, EXCEPT и INTERSECT можно использовать между запросами, чтобы сравнить их результаты или объединить в один результирующий набор.The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- 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 ] ) ]  
  

RemarksRemarks

Учитывая сложность инструкции SELECT, элементы ее синтаксиса и аргументы подробно представлены в предложении:Because of the complexity of the SELECT statement, detailed syntax elements and arguments are shown by clause:

WITH XMLNAMESPACESWITH XMLNAMESPACES

WITH <обобщенное_табличное_выражение>WITH common_table_expression
HAVINGHAVING
Предложение SELECTSELECT Clause UNIONUNION
Предложение INTOINTO Clause EXCEPT и INTERSECTEXCEPT and INTERSECT
FROMFROM ORDER BYORDER BY
WHEREWHERE Предложение FORFOR Clause
GROUP BYGROUP BY Предложение OPTIONOPTION Clause

Порядок предложений в инструкции SELECT имеет значение.The order of the clauses in the SELECT statement is significant. Любое из необязательных предложений может быть опущено; но если необязательные предложения используются, они должны следовать в определенном порядке.Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

Инструкции SELECT разрешено использовать в определяемых пользователем функциях только в том случае, если списки выбора этих инструкций содержат выражения, которые присваивают значения переменным, локальным для функций.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.

Четырехкомпонентное имя, использующее функцию OPENDATASOURCE в качестве части имени сервера, может служить в качестве исходной таблицы в любом месте инструкции 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. Четырехкомпонентное имя не может указываться для База данных SQL AzureAzure SQL Database.A four-part name cannot be specified for База данных SQL AzureAzure SQL Database.

Для инструкций SELECT, которые задействуют удаленные таблицы, существуют некоторые ограничения на синтаксис.Some syntax restrictions apply to SELECT statements that involve remote tables.

Логический порядок обработки инструкции SELECTLogical Processing Order of the SELECT statement

Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT.The following steps show the logical processing order, or binding order, for a SELECT statement. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах.This order determines when the objects defined in one step are made available to the clauses in subsequent steps. Например, если обработчик запросов можно привязать (для доступа) к таблицам или представлениям, определенным в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов.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. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производных столбцов, определенные в этом предложении, не могут быть объектом для ссылки предыдущих предложений.Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. Вместе с тем к ним могут обращаться последующие предложения, например предложение ORDER BY.However, they can be referenced by subsequent clauses such as the ORDER BY clause. Фактическое физическое выполнение инструкции определяется обработчиком запросов и порядок из этого списка может значительно отличаться.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 или WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. В началоTOP

Предупреждение

Как правило, применяется предыдущая последовательность.The preceding sequence is usually true. Однако в редких случаях может быть указана другая последовательность.However, there are uncommon cases where the sequence may differ.

Например, предположим, что в представлении есть кластеризованный индекс и представление исключает некоторые строки таблицы, а для списка столбцов SELECT представления используется инструкция CONVERT, которая изменяет тип данных с varchar на 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. В этом случае CONVERT может выполняться до выполнения предложения WHERE.In this situation, the CONVERT may execute before the WHERE clause executes. Это нестандартное поведение.Uncommon indeed. Если это имеет значение в вашем случае, можно изменить представление, чтобы исключить использование другой последовательности.Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

РазрешенияPermissions

Для выборки данных требуется разрешение SELECT на таблицу или представление, которое может быть унаследовано из области более высокого уровня, например разрешение SELECT на схему или разрешение CONTROL на таблицу.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. Или необходимо быть членом предопределенных ролей базы данных db_datareader или db_owner либо предопределенной роли сервера sysadmin.Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. Для создания новой таблицы с помощью SELECTINTO также необходимы разрешение CREATETABLE и разрешение ALTERSCHEMA на схему, которой принадлежит новая таблица.Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

Примеры:Examples:

В следующих примерах используется база данных AdventureWorksPDW2012AdventureWorksPDW2012.The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. Использование SELECT для получения строк и столбцовUsing SELECT to retrieve rows and columns

В этом разделе приведены три примера кода.This section shows three code examples. В ходе выполнения первого примера кода возвращаются все строки (предложение WHERE не указано), а также все столбцы (используется *) таблицы 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;  

В этом примере для достижения такого же результата используется присвоение псевдонима таблице.This next example using table aliasing to achieve the same result.

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

В ходе выполнения данного примера кода возвращаются все строки (предложение WHERE не задано) и подмножества столбцов (FirstName, LastName, StartDate) таблицы DimEmployee базы данных 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. Заголовок третьего столбца переименовывается в FirstDay.The third column heading is renamed to FirstDay.

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

Этот пример возвращает только строки для DimEmployee, имеющие EndDate, не равное NULL, и MaritalStatus, равное "M" (состоит в браке).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. Использование SELECT с заголовками столбцов и вычислениямиUsing SELECT with column headings and calculations

В следующем примере возвращаются все строки из таблицы DimEmployee и вычисляется заработная плата до вычетов для каждого сотрудника на основе их BaseRate и с учетом 40-часовой рабочей недели.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. Совместное использование DISTINCT и SELECTUsing DISTINCT with SELECT

В следующем примере используется DISTINCT для создания списка всех уникальных должностей в таблице 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. Использование GROUP BYUsing GROUP BY

В следующем примере вычисляется общий объем всех продаж за каждый день.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;  

Так как в запросе используется предложение GROUP BY, то выводится только одна строка, содержащая общий объем продаж по каждому дню.Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

Д.E. Использование GROUP BY с несколькими группамиUsing GROUP BY with multiple groups

В следующем примере вычисляются значения средней цены и суммы продаж через Интернет за каждый день, сгруппированные по дате заказа и ключу продвижения.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. Использование GROUP BY и WHEREUsing GROUP BY and WHERE

В следующем примере после извлечения строк, содержащих даты заказов позднее 1 августа 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. Использование GROUP BY с выражениемUsing GROUP BY with an expression

В следующем примере производится группировка с помощью выражения.The following example groups by an expression. Группировку можно производить только с помощью выражения, не содержащего агрегатных функций.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. Использование GROUP BY с ORDER BYUsing GROUP BY with ORDER BY

В следующем примере вычисляется сумма продаж за день и выполняется поиск заказов по определенному дню.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. Использование предложения HAVINGUsing the HAVING clause

Для ограничения результатов поиска в этом запросе используется предложение HAVING.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;  

См. также:See Also

Примеры использования инструкции SELECT (Transact-SQL)SELECT Examples (Transact-SQL)
Указания (Transact-SQL)Hints (Transact-SQL)