環境
・Oracle Database 23c
※DBエディションやOSによって差異はなし
やれること
23cより前までは、OracleのSELECT文ではFROM句が必須でした。
そのため、たとえば現在日時を確認したいなど、表の必要のないSELECT文ではDUAL表という
ダミー表を使用して、SELECT文を成り立たせていました。
それが23cではDUAL表のためのFROM句が不要となりました。
長年Oracleを使ってきた自分には、なぜそんな改訂が行われたのか不思議に思っていましたが
どうも他のデータベースではFROM句不要でSELECTできるのが普通だったようです。
Oracleと他のデータベースの動きを確認してみました。
FROM句が必要ないようなシンプルSQLと、現在日時を取得するSQLを
データベースごとに比較
実行例
Oracle Database 23c
FROM句(Dual表指定)が不要になった
[oracle@host01 ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Developer-Release on 日 10月 22 08:00:31 2023
Version 23.2.0.0.0
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release
Version 23.2.0.0.0
に接続されました。
SQL> select 1 from dual;
1
----------
1
SQL> select 1;
1
----------
1
SQL> select sysdate;
SYSDATE
--------
23-10-22
SQL>
Oracle Database 19c
Oracleでは21cまではFROM句必須(例は19c)
[oracle@sms-oracle-db-3s ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 月 10月 16 09:54:30 2023
Version 19.11.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.11.0.0.0
に接続されました。
SQL> show user
ユーザーは"SYS"です。
SQL> select 1 from dual;
1
----------
1
★ 19cではFROM句が必須のため、エラーになる
SQL> select 1
2 ;
*
行2でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。
SQL> select sysdate from dual;
SYSDATE
--------
23-10-16
★ 19cではFROM句が必須のため、エラーになる
SQL> select sysdate;
select sysdate
*
行1でエラーが発生しました。:
ORA-00923: FROMキーワードが指定の位置にありません。
SQL Server
SQL ServerではFROM句不要
C:\Users\Administrator>sqlcmd -S localhost -U sa
パスワード:
★SQL Serverでは dual表は存在しない
1> select 1 from dual;
2> go
メッセージ 208、レベル 16、状態 1、サーバー WIN-OGLJPPACQ1N、行 1
オブジェクト名 'dual' が無効です。
1>
2>
3>
★SQL Serverでは もともとdual表は不要で検索できた
4> select 1
5> go
-----------
1
(1 行処理されました)
★SQL Serverでの現在日時を取得するSQL文
1> select getdate()
2> go
-----------------------
2023-10-16 13:18:12.820
(1 行処理されました)
PostgreSQL
PostgreSQLではFROM句不要
C:\Users\Administrator>psql -U postgres
ユーザ postgres のパスワード:
psql (13.4)
"help"でヘルプを表示します。
★PostgreSQLでは dual表は存在しない
postgres=# select 1 from dual;
ERROR: リレーション"dual"は存在しません
行 1: select 1 from dual;
^
★PostgreSQLでは もともとdual表は不要で検索できた
postgres=# select 1;
?column?
----------
1
(1 行)
★PostgreSQLでの現在日時を取得するSQL文
postgres=# select now();
now
-------------------------------
2023-10-20 19:16:57.636296+09
(1 行)
postgres=# select current_date;
current_date
--------------
2023-10-20
(1 行)