SELECT¶
DQL-команда SELECT
используется для получения, фильтрации и
преобразования кортежей из множества таблиц в запросе. Такое множество
может представлять собой одну или несколько таблиц, либо вовсе быть
пустым.
Команда SELECT
в Picodata работает как с глобальными, так и с
шардированными таблицами. В последнем случае части таблицы могут
храниться на нескольких узлах кластера, и SELECT
получит данные о всех
таких частях.
При использовании условии (SELECT... WHERE...
) часть данных будет
отфильтрована. Если никакие данные не удовлетворяют условиям фильтрации,
то в ответе вернется только описание метаданных колонок без самих
кортежей.
Примечание
Кортежи в выводе идут в том порядке, в каком их отдают узлы Picodata. Гарантии порядка не предоставляются.
Синтаксис¶
Проекция¶
Диаграмма
Сканирование¶
Диаграмма
Выражение¶
Диаграмма
Литерал¶
Диаграмма
Параметры¶
-
Псевдоним — позволяет переопределить названия получаемых столбцов в запросах. Псевдоним вставляется после опционального слова
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';