SELECT 句 (Transact-SQL)

クエリで返される列を指定します。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

SELECT [ ALL | DISTINCT ]
[ TOP expression [ PERCENT ] [ WITH TIES ] ] 
<select_list> 
<select_list> ::= 
    { 
      | { table_name | view_name | table_alias }.* 
      | {
          [ { table_name | view_name | table_alias }. ]
               { column_name | $IDENTITY | $ROWGUID } 
          | udt_column_name [ { . | :: } { { property_name | field_name } 
            | method_name ( argument [ ,...n] ) } ]
          | expression
          [ [ AS ] column_alias ] 
         }
      | column_alias = expression 
    } [ ,...n ] 

引数

  • ALL
    結果セットに重複した行を含むことを指定します。ALL が既定値です。
  • DISTINCT
    結果セットに一意な行のみを含むことを指定します。NULL 値は、DISTINCT キーワードにおいて等しいと見なされます。
  • TOP expression [ PERCENT ] [ WITH TIES ]
    クエリの結果セットから、指定された最初の行セットまたは比率 (%) に相当する行だけが返されることを示します。expression は行数または行の比率 (%) にすることができます。

    TOP 句は SELECT、INSERT、UPDATE、および DELETE ステートメントで使用できます。INSERT、UPDATE、および DELETE の各ステートメントで TOP を使用する場合は、expression を区切るかっこが必要です。旧バージョンとの互換性を維持するため、SELECT ステートメント内でかっこを使用しないで TOP expression を使用する方法もサポートされていますが、この方法は推奨されていません。詳細については、「TOP (Transact-SQL)」を参照してください。

  • < select_list >
    結果セットに選択される列です。選択リストは、コンマで区切られた一連の式です。選択リストに指定できる式の最大数は、4,096 です。
  • *
    FROM 句内のすべてのテーブルおよびビューの、すべての列を返すことを指定します。列は、FROM 句に指定されているテーブルまたはビューの順に、テーブルまたはビュー内に並んでいる順序で返されます。
  • table_ name| view_ name| table_ alias.*
    * のスコープを、指定したテーブルまたはビューに限定します。
  • column_ name
    返される列の名前です。FROM 句内の 2 つのテーブルに同じ名前の列がある場合などに参照先が混乱しないように、column_name を修飾します。たとえば、AdventureWorks データベース内の SalesOrderHeader テーブルおよび SalesOrderDetail テーブルの両方に ModifiedDate という名前の列があります。クエリでこれら 2 つのテーブルを結合した場合、SalesOrderDetail エントリの変更日付を選択リストで SalesOrderDetail.ModifiedDate として指定できます。
  • expression
    定数、関数、または列名、定数、関数を演算子で組み合わせたもの、あるいはサブクエリを指定します。
  • $ROWGUID
    行 GUID 列を返します。

    FROM 句内の複数のテーブルが ROWGUIDCOL プロパティを持つ場合は、T1.$ROWGUID などのように、$ROWGUID を指定のテーブル名で修飾する必要があります。

  • udt_column_name
    返される共通言語ランタイム (CLR) ユーザー定義型列の名前です。

    ms176104.note(ja-jp,SQL.90).gifメモ :
    SQL Server Management Studio は、ユーザー定義型の値をバイナリ表記で返します。ユーザー定義型の値を文字列または XML 形式で返すには、CAST または CONVERT を使用します。
  • { . | :: }
    CLR ユーザー定義型のメソッド、プロパティ、またはフィールドを指定します。(静的ではない) インスタンス メソッド、プロパティ、またはフィールドに対しては . を使用します。静的なメソッド、プロパティ、またはフィールドに対しては :: を使用します。CLR ユーザー定義型のメソッド、プロパティ、またはフィールドを呼び出すには、その型に対する EXECUTE 権限が必要です。
  • property_name
    udt_column_name のパブリック プロパティを指定します。
  • field_name
    udt_column_name のパブリック データ メンバを指定します。
  • method_name
    1 つ以上の引数をとる udt_column_name のパブリック メソッドを指定します。method_name をミューテータ メソッドにすることはできません。

    次の例では、Distance という名前のメソッドを呼び出すことにより、point 型として定義されている Location 列に対する値を Cities テーブルから選択します。

    CREATE TABLE Cities (
         Name varchar(20),
         State varchar(20),
         Location point );
    GO
    DECLARE @p point (32, 23), @distance float
    GO
    SELECT Location.Distance (@p)
    FROM Cities;
    
  • column_ alias
    クエリの結果セット内の列名を置き換える別名です。たとえば、quantity という名前の列に対して、QuantityQuantity to DateQty などの別名を指定できます。

    別名を使用して、式の結果の名前を指定することもできます。たとえば、次のようにします。

    USE AdventureWorks;

    GO

    SELECT AVG(UnitPrice) AS 'Average Price'

    FROM Sales.SalesOrderDetail;

    column_alias は、ORDER BY 句の中で使用できます。ただし、WHERE 句、GROUP BY 句、または HAVING 句の中では使用できません。クエリ式が DECLARE CURSOR ステートメントに含まれている場合、FOR UPDATE 句の中で column_alias を使用することはできません。

