SELECT (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric Хранилище в Microsoft Fabric
Извлекает строки из базы данных и включает выбор одной или нескольких строк или столбцов из одной или нескольких таблиц в SQL Server. Полный синтаксис инструкции SELECT сложен, однако основные предложения можно вкратце описать следующим образом:
[ WITH { [ XMLNAMESPACES,] [ <common_table_expression> ] } ]
SELECT выбранный_список [ INTO новая_таблица ]
[ FROM источник_таблицы ] [ WHERE условие_поиска ]
[ GROUP BY выражение_группирования ]
[ ORDER BY order_expression [ ASC | DESC ]]
Операторы UNION, EXCEPT и INTERSECT можно использовать между запросами, чтобы сравнить их результаты или объединить в один результирующий набор.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server и базы данных SQL Azure
-- 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 > ]
Синтаксис для Azure Synapse Analytics и параллельного хранилища данных и Microsoft Fabric
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse and Microsoft Fabric
[ 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 ] ) ]
Примечание.
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Замечания
Учитывая сложность инструкции SELECT, элементы ее синтаксиса и аргументы подробно представлены в предложении:
Порядок предложений в инструкции SELECT имеет значение. Любое из необязательных предложений может быть опущено; но если необязательные предложения используются, они должны следовать в определенном порядке.
Инструкции SELECT разрешено использовать в определяемых пользователем функциях только в том случае, если списки выбора этих инструкций содержат выражения, которые присваивают значения переменным, локальным для функций.
Четырехкомпонентное имя, использующее функцию OPENDATASOURCE в качестве части имени сервера, может служить в качестве исходной таблицы в любом месте инструкции SELECT, где может появляться имя таблицы. Для База данных SQL Azure нельзя указать четырехкомпонентное имя.
Для инструкций SELECT, которые задействуют удаленные таблицы, существуют некоторые ограничения на синтаксис.
Порядок логической обработки инструкции SELECT
Следующие действия демонстрируют логический порядок обработки или порядок привязки инструкции SELECT. Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах. Например, если обработчик запросов можно привязать (для доступа) к таблицам или представлениям, определенным в предложении FROM, эти объекты и их столбцы становятся доступными для всех последующих шагов. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производных столбцов, определенные в этом предложении, не могут быть объектом для ссылки предыдущих предложений. Вместе с тем к ним могут обращаться последующие предложения, например предложение ORDER BY. Фактическое физическое выполнение инструкции определяется обработчиком запросов, и порядок может отличаться от этого списка.
FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE
илиWITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Предупреждение
Как правило, применяется предыдущая последовательность. Однако существуют редкие случаи, когда последовательность может отличаться.
Например, предположим, что в представлении есть кластеризованный индекс, а представление исключает некоторые строки таблицы, а список столбцов представления SELECT
использует CONVERT
тип данных из varchar в целое число. В этой ситуации CONVERT
можно выполнить до WHERE
выполнения предложения. Это нестандартное поведение. Если это имеет значение в вашем случае, можно изменить представление, чтобы исключить использование другой последовательности.
Разрешения
Для выборки данных требуется разрешение SELECT на таблицу или представление, которое может быть унаследовано из области более высокого уровня, например разрешение SELECT на схему или разрешение CONTROL на таблицу. Или необходимо быть членом предопределенных ролей базы данных db_datareader или db_owner либо предопределенной роли сервера sysadmin. Для создания новой таблицы SELECT INTO
также требуется разрешение CREATE TABLE , а также разрешение ALTER SCHEMA на схему, которая владеет новой таблицей.
Примеры
В следующих примерах используется база данных AdventureWorksPDW2022 .
А. Использование SELECT для получения строк и столбцов
В этом разделе приведены три примера кода. В ходе выполнения первого примера кода возвращаются все строки (предложение WHERE не указано), а также все столбцы (используется *
) таблицы DimEmployee
.
SELECT *
FROM DimEmployee
ORDER BY LastName;
В этом примере для достижения такого же результата используется присвоение псевдонима таблице.
SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;
В ходе выполнения данного примера кода возвращаются все строки (предложение WHERE не задано) и подмножества столбцов (FirstName
, LastName
, StartDate
) таблицы DimEmployee
базы данных AdventureWorksPDW2012
. Заголовок третьего столбца переименовывается в FirstDay
.
SELECT FirstName, LastName, StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
Этот пример возвращает только строки для DimEmployee
, имеющие EndDate
, не равное NULL, и MaritalStatus
, равное "M" (состоит в браке).
SELECT FirstName, LastName, StartDate AS FirstDay
FROM DimEmployee
WHERE EndDate IS NOT NULL
AND MaritalStatus = 'M'
ORDER BY LastName;
B. Использование SELECT с заголовками столбцов и вычислениями
В следующем примере возвращаются все строки из таблицы DimEmployee
и вычисляется заработная плата до вычетов для каждого сотрудника на основе их BaseRate
и с учетом 40-часовой рабочей недели.
SELECT FirstName, LastName, BaseRate, BaseRate * 40 AS GrossPay
FROM DimEmployee
ORDER BY LastName;
C. Использование DISTINCT с SELECT
В следующем примере используется DISTINCT
для создания списка всех уникальных должностей в таблице DimEmployee
.
SELECT DISTINCT Title
FROM DimEmployee
ORDER BY Title;
D. Использование GROUP BY
В следующем примере вычисляется общий объем всех продаж за каждый день.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
Так как в запросе используется предложение GROUP BY
, то выводится только одна строка, содержащая общий объем продаж по каждому дню.
Е. Использование GROUP BY с несколькими группами
В следующем примере вычисляются значения средней цены и суммы продаж через Интернет за каждый день, сгруппированные по дате заказа и ключу продвижения.
SELECT OrderDateKey, PromotionKey, AVG(SalesAmount) AS AvgSales, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey, PromotionKey
ORDER BY OrderDateKey;
F. Использование GROUP BY и WHERE
В следующем примере после извлечения строк, содержащих даты заказов позднее 1 августа 2002 г., происходит их разделение на группы.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
G. Использование GROUP BY с выражением
В следующем примере производится группировка с помощью выражения. Группировку можно производить только с помощью выражения, не содержащего агрегатных функций.
SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);
H. Использование GROUP BY с ORDER BY
В следующем примере вычисляется сумма продаж за день и выполняется поиск заказов по определенному дню.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
I. Использование предложения HAVING
Для ограничения результатов поиска в этом запросе используется предложение HAVING
.
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY OrderDateKey
HAVING OrderDateKey > 20010000
ORDER BY OrderDateKey;