Строго, так, FROMпункт SELECTзаяви не є обов'язковим. У синтаксисі SQL-99 детально SELECTописаний базовий елемент, а в FROMпункті немає квадратних дужок навколо нього. Це означає, що стандарт вважає це необов'язковим:
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]
Насправді, програмістам та DBA часто вважається корисним робити інші речі, крім маніпулювання даними в таблицях або маніпулювання таблицями та структурами даних. Цей тип речі значною мірою виходить за межі стандарту SQL, який стосується особливостей даних більше, ніж гайки та болти конкретних реалізацій. Якщо ми хочемо запустити SELECT getdate()або SELECT 1або SELECT DB_NAME()(або будь-який інший ваш діалект воліє), ми на самому ділі не хочуть дані з таблиці.
Oracle вирішує вирішити невідповідність стандарту та впровадженню за допомогою макетної таблиці із наступним ефективним визначенням:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Інші RDBMS по суті припускають, що використовується фіктивна таблиця, якщо не FROMвказано ні.
Історія DUAL таблиці на Вікіпедії:
Таблиця DUAL була створена корпорацією Чарльз Вайс з корпорації Oracle для надання таблиці для приєднання до внутрішніх поглядів:
Я створив таблицю DUAL як основний об'єкт у словнику даних Oracle. Він ніколи не мав на увазі бачити себе, а замість цього використовувався всередині подання, яке, як очікувалося, буде запитуватися. Ідея полягала в тому, що ви можете зробити приєднання до таблиці DUAL і створити результат у двох рядках для кожного рядка таблиці. Тоді, використовуючи GROUP BY, отримане з'єднання можна підсумувати, щоб показати об'єм сховища для обсягу DATA та для обсягу (-ів) INDEX. Назва, DUAL, здавалася придатною для процесу створення пари рядків із лише одного.
Оригінальна таблиця DUAL мала в ній два ряди (звідси її назва), але згодом вона мала лише один рядок.
selectбезfrom. DB2 має подібну макетну таблицю під назвою SYSIBM.SYSDUMMY1 . Крім того, ви , напевно , вже знаєте, але якщо виselect 'A' from dual, тоdualтаблиця на насправді не доступний , який відповідає на питання правки (який заслуговує нове питання до речі).