すべての列の選択
アスタリスク (*) は、SELECT ステートメント内で次のような特別な意味を持ちます。
修飾子を付けないで指定した場合、アスタリスク (*) は FROM 句で指定したすべてのテーブルまたはビュー内のすべての列を参照していると解釈されます。次の例では、Product テーブルに格納されているすべての製品情報を取得します。
USE AdventureWorks2008R2; GO SELECT * FROM Production.Product ORDER BY Name; GO
テーブル名またはビュー名で修飾した場合、アスタリスク (*) はテーブルまたはビュー内のすべての列を参照していると解釈されます。次の例では、アスタリスクを使用して Product テーブル内のすべての列を参照します。
USE AdventureWorks2008R2; GO SELECT s.UnitPrice, p.* FROM Production.Product p JOIN Sales.SalesOrderDetail s ON (p.ProductID = s.ProductID) ORDER BY p.ProductID; GO
アスタリスク (*) を使用した場合、結果セットの列の順序は CREATE TABLE、ALTER TABLE、または CREATE VIEW ステートメントで指定した順序と同じになります。
SELECT * を使用すると、現在テーブル内にあるすべての列が検索されます。そのため、SELECT * ステートメントを実行するたびに、テーブル構造の変更 (列の追加、削除、または列名の変更) が自動的に反映されます。
結果セット内の列数に依存したロジックを使用するアプリケーションまたはスクリプトで SELECT ステートメントを使用する場合は、アスタリスクを指定するのではなく、選択リストですべての列を指定することをお勧めします。SELECT ステートメントで参照しているテーブルまたはビューに後で列を追加した場合、列が個々に指定されていれば、アプリケーションはテーブル構造の変更による影響を受けません。アスタリスク (*) を指定した場合、新しい列が結果セットに追加されるので、アプリケーションやスクリプトのロジックが影響を受けることがあります。特にカタログ ビュー、動的管理ビュー、およびシステム テーブル値関数では、アスタリスク (*) を使用しないようにしてください。今後の Microsoft SQL Server のアップグレードおよびリリースで、これらのビューおよび関数に列が追加されて列の順序が変更される可能性があります。このような変更により、特定の順序および列数を必要とするアプリケーションが機能しなくなる場合があります。
次の例では、Customer テーブル内のすべての列を取得し、Customer テーブルの作成時に定義した順番で表示します。
USE AdventureWorks2008R2;
GO
SELECT *
FROM Sales.Customer
ORDER BY CustomerID ASC;
GO
まったく同じ結果を得るには、SELECT ステートメントの後に、明示的にテーブル内のすべての列名を順番に指定します。
USE AdventureWorks2008R2;
GO
SELECT CustomerID, TerritoryID, AccountNumber, rowguid, ModifiedDate
FROM Sales.Customer
ORDER BY CustomerID ASC
GO
注 |
---|
テーブルの列名を表示するには、sp_help を使用するか、SELECT name FROM sys.columns WHERE OBJECT_ID IN (SELECT OBJECT_ID ('table_name')) または SELECT TOP 0 * FROM table_name のいずれかのクエリを使用します。 |