SELECT (Transact-SQL)
Applies to: 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
ステートメントの完全な構文は複雑ですが、main 句は次のように要約できます。
[ 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 演算子を使用して、結果を 1 つの結果セットに結合または比較できます。
構文
SQL Server と 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 および Parallel Data Warehouse および 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 common_table_expression
- UNION
- SELECT 句
- EXCEPT および INTERSECT
- INTO 句
- ORDER BY
- FROM
- FOR 句
- WHERE
- OPTION 句
- GROUP BY
SELECT
ステートメントの句の順序は重要です。 オプションの句は省略できます。ただし、オプションの句を使用する場合は、適切な順序で指定する必要があります。
SELECT
ステートメントは、これらのステートメントの select リストに関数にローカルな変数に値を割り当てる式が含まれている場合にのみ、ユーザー定義関数で使用できます。
OPENDATASOURCE
関数を使用して作成された 4 部構成の名前は、SELECT
ステートメントでテーブル名を指定できる場所であれば、テーブル ソースとして使用できます。 Azure SQL Database には 4 部構成の名前を指定できません。
一部の構文制限は、リモート テーブルを含む 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
警告
前のシーケンスが異なる場合は一般的ではありません。 ビューにクラスター化インデックスがあり、ビューで一部のテーブル行が除外され、ビューのSELECT
列リストで、データ型を varchar から int に変更するCONVERT
が使用されるとします。このような状況では、CONVERT
は、WHERE
句が実行される前に実行できます。 多くの場合、ビューを変更して、別のシーケンスを回避する方法があります (問題がある場合)。
アクセス許可
データを選択するには、テーブルまたはビュー 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;
次の使用例は、AdventureWorksPDW2022 データベースのDimEmployee
テーブルからすべての行 (WHERE
句が指定されていない) と列のサブセット (FirstName
、LastName
、StartDate
) を返します。 3 番目の列見出しは FirstDay
に名前変更されています。
SELECT FirstName,
LastName,
StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;
次の使用例は、NULL
ではないEndDate
とM
(結婚) のMaritalStatus
を持つ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;