Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

Oracleに隠れているDUALダミーテーブルの使いみち

DUALテーブルとは

OracleにはDUALというダミーテーブルが存在します。

SELECT 〜 FROM DUAL

この表は何に使うかというと、OracleではMySQLとかPostgresと違って、SELECT文のFROMを省略できないので、FROMが不要なクエリを実行する時は、DUAL表をFROM句に指定します

例えば関数だけ実行したい場合とかにDUALを使います。

SELECT SYSDATE FROM DUAL;

DUAL表の中身

DUAL表の中身はどうなっているかと思ってSELECTしてみると、DUMという列を持っていて、DUMの値がXのレコードが1件だけ存在しています。

SQL> select * from dual;

DUM
---
X

MySQLにもDUAL表は存在する

DUAL表はMySQLにも互換性確保のため(?)か存在しているようです。

ですが、試しにSELECTしてみたところ、Oracleのように中身を見ることはできませんでした。

mysql> SELECT * FROM DUAL;
ERROR 1096 (HY000): No tables used

COUNTすると1という結果が返ってくるので、ちゃんと存在はしてるようです。

mysql> SELECT COUNT(*) FROM DUAL;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

そういえば最近このようなツイートが少し話題になっていたのですが、

最初見た時、FROM句に何も書いていないのに1が返ってくるのは不思議だなと思ったのですが、これはDUAL表のレコード数をカウントしているのだろうと腑に落ちました。

関連記事

OracleにないLIMITの代わりにROWNUMを使う場合の罠


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。