Строго говоря, да, 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]
При реальном использовании программисты и администраторы баз данных часто считают полезным делать что-то, кроме манипулирования данными в таблицах или манипулирования таблицами и структурами данных. Этот тип вещей в значительной степени выходит за рамки стандарта SQL, который связан с функциями данных больше, чем суть конкретных реализаций. Хотим ли мы запускать SELECT getdate()
или SELECT 1
или SELECT DB_NAME()
(или как бы вы ни предпочитали ваш диалект), нам на самом деле не нужны данные из таблицы.
Oracle решает проблему несоответствия стандарту и реализации с использованием фиктивной таблицы со следующим эффективным определением:
CREATE TABLE DUAL (
DUMMY CHAR(1)
)
INSERT INTO DUAL (DUMMY) VALUES ('X')
Другие РСУБД по существу предполагают, что используется фиктивная таблица, если не FROM
указано иное.
История DUAL таблицы на Википедии:
Таблица DUAL была создана Чарльзом Вейссом из корпорации Oracle для предоставления таблицы для объединения во внутренние представления:
Я создал таблицу DUAL как базовый объект в Oracle Data Dictionary. Он никогда не предназначался для того, чтобы его видели, а вместо этого использовался внутри представления, которое, как ожидалось, будет запрошено Идея заключалась в том, что вы можете выполнить JOIN к таблице DUAL и создать две строки в результате для каждой строки в вашей таблице. Затем с помощью GROUP BY полученное объединение можно суммировать, чтобы показать объем хранилища для экстента DATA и экстента (ов) INDEX. Название DUAL казалось подходящим для процесса создания пары строк из одного.
Исходная таблица DUAL содержала две строки (отсюда и название), но впоследствии в ней была только одна строка.
select
безfrom
. В DB2 есть аналогичная фиктивная таблица SYSIBM.SYSDUMMY1 . Кроме того, вы, вероятно, уже знаете это, но когда выselect 'A' from dual
, кdual
таблице, на самом деле нет доступа , что отвечает на вопрос в вашем редактировании (который заслуживает нового вопроса между прочим).