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 выражение_упорядочения [ ASC | DESC ] ]
Операторы UNION, EXCEPT и INTERSECT можно использовать между запросами для объединения или сравнения результатов в одном результирующем наборе.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис для SQL Server и Базы данных SQL Azure:
<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:
[ 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 ] ) ]
Замечания
Из-за сложности инструкции подробные элементы синтаксиса SELECT
и аргументы отображаются для каждого предложения:
- WITH XMLNAMESPACES
- HAVING
- WITH <обобщенное_табличное_выражение>
- UNION
- Предложение SELECT
- EXCEPT и INTERSECT
- Предложение INTO
- ORDER BY
- FROM
- Предложение FOR
- WHERE
- Предложение OPTION
- GROUP BY
Порядок предложений в 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 на int. В этой ситуации 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
таблицы в базе данных AdventureWorksPDW2022. Заголовок третьего столбца переименовывается в 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;