解説

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

ユーザー定義関数に SELECT ステートメントを指定できるのは、関数にとってローカルな変数に値を代入する式がステートメントの選択リストに含まれる場合だけです。

OPTION 句はビューでは使用できません。

table 変数は、そのスコープ内では通常のテーブルのようにアクセスできるので、SELECT ステートメントの中でテーブル ソースとして使用できます。

サーバー名要素として OPENDATASOURCE 関数を使用する 4 部構成の名前は、SELECT ステートメント内にテーブル名を指定できる任意の場所で、テーブル ソースとして使用できます。

リモート テーブルに関係する SELECT ステートメントには、いくつかの構文の制約が適用されます。詳細については、「分散クエリを使用する場合のガイドライン」を参照してください。

選択リストに含まれる text または ntext 列に対して返されるデータの長さは、text 列の実際のサイズ、既定の TEXTSIZE セッションの設定値、またはハードコーディングされたアプリケーションの制限値のうちの最小値に設定されます。セッション用に、返されるテキストの長さを変更するには、SET ステートメントを使ってください。既定では、SELECT ステートメントが返すテキスト データの長さの制限は 4,000 バイトです。

次の動作のいずれかが発生した場合、SQL Server 2005 データベース エンジンでは例外 511 が発生し、現在実行中のステートメントがロールバックされます。

  • SELECT ステートメントで、8,060 バイトを超える結果行または中間作業テーブル行を生成した場合
  • DELETE、INSERT、または UPDATE ステートメントを、8,060 バイトを超える行で実行しようとした場合

SELECT INTO ステートメントまたは CREATE VIEW ステートメントで作成された列に列名が付いていない場合は、エラーが発生します。

ID 列の選択

既存の ID 列が新しいテーブルに選択された場合は、次の条件のいずれかが満たされている場合を除き、新しい列には IDENTITY プロパティが継承されます。

  • SELECT ステートメントに、結合、GROUP BY 句、集計関数のいずれかが含まれている。
  • 複数の SELECT ステートメントが UNION を使用して結合されている。
  • ID 列が選択リストに 2 回以上指定されている。
  • ID 列が式の一部である。

これらの条件が 1 つでも満たされている場合は、列に IDENTITY プロパティは継承されず、代わりに NOT NULL として作成されます。ID 列のルールや制限は、すべて新しいテーブルに適用されます。

旧式の外部結合

旧バージョンの SQL Server では、WHERE 句内で *= 演算子と =* 演算子を使用する外部結合の定義をサポートしています。SQL Server Version 7.0 は SQL-92 標準をサポートしています。これによって FROM 句内の結合演算子が提供されます。データベースの互換性レベルが 90 に設定されている場合、外部結合演算子 (*= と =*) はサポートされません。

WHERE、GROUP BY、および HAVING 句の処理順序

次の手順では、WHERE 句、GROUP BY 句、および HAVING 句付きの SELECT ステートメントの処理順序を示します。

  1. FROM 句が初期結果セットを返します。
  2. WHERE 句が、その検索条件に合わない行を除外します。
  3. GROUP BY 句が、選択された行を GROUP BY 句内の一意な値ごとに 1 つのグループに集めます。
  4. 選択リストに指定された集計関数では、それぞれのグループに対して集計値を計算します。
  5. HAVING 句が、その検索条件に合わない行をさらに除外します。

権限

固定サーバー ロール sysadmin、固定データベース ロール db_ownerdb_datareader のメンバシップと、テーブルの所有権が必要です。sysadmindb_owner、および db_securityadmin ロールのメンバ、およびテーブル所有者は、他のユーザーに権限を譲渡できます。

INTO 句を使ってパーマネント テーブルを作成する場合は、ユーザーは出力先のデータベース内での CREATE TABLE 権限を持っている必要があります。

参照

関連項目

CONTAINS (Transact-SQL)
CONTAINSTABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
CREATE VIEW (Transact-SQL)
DELETE (Transact-SQL)
EXECUTE (Transact-SQL)
式 (Transact-SQL)
FREETEXT (Transact-SQL)
FREETEXTTABLE (Transact-SQL)
INSERT (Transact-SQL)
SET TRANSACTION ISOLATION LEVEL (Transact-SQL)
table (Transact-SQL)
UNION (Transact-SQL)
UPDATE (Transact-SQL)
EXCEPT および INTERSECT (Transact-SQL)
WHERE (Transact-SQL)

その他の技術情報

フルテキスト検索クエリ
結合の基礎
サブクエリの基礎
変数とパラメータの使用 (データベース エンジン)
オブジェクト名としての識別子の使用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手