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 ]

[ HAVING search_condition ]

[ WINDOW window_expression ]

[ ORDER BY order_expression [ ASC | DESC ]]

クエリ間で UNIONEXCEPT、および INTERSECT 演算子を使用して、結果を 1 つの結果セットに結合または比較できます。

Transact-SQL 構文表記規則

構文

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 ステートメントは複雑であるため、句ごとに詳細な構文要素と引数が表示されます。

SELECT ステートメントの句の順序は重要です。 オプションの句は省略できます。ただし、オプションの句を使用する場合は、適切な順序で指定する必要があります。

SELECT ステートメントは、これらのステートメントの select リストに関数にローカルな変数に値を割り当てる式が含まれている場合にのみ、ユーザー定義関数で使用できます。

OPENDATASOURCE関数を使用して作成された 4 部構成の名前は、SELECT ステートメントでテーブル名を指定できる場所であれば、テーブル ソースとして使用できます。 Azure SQL Database には 4 部構成の名前を指定できません。

一部の構文制限は、リモート テーブルを含む SELECT ステートメントに適用されます。

SELECT ステートメントの論理的な処理順序

次の手順では、 SELECT ステートメントの論理処理順序 (バインド順序) を示します。 この順序によって、1 つのステップで定義されたオブジェクトが、以降のステップにおける句でいつ利用可能になるかが決まります。 たとえば、クエリ プロセッサが 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列リストで、データ型を 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句が指定されていない) と列のサブセット (FirstNameLastNameStartDate) を返します。 3 番目の列見出しは FirstDay に名前変更されています。

SELECT FirstName,
       LastName,
       StartDate AS FirstDay
FROM DimEmployee
ORDER BY LastName;

次の使用例は、NULLではないEndDateM (結婚) の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;