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

結果セット データの検索対象テーブルをすべて表示します。対象になるテーブルは以下のとおりです。

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

  • ローカル SQL Server 内のビュー。SQL Server はビュー参照をビューを構成するベース テーブルへの参照に内部で解決します。

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

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

    FROM 句を DELETE ステートメントや UPDATE ステートメントで使用して、変更対象のテーブルを定義することもできます。

WHERE search_conditions

WHERE 句は、元のテーブル内の各行が SELECT 対象になるための条件を定義するフィルタです。この条件を満たす行のデータだけが結果セットのデータになります。条件を満たしていない行のデータは使用されません。

WHERE 句を DELETE ステートメントや UPDATE ステートメントで使用して、変更対象のテーブル行を定義することもできます。

GROUP BY group_by_list

GROUP BY 句は、group_by_list の列値に基づいて結果セットをグループに分割します。たとえば、Northwind Orders テーブルの ShipVia には 3 つの値があります。GROUP BY ShipVia 句は、ShipVia の値ごとに結果セットを分割し、3 つのグループにします。

HAVING search_conditions

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

ORDER BY order_list [ ASC | DESC ]

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

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

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

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

  • システム内に同じ名前のオブジェクトが複数個ある場合。たとえば、User1User2 のどちらも TableX というテーブルを定義していることがあります。あいまいさを取り除き、User1 が所有する TableX を指定するには、テーブル名を少なくともユーザー ID で修飾します。
    SELECT *
    FROM User1.TableX
    
  • SELECT ステートメントを実行したときに、オブジェクトが存在するデータベースが必ずしも現在のデータベースでない場合。現在のデータベース設定に関係なく、適切なオブジェクトを使用するには、オブジェクト名をデータベース名と所有者名で修飾します。
    SELECT *
    FROM Northwind.dbo.Shippers
    
  • FROM 句で指定したテーブルやビューに同じ列名がある場合。たとえば、外部キーは関連した主キーと同じ列名を持つことがあります。どちらを指すか明確にするには、列名をテーブル名かビュー名で修飾します。
    SELECT DISTINCT Customers.CustomerID, Customers.CompanyName
    FROM Customers JOIN Orders ON
           ( Customers.CustomerID = Orders.CustomerID)
    WHERE Orders.ShippedDate > 'May 1 1998'
    

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

    SELECT DISTINCT Cst.CustomerID, Cst.CompanyName
    FROM Northwind.dbo.Customers AS Cst
       JOIN
         Northwind.dbo.Orders AS Ord
       ON ( Cst.CustomerID = Ord.CustomerID)
    WHERE Ord.ShippedDate > 'May 1 1998'
    

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

SQL Server Books Online の Transact-SQL 例の多くは修飾名を使用していないので簡略になっています。読みやすくするためこれらの要素を省いています。ただし、実稼働システムの Transact-SQL ステートメントでは修飾名を使用することをお勧めします。

関連項目

表示: