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 выражение_группирования ]

[ HAVING условие_поиска ]

[ ОКНО window_expression ]

[ 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 и аргументы отображаются для каждого предложения:

Порядок предложений в SELECT инструкции имеет важное значение. Любое из необязательных предложений может быть опущено; но если необязательные предложения используются, они должны следовать в определенном порядке.

SELECT операторы разрешены в определяемых пользователем функциях, только если списки выбора этих инструкций содержат выражения, которые назначают значения переменным, которые являются локальными для функций.

Четырехкомпонентное имя, созданное с помощью функции в OPENDATASOURCE качестве части имени сервера, можно использовать в качестве источника таблицы, где имя таблицы может отображаться в инструкции SELECT . Для База данных SQL Azure нельзя указать четырехкомпонентное имя.

Некоторые ограничения синтаксиса применяются к SELECT операторам, включающим удаленные таблицы.

Порядок логической обработки инструкции SELECT

В следующих шагах показано порядок логической обработки или порядок привязки для инструкции SELECT . Этот порядок определяет, когда объекты, определенные в одном шаге, становятся доступными для предложений в последующих шагах. Например, если обработчик запросов может привязаться к таблицам или представлениям, определенным в FROM предложении, эти объекты и их столбцы становятся доступными для всех последующих шагов. И наоборот, поскольку предложение SELECT является шагом 8, любые псевдонимы столбцов или производные столбцы, определенные в этом предложении, не могут ссылаться на предыдущие предложения. Однако их можно ссылаться на последующие предложения, такие как ORDER BY предложение. Обработчик запросов определяет фактическое физическое выполнение инструкции, а порядок может отличаться от этого списка.

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. WITH CUBE или WITH ROLLUP
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. 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;