DUAL表(DUALひょう)は、Oracle Databaseにおいてセットアップ時から存在する、1列しかない特別なである。これはSYSDATEUSERなど、表を適用せずとも値を返す演算に対してSELECTを行う場合に使われる。この表にはVARCHAR2(1)のDUMMYという列だけがあり、1件だけあるレコードの値は'X'となっている。

使用例 編集

OracleのSQLでは、SELECT文にはFROM節が必須であるが、クエリーの種類によっては表が必要ないこともある。そんな場面では、システム側で用意されているDUALを使うことができる。

SELECT 1+1
FROM DUAL;

SELECT SYSDATE 
FROM   DUAL;

SELECT USER 
FROM   DUAL;

歴史 編集

DUAL表は、オラクル社のチャールズ・ワイスによって、内部情報のビューと結合するために作られた。もともとは2行あり、別な表と結合することで文字通り1行が2行に増えるようになっていたのだが、のちに1行となっている。

最適化 編集

DUALはもともと通常の表であり、DUALに対してSELECTを行うと、DUAL表へのアクセスが生じる。たいていはメモリのキャッシュに乗っかっているので、DUAL表を探してディスクまでアクセスが行われることはあまりないが、それでもDUAL表へのアクセス処理は頻繁に行われる。

Oracle 10gでは、DUAL表そのものは存在しているものの、最適化により実際にはDUALへアクセスしないようになっている[1]

他のDBMS 編集

PostgreSQL[2]SQLite[3]Microsoft SQL Server[4]など、SELECTのFROM節を必須としていないDBMSも存在し、これらではDUALのようなダミーの表を使う必然性がない。なお、MySQLにおいてもFROMの省略が可能であるが、互換性のためにFROM DUALと書くことができる[5]IBM Db2(DB2)においては、DUALと同様のダミー表としてsysibm.sysdummy1が存在するが、表を必要としない演算に対してはVALUESという構文も用意されている[6]

脚注 編集

  1. ^ Week 7:Oracle Database 10g: The Top 20 Features for DBAs”. Oracle. 2012年11月16日閲覧。
  2. ^ SELECT”. 日本PostgreSQLユーザー会. 2012年11月16日閲覧。
  3. ^ SQL As Understood By SQLite”. 2012年11月16日閲覧。
  4. ^ FROM (Transact-SQL)”. マイクロソフト. 2013年2月24日閲覧。
  5. ^ MySQL 4.1 リファレンスマニュアル :: 6.4.1 SELECT 構文”. 2012年11月16日閲覧。
  6. ^ DB2の基礎: 日付と時刻で遊ぶ”. IBM (2009年5月28日). 2013年2月24日閲覧。