SELECT(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウスMicrosoft Fabric の SQL データベース

SELECT ステートメントを使用して、データベースから行を取得します。 SELECT では、SQL Server データベース エンジンの 1 つまたは複数のテーブルから 1 つまたは複数の行または列を選択できます。

ステートメント SELECT 完全な構文は複雑であるため、句ごとに詳細な構文要素と引数が表示されます。 これらの句の連携方法については、「 構文 」セクションを参照してください。

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

Transact-SQL 構文表記規則

Syntax

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 および 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> ]
    [ QUALIFY <filter_condition> ]
    [ ORDER BY <order_by_expression> ]
    [ OPTION ( <query_option> [ , ...n ] ) ]

Remarks

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. QUALIFY(ごFabric Data Warehouseのみ)
  9. SELECT
  10. DISTINCT
  11. ORDER BY
  12. TOP

Warning

前のシーケンスが異なる場合は一般的ではありません。 ビューにクラスター化インデックスがあり、ビューで一部のテーブル行が除外され、ビューのSELECT列リストで、データ型を CONVERT から int に変更するが使用されるとします。このような状況では、CONVERTは、WHERE句が実行される前に実行できます。 多くの場合、ビューを変更して、別のシーケンスを回避する方法があります (問題がある場合)。

Permissions

データを選択するには、テーブルまたはビュー SELECT アクセス許可が必要です。スキーマに対する SELECT アクセス許可やテーブルに対する CONTROL アクセス許可など、より高いスコープから継承できます。 または、db_datareader または db_owner 固定データベース ロールまたは sysadmin 固定サーバー ロールのメンバーシップが必要です。 SELECT INTOを使用して新しいテーブルを作成するには、CREATE TABLE権限と、新しいテーブルを所有するスキーマに対するALTER SCHEMA権限の両方も必要です。

Examples

以下の例では、AdventureWorksPDW2022 データベースを使います。

A. SELECT を使用して行および列を取得する

このセクションでは、次の 3 つのコード例を示します。 この最初のコード例では、WHERE テーブルからすべての行 (*句が指定されていない) とすべての列 (DimEmployeeを使用) が返されます。

SELECT *
FROM DimEmployee
ORDER BY LastName;

この次の例では、テーブルのエイリアシングを使用して同じ結果を得ようとしています。

SELECT e.*
FROM DimEmployee AS e
ORDER BY LastName;

次の使用例は、WHERE データベースのFirstName テーブルからすべての行 (LastName句が指定されていない) と列のサブセット (StartDate、DimEmployee、) を返します。 3 番目の列見出しは 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 句があるため、すべての売上の合計を含む 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;