Comments 6
Заодно, она самостоятельно задает ... их типы - если мы не указали специально тип значения в поле, то будет выбран наиболее подходящий из трех стандартных вариантов:
integer
,numeric
илиtext
.
Тут необходимо указать, что выбор типа данных выполняется по самой первой строке значений (что демонстрирует пример чуть ниже, с ошибкой типа данных).
Помимо статичных значений, в
VALUES
могут также использоватьсяNULL
-значения, числовые значения в экспоненциальной форме и результаты вычисления выражений
Немного шире - в качестве элементов блока значений могут использоваться любые выражения, которые могут быть приведены к скалярному типу. Даже подзапросы.
values (1,2),(3,(select id from mytable order by created_at limit 1));
Маленькая тонкость - в отличие от литералов и выражений, подзапрос должен быть обёрнут в дополнительные скобки, которые и выполняют эту "скаляризацию".
Ограничения результата
Просмотрел весь блок - нигде не указано, что использование лимитирования (в любой синтаксической форме) совершенно бессмысленно, если оно не сопровождается выражением сортировки, причём во всех случаях, кроме использования WITH TIES, обеспечивающем уникальность записей по критерию сортировки. Без сортировки, как указано в блоке Порядок вывода строк (ORDER BY), порядок вывода в группе с равным значением выражения сортировки не определён, а возвращаемый результат соответственно недетерминирован. По моему мнению, эту истину следует повторять везде, где можно и где не можно, да ещё большими жирными буквами - начинающие сплошь и рядом о ней забывают.
Некоторые почему-то считают, что
OFFSET
нельзя указывать безLIMIT
, но это не так:
VALUES
('a')
, ('b')
, ('c')
OFFSET 1;
-- a
-- b
??? OFFSET нумерует строки, начиная с нуля. Так что приведённый запрос должен вернуть последние две записи, т.е. 'b' и 'c'. Конечно, в данном случае сервер волен в выборе порядка, ибо отсутствует ORDER BY, но в обычных условиях он не стремится пересортировывать список - лишняя работа.
один описывает порядок, имена и типы столбцов, укацук
Понятно, что опечатка - но хотелось бы конкретики.
Либо в качестве имени столбца будет взято имя функции (
random, generate_series, ...
) или оператора (CASE, coalesce, nullif, ...
).
Только в случае, если функция/оператор являются "самым последним действием" при вычислении выражения. Иначе получим безымянный столбец.
Кроме того, если два поля используют один и тот же топ-оператор/функцию, в результирующем наборе мы получим два одноимённых поля. И, если захотим обратиться по этому имени (скажем, это подзапрос) - получим ошибку ambiguous name. Всё - аналогично поведению, описанному в блоке по секции FROM.
Исключение дублей (DISTINCT)
Группировка строк (GROUP BY)
Считаю, что нужно явно описать случай, когда запись содержит NULL в выражении уникализации/группировки. Для начинающих поведение сервера в этом случае неочевидно.
??? OFFSET нумерует строки, начиная с нуля. ... укацук
Спасибо, поправил.
Только в случае, если функция/оператор являются "самым последним действием" при вычислении выражения. Иначе получим безымянный столбец.
Это не понял. Можно пример?
Считаю, что нужно явно описать случай, когда запись содержит NULL в выражении уникализации/группировки. Для начинающих поведение сервера в этом случае неочевидно.
Согласен, расширил.
Даже в Калининграде есть офис ваш, а на Сахалине у нас или во Владике нет ничего. Тут люди тоже хотят в айти с московскими зп.
Курс «PostgreSQL для начинающих»: #2 — Простые SELECT