SELECT (Transact-SQL)
適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Microsoft Fabric の SQL エンドポイント
Microsoft Fabric のウェアハウス
SQL Serverで、データベースから行を取得し、1 つ以上のテーブルから 1 つ以上の行または列を選択できるようにします。 SELECT ステートメントの完全な構文は複雑ですが、主な句は次のとおりです。
[ WITH { [ XMLNAMESPACES ,][ <common_table_expression> ] } ]
SELECT select_list [ INTO new_table ]
[ FROM table_source ] [ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ ORDER BY order_expression [ ASC | DESC ]]
UNION、EXCEPT、INTERSECT 演算子をクエリ間で使用すると、クエリの結果を結合または比較して単一の結果セットにできます。
構文
-- 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 ] ) ]
Note
SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
解説
SELECT ステートメントは非常に複雑であるため、構文の構成要素と引数の詳細を句ごとに説明します。
SELECT ステートメント内の句の順序は重要です。 オプションの句は省略できます。ただし、オプションの句を使用する場合は、適切な順序で指定する必要があります。
ユーザー定義関数に SELECT ステートメントを指定できるのは、関数にとってローカルな変数に値を代入する式がステートメントの選択リストに含まれる場合だけです。
サーバー名要素として OPENDATASOURCE 関数を使用する 4 部構成の名前は、SELECT ステートメント内にテーブル名を指定できる任意の場所で、テーブル ソースとして使用できます。 4 部構成の名前を Azure SQL データベース に対して指定することはできません。
リモート テーブルに関係する SELECT ステートメントには、構文の制約がいくつか適用されます。
SELECT ステートメントの論理的な処理順序
以下のステップは、SELECT ステートメントの論理的な処理順序 (バインド順序) を示しています。 この順序によって、1 つのステップで定義されたオブジェクトが、以降のステップにおける句でいつ利用可能になるかが決まります。 たとえば、クエリ プロセッサが FROM 句で定義されているテーブルまたはビューにバインド (アクセス) できる場合、これらのオブジェクトとその列は、以降のすべてのステップで利用できます。 逆に、SELECT 句はステップ 8 にあるので、この句で定義されているすべての列の別名と派生列は、それより前の句では参照できません。 ただし、ORDER BY 句などの後続の句で参照されていることができます。 ステートメントの実際の物理的な実行は、クエリ プロセッサによって決定され、このリストでの順序とは異なる場合があります。
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE または WITH ROLLUP
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- TOP
警告
上記の順序は、通常は true です。 ただし、一般的ではないシーケンスが異なる場合があります。
たとえば、ビューにクラスター化インデックスがいくつかあり、ビューがいくつかのテーブル行を除外しており、ビューの SELECT 列リストがデータ型を varchar から integer に変更するために CONVERT を使用しているとします。 このような状況では、WHERE 句が実行される前に CONVERT が実行される場合があります。 実際に珍しいです。 これが問題となる場合、しばしばビューを変更して、異なるシーケンスを回避する方法があります。
アクセス許可
データの選択にはテーブルまたはビューに対する SELECT 権限が必要です。この権限は、スキーマに対する SELECT 権限やテーブルに対する CONTROL 権限など上位スコープから継承されます。 または、db_datareader または db_owner 固定データベース ロールまたは sysadmin 固定サーバー ロールのメンバーシップが必要です。 SELECT INTO を使用した新しいテーブルの作成には、CREATE TABLE 権限、および新しいテーブルを所有するスキーマに対する ALTER SCHEMA 権限も必要です。
例 :
以下の例では、AdventureWorksPDW2022 データベースを使います。
A. SELECT を使用して行および列を取得する
このセクションでは、次の 3 つのコード例を示します。 最初のコード例では、DimEmployee
テーブルから、WHERE 句を指定せずにすべての行を返し、また *
を使用してすべての列を返しています。
SELECT *
FROM DimEmployee
ORDER BY LastName;
この次の例では、テーブルのエイリアシングを使用して同じ結果を得ようとしています。
SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;
この例では、AdventureWorksPDW2012
データベース内の DimEmployee
テーブルから、WHERE 句を指定せずにすべての行と、一部の列 (FirstName
、LastName
、StartDate
) を返しています。 3 番目の列見出しは FirstDay
に名前変更されています。
SELECT FirstName, LastName, StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
この例では、EndDate
が NULL でない、MaritalStatus
が 'M' (結婚している) の DimEmployee
の行のみが返されます。
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
句があるため、すべての売上の合計を含む 1 つの行のみが日ごとに返されます。
E. 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 を使用する
次の例では、注文日が 2002 年 8 月 1 日より遅い行のみを取得した後、結果をグループ化します。
SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
WHERE OrderDateKey > '20020801'
GROUP BY OrderDateKey
ORDER BY OrderDateKey;
G. 1 つの式と共に GROUP BY を使用する
次の例では、式によってグループ化します。 式に集計関数が含まれない限り、式によってグループ化することができます。
SELECT SUM(SalesAmount) AS TotalSales
FROM FactInternetSales
GROUP BY (OrderDateKey * 10);
H. ORDER BY と共に GROUP BY を使用する
次の例では、1 日の売り上げ高と注文額の合計を検索します。
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;