Перейти к содержанию

SELECT

DQL-команда SELECT используется для получения, фильтрации и преобразования кортежей из таблиц в запросе. Если никакие данные не удовлетворяют условиям фильтрации, то в ответе вернется только описание метаданных колонок без самих кортежей. В контексте распределенной системы, команда SELECT в Picodata получает информацию из всех частей таблицы, которая может храниться на нескольких узлах кластера.

Примечание

Кортежи в выводе идут в том порядке, в каком их отдают узлы Picodata. Гарантии порядка не предоставляются.

Синтаксис

SELECT DISTINCT projection , FROM table ( select values ) AS name INNER LEFT OUTER JOIN table ( select values ) AS name ON expression WHERE expression GROUP BY expression , HAVING expression UNION ALL EXCEPT DISTINCT select

Проекция

Диаграмма

table . * expression AS name aggregate

Выражение

Диаграмма

table . column expression IS NOT NULL OR AND * / + - = > < >= <= <> != expression NOT BETWEEN expression AND expression IN ( select values ) NOT EXISTS ( select values ( select values expression , ) literal cast NOT expression

Литерал

Диаграмма

TRUE FALSE NULL ? $ unsigned integer double decimal string

Параметры

  • Псевдоним — позволяет переопределить названия получаемых столбцов в запросах. Псевдоним вставляется после опционального слова AS и может содержать произвольный текст со следующими ограничениями: он не должен начинаться с цифры и не может содержать пробелов и специальных служебных символов (кроме знака подчеркивания).

  • DISTINCT — возвращаются только уникальные значения кортежей.

  • INNER JOIN — к колонкам каждого кортежа из внутренней (правой) части запроса присоединяются только колонки тех кортежей внешней (левой) части, которые удовлетворяют условию соединения ON. Если во внешней части не нашлось подходящего кортежа, то внутренний кортеж не попадает в результат.

  • LEFT OUTER JOIN — к колонкам каждого кортежа из внешней (левой) части запроса присоединяются только колонки тех кортежей внутренней (правой) части, которые удовлетворяют условию соединения ON. Если во внутренней части не нашлось подходящего кортежа, то вместо значений его колонок будет подставлен NULL.

  • WHERE — условие фильтрации при сканировании таблицы или подзапроса.

  • GROUP BYгруппировка данных по списку колонок или выражений.

  • HAVING — фильтрация уже сгруппированных данных.

  • UNION ALL — объединение результатов с одинаковым набором колонок из нескольких DQL запросов. При этом результат может содержать дубликаты строк. На текущий момент грамматика SQL не поддерживает несколько UNION ALL подряд. Чтобы обойти это ограничение, следует воспользоваться подзапросами.

  • EXCEPT DISTINCT — исключение результатов с одинаковым набором колонок одного запроса из другого. При этом результат не содержит дубликаты строк. На текущий момент грамматика SQL не поддерживает несколько EXCEPT DISTINCT подряд. Чтобы обойти это ограничение, следует воспользоваться подзапросами.

См. также:

Примеры

Получение данных из таблицы с фильтрацией:

SELECT type FROM characters WHERE name = 'Woody';

Получение данных без повторов:

SELECT DISTINCT type FROM characters;

Внутреннее соединение:

SELECT
    c.name,
    a.stock
FROM characters as c
JOIN assets AS a
ON c.id = a.id;

Внешнее левое соединение:

SELECT
    c.name,
    a.stock
FROM characters as c
LEFT JOIN assets AS a
ON true;

Множественные соединения:

SELECT characters.name, cast.film, cast.actor, stars.age
FROM characters
INNER JOIN cast ON characters.name = cast.character
LEFT OUTER JOIN stars ON cast.actor = stars.name;

Агрегация:

SELECT COUNT(*) FROM characters WHERE id < 10;

Группировка с предварительной фильтрацией:

SELECT type, COUNT(*) FROM characters
WHERE id < 10
GROUP BY type;

Группировка с последующей фильтрацией по сгруппированным данным:

SELECT type, COUNT(*) as c FROM characters
GROUP BY type
HAVING c > 10

Объединение результатов нескольких запросов:

SELECT name FROM characters WHERE name = 'Dragon'
UNION ALL
SELECT * FROM (
    SELECT name FROM assets
    UNION ALL
    SELECT name FROM characters WHERE name = 'Woody'
)

Последовательное исключение результатов для нескольких запросов:

SELECT name FROM characters
EXCEPT
SELECT * FROM (
    SELECT name FROM assets
    EXCEPT
    SELECT name FROM characters WHERE name = 'Woody'
)