SELECT ステートメントの構成要素

SELECT ステートメントの完全な構文は複雑ですが、主な句は次のとおりです。

SELECT select_list

[ INTO new_table_name ]

FROM table_list

[ WHERE search_conditions ]

[ GROUP BY group_by_list ]

[ HAVING search_conditions ]

[ ORDER BY order_list [ ASC | DESC ] ]

  • select_list
    結果セットの列を指定します。複数の式をコンマ区切りで指定します。式ごとに結果セット列の形式 (データ型とサイズ) とデータ ソースを定義します。通常、各選択リスト式は、データ ソースのテーブルまたはビュー内の列を参照しますが、定数や Transact-SQL 関数など、それ以外の式を使用することもできます。選択リストで * を使用すると、ソース テーブル内のすべての列が返されます。

  • INTO new_table_name
    結果セットを使用して新しいテーブルを作成することを指定します。new_table_name の部分には新しいテーブルの名前を指定します。

  • FROM table_list
    結果セット データの検索対象テーブルのリストを指定します。検索対象として指定できるテーブルは、次のとおりです。

    • SQL Server を実行しているローカル サーバー内のベース テーブル。

    • SQL Server のローカル インスタンスのビュー。SQL Server により、ビュー参照は、ビューを構成するベース テーブルへの参照に内部で解決されます。

    • リンク テーブル。これは、SQL Server からアクセスできる OLE DB データ ソースのテーブルです。分散クエリとも呼ばれます。SQL Server から OLE DB データ ソースにアクセスするには、リンク サーバーとしてリンクするか、または OPENROWSET 関数か OPENQUERY 関数でデータ ソースを参照します。

    FROM 句には、結合指定を含めることもできます。結合指定は、テーブル間を移動する場合に SQL Server で特定のパスが使用されるように定義します。

    FROM 句は、DELETE ステートメントや UPDATE ステートメントで、変更対象のテーブルを定義する際にも使用されます。

  • WHERE search_conditions
    WHERE 句は、ソース テーブル内の各行が SELECT ステートメントで選択される条件を定義するフィルターです。この条件を満たす行のデータだけが結果セットに含められます。条件を満たしていない行のデータは使用されません。

    WHERE 句は、DELETE ステートメントや UPDATE ステートメントで、変更対象のテーブル行を定義する際にも使用されます。

  • GROUP BY group_by_list
    GROUP BY 句は、group_by_list 列の値に基づいて、結果セットをグループに分割します。たとえば、AdventureWorks2008R2 の Sales.SalesOrderHeader テーブルの TerritoryID には、10 個の値があります。GROUP BY TerritoryID 句では、TerritoryID の各値に基づいて、結果セットが 10 個のグループに分割されます。

  • HAVING search_conditions
    HAVING 句は、結果セットに適用される追加フィルターです。論理的には、HAVING 句では、SELECT ステートメントの FROM 句、WHERE 句、または GROUP BY 句により作成された中間結果セットの行がフィルター選択されます。HAVING 句の前に GROUP BY 句を使用する必要はありませんが、通常、HAVING 句は GROUP BY 句と組み合わせて使用します。

  • ORDER BY order_list[ ASC | DESC ]
    ORDER BY 句は、結果セット内の行を並べ替える順序を定義します。order_list には、並べ替えリストを構成する結果セットの列を指定します。ASC キーワードと DESC キーワードは、行を昇順または降順のどちらで並べ替えるかを指定します。

    リレーショナル理論では、ORDER BY 句を指定しないと結果セット内の行がなんらかの順序に従っていると見なすことができないので、ORDER BY 句の指定は重要です。結果セットの行の順番が重要な SELECT ステートメントでは、ORDER BY 句を使用する必要があります。

SELECT ステートメント内の句は、正しい順序で指定する必要があります。

データベース オブジェクトの参照は明確にする必要があります。次のような場合には、参照があいまいになることがあります。

  • システム内に同じ名前のオブジェクトが複数個ある場合。たとえば、Schema1 と Schema2 の両方に、TableX という名前のテーブルがあるとします。あいまいさを解決し、Schema1 で所有される TableX を指定するには、テーブル名を少なくともスキーマ名で修飾します。

    SELECT *
    FROM Schema1.TableX;
    
  • SELECT ステートメントの実行時、オブジェクトが存在するデータベースが必ずしも現在のデータベースでない場合。現在のデータベース設定に関係なく、必ず適切なオブジェクトが使用されるようにするには、オブジェクト名をデータベース名とスキーマ名で修飾します。

    SELECT *
    FROM AdventureWorks2008R2.Purchasing.ShipMethod;
    
  • FROM 句で指定したテーブルやビューに同じ列名がある場合。往々にして、外部キーは関連する主キーと同じ列名を持つことがあります。重複する名前のあいまいさを解決するには、次に示すように列名をテーブル名かビュー名で修飾します。

    SELECT DISTINCT Sales.Customer.CustomerID, Sales.Store.Name
    FROM Sales.Customer 
    JOIN Sales.Store ON Sales.Customer.CustomerID = Sales.Store.BusinessEntityID
    WHERE Sales.Customer.TerritoryID = 1;
    

    テーブル名とビュー名の両方を完全に修飾する必要がある場合、この構文は複雑になります。この問題は、FROM 句で AS キーワードを使用してテーブルに相関名 (範囲変数または別名とも呼ばれています) を割り当てて解決できます。完全修飾テーブル名またはビュー名を指定する必要があるのは、FROM 句だけです。それ以外のテーブル参照やビュー参照では、相関名を使用できます。上記の例でテーブルの相関名と完全修飾名を使用すると、次の SELECT ステートメントになります。

    SELECT DISTINCT c.CustomerID, s.Name
    FROM Sales.Customer AS c
    JOIN Sales.Store AS s ON c.CustomerID = s.BusinessEntityID
    WHERE c.TerritoryID = 1;
    

オブジェクトの修飾の詳細については、「識別子」を参照してください。

SQL Server オンライン ブックの Transact-SQL 例の多くは、簡略化され、修飾名が使用されていません。読みやすくするために、これらの要素を省略していますが、実稼働システムの Transact-SQL ステートメントでは修飾名を使用することをお勧めします。