SELECT (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в Microsoft Fabric

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

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

SELECT выбранный_список [ INTO новая_таблица ]

[ FROM источник_таблицы ] [ WHERE условие_поиска ]

[ GROUP BY выражение_группирования ]

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

[ WINDOW выражение_окна]

[ ORDER BY order_expression [ ASC | DESC ]]

Операторы UNION, EXCEPT и INTERSECT можно использовать между запросами, чтобы сравнить их результаты или объединить в один результирующий набор.

Соглашения о синтаксисе Transact-SQL

Синтаксис

-- 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 > ]   
-- Syntax for Azure Synapse Analytics 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 ] ) ]  
  

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Замечания

Учитывая сложность инструкции SELECT, элементы ее синтаксиса и аргументы подробно представлены в предложении:

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

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

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

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

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

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

  1. FROM
  2. DNS
  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 на integer. В этом случае 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;  

См. также

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