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

SELECT

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

Команда SELECT в Picodata работает как с глобальными, так и с шардированными таблицами. В последнем случае части таблицы могут храниться на нескольких узлах кластера, и SELECT получит данные о всех таких частях.

При использовании условии (SELECT... WHERE...) часть данных будет отфильтрована. Если никакие данные не удовлетворяют условиям фильтрации, то в ответе вернется только описание метаданных колонок без самих кортежей.

Примечание

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

Синтаксис

SELECT DISTINCT projection , FROM scan INNER LEFT OUTER JOIN scan ON expression WHERE expression GROUP BY expression , HAVING expression ORDER BY expression ASC DESC , UNION ALL EXCEPT DISTINCT select LIMIT unsigned ALL NULL

Проекция

Диаграмма

table . * expression AS name aggregate

Сканирование

Диаграмма

table ( dql ) AS name

Выражение

Диаграмма

NOT table . column literal case cast current_date like ilike substr to_char to_date trim lower upper NOT EXISTS ( dql ) ( dql ) ( expression , ) IS NOT NULL TRUE FALSE UNKNOWN expression NOT BETWEEN expression AND + - * / <> != >= > <= < = NOT IN || AND OR expression

Литерал

Диаграмма

TRUE FALSE NULL decimal double integer string unsigned $ unsigned ?

Параметры

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

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

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

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

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

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

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

  • ORDER BY — сортировка результата запроса по одной или нескольким колонкам. Используется для упорядочивания получаемого набора данных. Колонки могут быть указаны как по их именам, так и по порядковым номерам. Если не указан тип упорядочивания (ASC — по возрастанию, DESC — по убыванию), то по умолчанию подразумевается возрастание значений.

  • UNION — объединение результатов с одинаковым набором колонок из нескольких DQL-запросов. При этом результат не содержит дубликаты строк.

  • UNION ALL — объединение результатов с одинаковым набором колонок из нескольких DQL-запросов. При этом результат может содержать дубликаты строк.

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

  • LIMIT — возвращается количество строк, не превышающее указанное значение типа UNSIGNED.

  • LIMIT ALL, LIMIT NULL — возвращается неограниченное количество строк. Является поведением по умолчанию.

См. также:

Примеры

Тестовые таблицы

Примеры использования команд включают в себя запросы к тестовым таблицам.

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

SELECT name from items WHERE stock > 1000;

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

SELECT DISTINCT type FROM warehouse;

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

SELECT
    c.item,
    c.type,
    a.stock
FROM warehouse AS c
JOIN items AS a
ON c.id = a.id;

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

SELECT
    c.item,
    c.type,
    a.stock
FROM warehouse AS c
LEFT JOIN items AS a
ON TRUE;

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

SELECT
    warehouse.item,
    items.stock,
    orders.amount
FROM warehouse
INNER JOIN items
ON warehouse.item = items.name
LEFT OUTER JOIN orders
ON items.name = orders.item;

Агрегация

SELECT COUNT(*) FROM warehouse WHERE type = 'heavy';

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

SELECT type, COUNT(*) FROM warehouse
WHERE id < 5
GROUP BY type;

Упорядочивание результата по убыванию значений в третьей колонке

SELECT * FROM items
ORDER BY 3 DESC;

Разнонаправленное упорядочивание результата по двум явно именованным колонкам

SELECT * FROM items
ORDER BY name ASC, stock DESC;

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

SELECT item FROM warehouse
UNION
SELECT item FROM orders;

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

SELECT item FROM warehouse
UNION
SELECT item FROM orders
UNION
SELECT name FROM items;

Полное объединение результатов с использованием подзапроса

SELECT item FROM warehouse WHERE type = 'heavy'
UNION ALL
SELECT * FROM (
    SELECT name FROM items
    UNION ALL
    SELECT item FROM orders WHERE amount > 400
);

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

SELECT item FROM orders
EXCEPT
SELECT item FROM warehouse;

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

SELECT item FROM warehouse
EXCEPT
SELECT * FROM (
  SELECT item
  FROM orders
  EXCEPT
    SELECT NAME
    FROM items
    WHERE stock > 200
);

Ограничение количества возвращаемых строк

SELECT * FROM warehouse LIMIT 3;

Запросы без таблиц

Если запрос SELECT делается без таблиц, то имен колонок в нем быть не может, а значит имеет смысл работать только с константами. Следующий запрос вернет один кортеж с двум колонками:

SELECT 42, 24;

В примере с манипуляцией данными в результате запроса будет виртуальная таблица из двух строк и одной колонки:

SELECT 'cats' UNION SELECT 'dogs';