Kesinlikle, evet, FROM
bir SELECT
ifadenin cümlesi isteğe bağlı değildir. SQL-99 sözdizimi temel SELECT
ifadeyi detaylandırır ve FROM
yan tümcesinde etrafında köşeli ayraç yoktur. Bu, standardın isteğe bağlı olmadığını düşündüğünü gösterir:
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]
Gerçek kullanımda, programcılar ve DBA'lar genellikle tablolardaki verileri veya tabloları ve veri yapılarını manipüle etmekten başka şeyler yapmayı yararlı bulurlar. Bu tür şeyler büyük ölçüde SQL standardının kapsamı dışındadır, bu da veri özellikleri ile ilgili belirli uygulamaların somun ve cıvatalarından daha fazladır. İster çalıştırmak ister isterse SELECT getdate()
ya SELECT 1
da SELECT DB_NAME()
(ya da lehçeniz ne olursa olsun), aslında bir tablodan veri istemiyoruz.
Oracle, aşağıdaki etkili tanımlamaya sahip bir sahte tablo kullanarak standart ve uygulama tutarsızlığını çözmeyi seçer:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Diğer RDBMS'ler esas olarak FROM
, belirtilmezse sahte bir tablonun kullanıldığını varsayar .
ÇİFT tablonun tarihçesi Wikipedia'da geçerli:
DUAL tablosu, Oracle şirketlerinden Charles Weiss tarafından dahili görünümlere katılmak için bir tablo sağlamak üzere oluşturuldu:
DUAL tablosunu, Oracle Data Dictionary'de temel alınan bir nesne olarak oluşturdum. Asla kendini görmek istemiyordu, bunun yerine sorgulanması beklenen bir görünüm içinde kullanılıyordu. Fikir, DUAL tablosuna BİRLEŞME yapabileceğiniz ve tablonuzdaki her satır için iki satır oluşturabileceğinizdi. Daha sonra GROUP BY kullanılarak sonuçta elde edilen birleşim, VERİ kapsamı ve INDEX kapsam (lar) ı için depolama miktarını göstermek üzere özetlenebilir. DUAL adı, sadece birinden bir çift satır oluşturma sürecine uygun görünüyordu.
Orijinal DUAL tablosunda iki satır (dolayısıyla adı) vardı, ancak daha sonra yalnızca bir satır vardı.
select
bir olmadanfrom
. DB2, SYSIBM.SYSDUMMY1 adlı benzer bir kukla tabloya sahiptir . Ayrıca muhtemelen bunu zaten biliyorsunuzdur, ancak sizselect 'A' from dual
,dual
tabloya gerçekten erişilmez , bu da düzenlemenizdeki soruyu cevaplar (yeni bir soru btw'yi hak eder).