Выражение FROM

Выражение FROM указывает источник данных, с которыми должна работать остальная часть запроса. С точки зрения логики, выражение FROM — это место, с которого начинается выполнение запроса.

Выражение FROM может содержать одну таблицу, комбинацию из нескольких таблиц, объединенных с помощью выражения JOIN, или другой запрос SELECT в узле подзапроса.

В Tengri также имеется дополнительный синтаксис FROM-first, который позволяет выполнять запрос без оператора SELECT.

Синтаксис

SELECT ...
FROM objectReference [ JOIN objectReference [ ... ] ]
[ ... ]

где:

objectReference ::=
   {
      [<namespace>.]<object_name>
           [ AT | BEFORE ( <object_state> ) ]
           [ CHANGES ( <change_tracking_type> ) ]
           [ MATCH_RECOGNIZE ]
           [ PIVOT | UNPIVOT ]
           [ [ AS ] <alias_name> ]
     | <table_function>
           [ PIVOT | UNPIVOT ]
           [ [ AS ] <alias_name> ]
     | ( VALUES (...) )
     | [ LATERAL ] ( <subquery> )
           [ [ AS ] <alias_name> ]
     | DIRECTORY( @<stage_name> )
   }

Параметры

  • [<namespace>.]<object_name>
    Указывает имя объекта (таблицы или представления), к которому производится запрос.


  • <table_function>
    Указывает системную табличную функцию, табличную функцию UDF или метод класса для вызова в выражении FROM.


  • VALUES
    Выражение VALUES может указывать литеральные значения или выражения, которые будут использоваться в выражении FROM. Это выражение может содержать псевдонимы таблиц и столбцов (не показаны на схеме выше).


  • [ LATERAL ] ( <subquery> )
    Указывает встроенное представление в выражении FROM. Если используется необязательное ключевое слово LATERAL, то подзапрос может ссылаться на столбцы из других таблиц (или представлений, или табличных функций), которые находятся в текущем выражении FROM и слева от встроенного представления.


  • DIRECTORY( @stage_name )
    Указывает имя этапа, включающего таблицу каталогов.


  • [ AS ] <alias_name>
    Указывает имя, заданное для объекта, к которому она относится. Может использоваться с любыми другими подзапросами в выражении FROM. Оператор AS может опускаться.


  • JOIN
    Указывает на выполнение соединения между двумя (или более) таблицами (или представлениями или табличными функциями). Соединение может быть внутренним внешним или иметь другой тип. Соединение может использовать ключевое слово JOIN или альтернативный поддерживаемый синтаксис соединения.
    Подробное описание см. в разделе Выражение JOIN.

Примеры

  • Выбираем все столбцы из таблицы с именем my_table:

    SELECT *
    FROM my_table;
  • Выбираем все столбцы из таблицы, используя синтаксис FROM-first:

    FROM my_table
    SELECT *;
  • Выбираем все столбцы, используя синтаксис FROM-first и опуская выражение SELECT:

    FROM my_table;
  • Выбираем все столбцы из таблицы с именем my_table через псевдоним mt:

    SELECT mt.*
    FROM my_table mt;
  • Используем префиксный псевдоним:

    SELECT mt.*
    FROM mt: my_table;
  • Выбираем все столбцы из таблицы my_table в схеме my_schema:

    SELECT *
    FROM my_schema.my_table;
  • Выбираем столбец i из табличной функции range, где первый столбец функции диапазона переименован в i:

    SELECT t.i
    FROM range(1000) AS t(i);
  • Выбираем все столбцы из подзапроса:

    SELECT *
    FROM (SELECT * FROM my_table);
  • Объединяем две таблицы:

    SELECT *
    FROM my_table
    JOIN other_table
        ON my_table.key = other_table.key;

    Подробное описание см. в разделе Выражение JOIN.

Синтаксис FROM-first

Tengri поддерживает синтаксис FROM-first, т. е. позволяет поместить выражение FROM перед выражением SELECT или полностью опустить выражение SELECT. Продемонстрируем это на примере:

CREATE TABLE capitals (country VARCHAR, capital VARCHAR);
INSERT INTO capitals VALUES
    ('Russia', 'Moscow'),
    ('Italy', 'Rome'),
    ('Spain', 'Madrid'),
    ('France', 'Paris');

Синтаксис FROM-first с выражением SELECT

Следующее выражение демонстрирует использование синтаксиса FROM-first:

FROM capitals
SELECT *;
+---------+---------+
| country | capital |
+---------+---------+
| France  | Paris   |
+---------+---------+
| Italy   | Rome    |
+---------+---------+
| Russia  | Moscow  |
+---------+---------+
| Spain   | Madrid  |
+---------+---------+

Это эквивалентно:

SELECT *
FROM capitals;
+---------+---------+
| country | capital |
+---------+---------+
| France  | Paris   |
+---------+---------+
| Italy   | Rome    |
+---------+---------+
| Russia  | Moscow  |
+---------+---------+
| Spain   | Madrid  |
+---------+---------+

Синтаксис FROM-first без выражения SELECT

Следующее выражение демонстрирует необязательность выражения SELECT:

FROM capitals;
+---------+---------+
| country | capital |
+---------+---------+
| France  | Paris   |
+---------+---------+
| Italy   | Rome    |
+---------+---------+
| Russia  | Moscow  |
+---------+---------+
| Spain   | Madrid  |
+---------+---------+

Это тоже эквивалентно полному запросу:

SELECT *
FROM capitals;
+---------+---------+
| country | capital |
+---------+---------+
| France  | Paris   |
+---------+---------+
| Italy   | Rome    |
+---------+---------+
| Russia  | Moscow  |
+---------+---------+
| Spain   | Madrid  |
+---------+---------+