logo

Оптимальный способ выполнить SELECT без FROM в Oracle

Быстрый ответ

Чтобы выбрать данные без использования таблицы в Oracle, применяйте системную таблицу dual:

SQL
Скопировать код
-- Выборка строки 'StackOverflow это весело' без обращения к таблицам
SELECT 'StackOverflow это весело' FROM dual;

Для создания последовательностей без привязки к физическим таблицам используйте CONNECT BY:

SQL
Скопировать код
-- Вам нужны номерки для лотереи, но забыли шары дома? Решение есть!
SELECT level FROM dual CONNECT BY level <= 6;

Этот запрос вернёт вам числа от 1 до 6, используя только dual и CONNECT BY. Только не стоит верить в удачу всем своим состоянием!


Использование DUAL — самый быстрый способ получить данные в Oracle, без участия обычных таблиц:

SQL
Скопировать код
-- Получаем данные из пустоты... Такое возможно только в Oracle
SELECT 'StackOverflow это весело' FROM dual;

Генерация последовательностей чисел без участия таблиц производится с помощью CONNECT BY:

SQL
Скопировать код
-- Забыли закупить игровые кубики для игры в Dungeons and Dragons?
SELECT level FROM dual CONNECT BY level <= 6;

Псевдоколонка level в сочетании с dual и CONNECT BY позволит сгенерировать ряд чисел от 1 до 6.

Основы работы с DUAL

DUAL — это специальная однострочная таблица, создаваемая при установке Oracle. К DUAL имеют доступ все пользователи Oracle. Данная таблица полезна для получения данных без обращения к физическим таблицам.

Примеры использования DUAL

Генерация дат:

Когда потеряли календарь и хотите узнать даты на ближайшие 10 дней:

SQL
Скопировать код
SELECT TRUNC(SYSDATE) + level – 1 AS date_generated
FROM dual
CONNECT BY level <= 10;

Этот запрос сгенерирует ряд дат, начиная с текущего дня.

Присвоение переменным значений:

Когда требуется назначить значения переменным без участия таблицы DUAL:

SQL
Скопировать код
DECLARE 
    my_var VARCHAR2(100);
BEGIN
    -- Привет, DUAL, давай присвоим значения напрямую.
    SELECT 'Отличное присвоение' INTO my_var FROM dual;
    -- Спасибо, DUAL, за помощь!
END;

Вычисления на ходу:

Когда хотите показать свои навыки SQL, не прибегая к использованию калькулятора:

SQL
Скопировать код
-- А знаете ли вы, что SQL может помочь и с вашей домашней работой по математике?
SELECT SYSDATE, USER, 3.14159 * (2*2) AS area_of_circle
FROM dual;

Когда можно обойтись без DUAL

Есть случаи, когда использование DUAL не требуется.

Простые операции в PL/SQL:

Например, прямое назначение значения переменным в PL/SQL не требует обращения к DUAL:

plsql
Скопировать код
DECLARE
    todays_date DATE := SYSDATE; -- Прямое присвоение значения переменной
BEGIN
    -- Продолжение PL/SQL блока без использования DUAL
END;

Работа с пользовательскими типами данных:

В случае работы с коллекциями или пользовательскими типами данных можно напрямую управлять ими, исключая DUAL.

Визуализация

Представьте, что вы находитесь на автобусной остановке и хотите узнать расписание (🚌). Обычно вы бы взглянули на расписание, расположенное на остановке (FROM Schedules). Но что делать, если расписания нет?

SQL
Скопировать код
SELECT 'Автобус приедет в 15:00' AS Info FROM DUAL;

Это как если бы вы спросили о времени у Bluetooth-колонки (🔊) и она ответила вам, не обращаясь к стороннему источнику:

Markdown
Скопировать код
Bluetooth-колонка 🔊✨: 'Автобус приедет в 15:00'

DUAL выдаёт ответ, не требуя наличием реального источника информации.

Ускорение работы с FAST DUAL

Как супергерой Флеш обгоняет обычных людей, так системная таблица DUAL Oracle работает быстрее обычных таблиц. Оптимизация доступа к DUAL через FAST DUAL позволяет обеспечить быстрейшую выдачу данных.

Повышение производительности

При выполнении запросов SELECT в Oracle, которые не обращаются к реальным таблицам, оптимизатор активирует специальный механизм FAST DUAL, который значительно ускоряет выдачу результатов.

Сравнение с MySQL

В отличие от Oracle, MySQL одобряет использование запросов SELECT без FROM, что позволяет производить выборку данных без привязки к таблицам:

SQL
Скопировать код
SELECT 3.14159, 'Привет, StackOverflow!';

Работая с MySQL, придётся привыкнуть к использованию DUAL при выполнении подобных операций в Oracle.

Полезные материалы

  1. While loop in Ruby Shoes GUI ToolKit – Stack Overflow — обсуждение на Stack Overflow о том, как выбирать данные без использования FROM в Oracle.
  2. SELECT – Документация Oracleофициальная документация, где от Oracle объясняются особенности использования SELECT.
  3. SQL Fiddle — онлайн-инструмент для тестирования и экспериментов с SQL.
  4. Вопросы – Ask TOM — площадка, где специалисты Oracle делаются своими знаниями об особенностях работы с SQL, в том числе и о выборке данных без FROM.