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

SELECT

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

Примечание

Кортежи в выводе идут в том порядке, в каком их отдают узлы 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 ( select values ) AS name

Выражение

Диаграмма

NOT table . column literal case cast current_date substr to_char to_date trim NOT EXISTS ( select values ) ( select values ) ( expression , ) IS NOT NULL 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