Строго, так, 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
таблиця на насправді не доступний , який відповідає на питання правки (який заслуговує нове питання до речі).