Ini berfungsi dalam Sistem Manajemen Database Relasi utama yang paling mungkin muncul di StackOverflow / dba.stackexchange, menjadi SQL Server, MySQL, PostgreSQL dan SQLite (WebSQL) .
select 'abc' abc, 1 def;
Ini tidak berfungsi pada Oracle. Mengapa kita perlu memilih dari DUAL di Oracle? Apakah standar ISO / ANSI untuk SQL memerlukan klausa FROM untuk pernyataan SELECT ?
Edit:
Per Bacon Bit
jawaban, tampaknya memang diperlukan oleh standar SQL.
Jadi pada kenyataannya, karena nama DUAL adalah istilah yang keliru, jika saya membuat tabel dan menamakannya ATOM atau ONE, mis create table one (atom int);
. select 'abc' abc, 1 def FROM one;
- Apakah ada penalti performa dibandingkan dengan SELECT .. FROM DUAL
?
select
tanpafrom
. DB2 memiliki tabel boneka serupa yang disebut SYSIBM.SYSDUMMY1 . Anda juga mungkin sudah mengetahui hal ini, tetapi ketika Andaselect 'A' from dual
,dual
tabel tersebut tidak benar-benar diakses , yang menjawab pertanyaan dalam suntingan Anda (yang pantas menjadi pertanyaan baru btw).FROM
klausa. Dari atas kepala saya: Informix, Firebird dan Apache Derby juga memerlukannya.values ('abc', 1)
. Anda tentu saja dapat juga memilih dari pernyataan seperti itu:select abc from ( values ('abc',1) ) as t(abc,def)
Jawaban:
Sebenarnya,
FROM
klausaSELECT
pernyataan tidak opsional. Sintaks untuk SQL-99 merinciSELECT
statment dasar , danFROM
klausa tidak memiliki tanda kurung siku di sekitarnya. Itu menunjukkan standar menganggapnya non-opsional:Dalam penggunaan aktual, pemrogram dan DBA sering merasa berguna untuk melakukan hal-hal selain memanipulasi data dalam tabel atau memanipulasi tabel dan struktur data. Jenis hal ini sebagian besar di luar ruang lingkup standar SQL, yang berkaitan dengan fitur data lebih dari mur dan baut implementasi spesifik. Apakah kami ingin menjalankan
SELECT getdate()
atauSELECT 1
atauSELECT DB_NAME()
(atau apa pun yang lebih disukai dialek Anda), kami sebenarnya tidak menginginkan data dari sebuah tabel.Oracle memilih untuk memecahkan perbedaan standar dan implementasi menggunakan tabel dummy dengan definisi efektif berikut:
RDBMSes lainnya pada dasarnya mengasumsikan bahwa tabel dummy digunakan jika tidak
FROM
ditentukan.The sejarah tabel DUAL adalah di Wikipedia:
sumber
Keuntungannya
dual
adalah pengoptimal memahamidual
adalah satu baris khusus, satu tabel kolom (denganvarchar2
tipe data) - saat Anda menggunakannya dalam kueri, ia menggunakan pengetahuan ini saat mengembangkan rencana.Mengapa kita harus memilih dari
dual
dalam Oracle?Anda dapat memilih dari
dual
atau dari tabel Anda sendiri juga, Anda bisa jika Anda mau.Bagi saya, saya akan tetap dengan
dual
karena saya tahudual
ada. Saya tahu ia memiliki setidaknya 1 dan paling banyak 1 baris. Saya tahu pengoptimal tahu semua tentangdual
dan melakukan hal yang paling efisien bagi saya. Pengoptimal memahamidual
adalah tabel 1 baris ajaib, khusus. Itu berhenti diselect *
karena ada satu baris di sana. Jadi begitulah cara kerjanya.sumber
DUAL
. Hati-hati!Dua jawaban lainnya memberikan latar belakang yang baik untuk jawaban saya.
Pada database Oracle, ini tradisional dan dapat diandalkan. Ini akan gagal pada database lain yang tidak memiliki
DUAL
tabel. Anda tidak perlu menggunakannyaDUAL
, tetapi saya sarankan Anda melakukannya.Basis data yang memenuhi standar akan membutuhkan
FROM
klausa yang menentukan setidaknya referensi Tabel. Jika Anda memiliki tabel PESANAN, penggantianFROM DUAL
klausa berikut akan berfungsi:Ganti setiap tabel atau tampilan yang dapat Anda pilih dan itu akan berfungsi. Gantikan tabel atau tampilan yang tidak dapat Anda pilih dan itu akan gagal.
DUAL
lebih dapat diandalkan sebagai pembatasan DBA yang melanggarnya, semua pengguna dapat memilih darinya, dan hanya akan mendapatkan satu baris di set hasil. (Kadang-kadang rusak.)Saya tidak mengetahui kata kerja yang memenuhi standar untuk mengakses data yang tidak ada dalam tabel tanpa menyertakan referensi Tabel. Mengingat betapa sedikitnya saya mengakses data seperti itu, saya tidak melihat kebutuhan seperti itu. Banyak kasus yang saya alami, dapat ditangani dengan cara yang berbeda.
sumber
SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) V(C)
adalah standar yang saya percaya dan tidak bergantung pada tabel tertentu.