SELECT (Transact-SQL)SELECT (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database ○Azure SQL Data Warehouse ○Parallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

SQL ServerSQL Serverで、データベースから行を取得し、1 つ以上のテーブルから 1 つ以上の行または列を選択できるようにします。Retrieves rows from the database and enables the selection of one or many rows or columns from one or many tables in SQL ServerSQL Server. SELECT ステートメントの完全な構文は複雑ですが、主な句は次のとおりです。The full syntax of the SELECT statement is complex, but the main clauses can be summarized as:

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

SELECT select_list [ INTO new_table ]SELECT select_list [ INTO new_table ]

[ FROM table_source ] [ WHERE search_condition ][ FROM table_source ] [ WHERE search_condition ]

[ GROUP BY group_by_expression ][ GROUP BY group_by_expression ]

[ HAVING search_condition ][ HAVING search_condition ]

[ ORDER BY order_expression [ ASC | DESC ] ][ ORDER BY order_expression [ ASC | DESC ] ]

UNION、EXCEPT、INTERSECT 演算子をクエリ間で使用すると、クエリの結果を結合または比較して単一の結果セットにできます。The UNION, EXCEPT, and INTERSECT operators can be used between queries to combine or compare their results into one result set.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
<SELECT statement> ::=    
    [ WITH { [ XMLNAMESPACES ,] [ <common_table_expression> [,...n] ] } ]  
    <query_expression>   
    [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }   
  [ ,...n ] ]   
    [ <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 SQL Data Warehouse 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 ] ) ]  
  

RemarksRemarks

SELECT ステートメントは非常に複雑であるため、構文の構成要素と引数の詳細を句ごとに説明します。Because of the complexity of the SELECT statement, detailed syntax elements and arguments are shown by clause:

WITH XMLNAMESPACESWITH XMLNAMESPACES

WITH common_table_expressionWITH common_table_expression
HAVINGHAVING
SELECT 句SELECT Clause UNIONUNION
INTO 句INTO Clause EXCEPT および INTERSECTEXCEPT and INTERSECT
FROMFROM ORDER BYORDER BY
WHEREWHERE FOR 句FOR Clause
GROUP BYGROUP BY OPTION 句OPTION Clause

SELECT ステートメント内の句の順序は重要です。The order of the clauses in the SELECT statement is significant. オプションの句は省略できます。ただし、オプションの句を使用する場合は、適切な順序で指定する必要があります。Any one of the optional clauses can be omitted, but when the optional clauses are used, they must appear in the appropriate order.

ユーザー定義関数に SELECT ステートメントを指定できるのは、関数にとってローカルな変数に値を代入する式がステートメントの選択リストに含まれる場合だけです。SELECT statements are permitted in user-defined functions only if the select lists of these statements contain expressions that assign values to variables that are local to the functions.

サーバー名要素として OPENDATASOURCE 関数を使用する 4 部構成の名前は、SELECT ステートメント内にテーブル名を指定できる任意の場所で、テーブル ソースとして使用できます。A four-part name constructed with the OPENDATASOURCE function as the server-name part can be used as a table source wherever a table name can appear in a SELECT statement. 4 部構成の名前を Azure SQL データベースAzure SQL Database に対して指定することはできません。A four-part name cannot be specified for Azure SQL データベースAzure SQL Database.

リモート テーブルに関係する SELECT ステートメントには、構文の制約がいくつか適用されます。Some syntax restrictions apply to SELECT statements that involve remote tables.

SELECT ステートメントの論理的な処理順序Logical Processing Order of the SELECT statement

