厳密には、はい、文のFROM
句はSELECT
オプションではありません。 SQL-99の構文は基本的なSELECT
ステートメントの詳細を示しており、FROM
句には角括弧がありません。これは、標準がオプションではないと見なしていることを示しています。
SELECT [ DISTINCT | ALL ]
{Column expression [ AS name ]} [ ,... ] | *
FROM <Table reference> [ {,<Table reference>} ... ]
[ WHERE search condition ]
[ GROUP BY Columns [ HAVING condition ] ]
[ORDER BY {col_name | expr | position} [ASC | DESC],...]
[LIMIT {[offset,] row_count | row_count OFFSET offset}]
[PROCEDURE procedure_name(argument_list)]
[INTO OUTFILE 'file_name' export_options |
INTO DUMPFILE 'file_name' |
INTO var_name [, var_name]]
[FOR UPDATE | LOCK IN SHARE MODE]
実際の使用では、プログラマとDBAは、テーブル内のデータを操作したり、テーブルとデータ構造を操作したりする以外のことを行うことが有用であることがよくあります。このタイプのことは、SQL標準の範囲を大きく超えています。SQL標準は、特定の実装の要点以上にデータ機能に関係しています。実行するSELECT getdate()
か、SELECT 1
またはSELECT DB_NAME()
(または方言が好むものでも)、テーブルからのデータは実際には必要ありません。
オラクルは、次の効果的な定義を持つダミー表を使用して、標準と実装の矛盾を解決することを選択します。
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
他のRDBMSは、基本的に、FROM
指定されていない場合はダミーテーブルが使用されると想定します。
DUALテーブルの歴史は Wikipediaにあります:
DUALテーブルは、内部ビューに参加するためのテーブルを提供するために、Oracle CorporationのCharles Weissによって作成されました。
Oracle Data Dictionaryの基礎オブジェクトとしてDUALテーブルを作成しました。それ自体が表示されることを意図したものではなく、クエリが実行されると予想されるビュー内で使用されました。アイデアは、DUALテーブルにJOINを実行し、テーブルの1行ごとに結果に2行を作成できるというものでした。次に、GROUP BYを使用して、結果の結合を要約して、DATAエクステントおよびINDEXエクステントのストレージ量を表示できます。DUALという名前は、1つから行のペアを作成するプロセスに適しているように見えました。
元のDUALテーブルには2つの行がありました(そのため、その名前です)が、その後は1行しかありませんでした。
select
なしfrom
。DB2には、SYSIBM.SYSDUMMY1と呼ばれる同様のダミーテーブルがあります。また、おそらくこれを既に知っているでしょうが、あなたselect 'A' from dual
がdual
テーブルに実際にアクセスしていない場合、編集中の質問に答えます(これは新しい質問に値します)。