以下のステップは、SELECT ステートメントの論理的な処理順序 (バインド順序) を示しています。The following steps show the logical processing order, or binding order, for a SELECT statement. この順序によって、1 つのステップで定義されたオブジェクトが、以降のステップにおける句でいつ利用可能になるかが決まります。This order determines when the objects defined in one step are made available to the clauses in subsequent steps. たとえば、クエリ プロセッサが FROM 句で定義されているテーブルまたはビューにバインド (アクセス) できる場合、これらのオブジェクトとその列は、以降のすべてのステップで利用できます。For example, if the query processor can bind to (access) the tables or views defined in the FROM clause, these objects and their columns are made available to all subsequent steps. 逆に、SELECT 句はステップ 8 にあるので、この句で定義されているすべての列の別名と派生列は、それより前の句では参照できません。Conversely, because the SELECT clause is step 8, any column aliases or derived columns defined in that clause cannot be referenced by preceding clauses. ただし、ORDER BY 句などの後続の句で参照されていることができます。However, they can be referenced by subsequent clauses such as the ORDER BY clause. ステートメントの実際の物理的な実行は、クエリ プロセッサによって決定され、このリストでの順序とは異なる場合があります。The actual physical execution of the statement is determined by the query processor and the order may vary from this list.

  1. FROMFROM
  2. ONON
  3. JOINJOIN
  4. WHEREWHERE
  5. GROUP BYGROUP BY
  6. WITH CUBE または WITH ROLLUPWITH CUBE or WITH ROLLUP
  7. HAVINGHAVING
  8. SELECTSELECT
  9. DISTINCTDISTINCT
  10. ORDER BYORDER BY
  11. TOPTOP

警告

上記の順序は、通常は true です。The preceding sequence is usually true. ただし、一般的ではないシーケンスが異なる場合があります。However, there are uncommon cases where the sequence may differ.

たとえば、ビューにクラスター化インデックスがいくつかあり、ビューがいくつかのテーブル行を除外しており、ビューの SELECT 列リストがデータ型を varchar から integer に変更するために CONVERT を使用しているとします。For example, suppose you have a clustered index on a view, and the view excludes some table rows, and the view's SELECT column list uses a CONVERT that changes a data type from varchar to integer. このような状況では、WHERE 句が実行される前に CONVERT が実行される場合があります。In this situation, the CONVERT may execute before the WHERE clause executes. 実際に珍しいです。Uncommon indeed. これが問題となる場合、しばしばビューを変更して、異なるシーケンスを回避する方法があります。Often there is a way to modify your view to avoid the different sequence, if it matters in your case.

アクセス許可Permissions

データの選択にはテーブルまたはビューに対する SELECT 権限が必要です。この権限は、スキーマに対する SELECT 権限やテーブルに対する CONTROL 権限など上位スコープから継承されます。Selecting data requires SELECT permission on the table or view, which could be inherited from a higher scope such as SELECT permission on the schema or CONTROL permission on the table. または、db_datareader または db_owner 固定データベース ロールまたは sysadmin 固定サーバー ロールのメンバーシップが必要です。Or requires membership in the db_datareader or db_owner fixed database roles, or the sysadmin fixed server role. SELECTINTO を使用した新しいテーブルの作成には、CREATETABLE 権限、および新しいテーブルを所有するスキーマに対する ALTERSCHEMA 権限も必要です。Creating a new table using SELECTINTO also requires both the CREATETABLE permission, and the ALTERSCHEMA permission on the schema that owns the new table.

例 :Examples:

次の例では、AdventureWorksPDW2012AdventureWorksPDW2012 データベースを使用します。The following examples use the AdventureWorksPDW2012AdventureWorksPDW2012 database.

A.A. SELECT を使用して行および列を取得するUsing SELECT to retrieve rows and columns

このセクションでは、次の 3 つのコード例を示します。This section shows three code examples. 最初のコード例では、DimEmployee テーブルから、WHERE 句を指定せずにすべての行を返し、また * を使用してすべての列を返しています。This first code example returns all rows (no WHERE clause is specified) and all columns (using the *) from the DimEmployee table.

SELECT *  
FROM DimEmployee  
ORDER BY LastName;  

この次の例では、テーブルのエイリアシングを使用して同じ結果を得ようとしています。This next example using table aliasing to achieve the same result.

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

この例では、AdventureWorksPDW2012 データベース内の DimEmployee テーブルから、WHERE 句を指定せずにすべての行と、一部の列 (FirstNameLastNameStartDate) を返しています。This example returns all rows (no WHERE clause is specified) and a subset of the columns (FirstName, LastName, StartDate) from the DimEmployee table in the AdventureWorksPDW2012 database. 3 番目の列見出しは FirstDay に名前変更されています。The third column heading is renamed to FirstDay.

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

この例では、EndDate が NULL でない、MaritalStatus が 'M' (結婚している) の DimEmployee の行のみが返されます。This example returns only the rows for DimEmployee that have an EndDate that is not NULL and a MaritalStatus of 'M' (married).

SELECT FirstName, LastName, StartDate AS FirstDay  
FROM DimEmployee   
WHERE EndDate IS NOT NULL   
AND MaritalStatus = 'M'  
ORDER BY LastName;  

B.B. 列ヘッダーおよび計算処理と共に SELECT を使用するUsing SELECT with column headings and calculations

次の例では、DimEmployee テーブルのすべての行が返され、各従業員の BaseRate と週 40 時間勤務に基いた、給与総額が計算されます。The following example returns all rows from the DimEmployee table, and calculates the gross pay for each employee based on their BaseRate and a 40-hour work week.

SELECT FirstName, LastName, BaseRate, BaseRate * 40 AS GrossPay  
FROM DimEmployee  
ORDER BY LastName;  

C.C. DISTINCT を SELECT と共に使用するUsing DISTINCT with SELECT

次の例では、DISTINCT を使用し、DimEmployee テーブル内の一意のすべてのタイトルの一覧が生成されます。The following example uses DISTINCT to generate a list of all unique titles in the DimEmployee table.

SELECT DISTINCT Title  
FROM DimEmployee  
ORDER BY Title;  

D.D. GROUP BY を使用するUsing GROUP BY

次の例では、各日のすべての売上の合計金額を検索します。The following example finds the total amount for all sales on each day.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

GROUP BY 句があるため、すべての売上の合計を含む 1 つの行のみが日ごとに返されます。Because of the GROUP BY clause, only one row containing the sum of all sales is returned for each day.

E.E. GROUP BY を複数のグループと共に使用するUsing GROUP BY with multiple groups

次の例では、各日の平均価格とインターネット販売の合計を、発注日および昇格キーでグループ化して検索します。The following example finds the average price and the sum of Internet sales for each day, grouped by order date and the promotion key.


SELECT OrderDateKey, PromotionKey, AVG(SalesAmount) AS AvgSales, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey, PromotionKey  
ORDER BY OrderDateKey;   

F.F. GROUP BY と WHERE を使用するUsing GROUP BY and WHERE

次の例では、注文日が 2002 年 8 月 1 日より遅い行のみを取得した後、結果をグループ化します。The following example puts the results into groups after retrieving only the rows with order dates later than August 1, 2002.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
WHERE OrderDateKey > '20020801'  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

G.G. 1 つの式と共に GROUP BY を使用するUsing GROUP BY with an expression

次の例では、式によってグループ化します。The following example groups by an expression. 式に集計関数が含まれない限り、式によってグループ化することができます。You can group by an expression if the expression does not include aggregate functions.

SELECT SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY (OrderDateKey * 10);  

H.H. ORDER BY と共に GROUP BY を使用するUsing GROUP BY with ORDER BY

次の例では、1 日の売り上げ高と注文額の合計を検索します。The following example finds the sum of sales per day, and orders by the day.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
ORDER BY OrderDateKey;  

I.I. HAVING 句を使用するUsing the HAVING clause

このクエリは、HAVING 句を使用して結果を制限しています。This query uses the HAVING clause to restrict results.

SELECT OrderDateKey, SUM(SalesAmount) AS TotalSales  
FROM FactInternetSales  
GROUP BY OrderDateKey  
HAVING OrderDateKey > 20010000  
ORDER BY OrderDateKey;  

参照See Also

SELECT 例 (Transact-SQL)SELECT Examples (Transact-SQL)
Hints (Transact-SQL)Hints (Transact-SQL)