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

Эта таблица, наконец, передается для обработки списком выбора . Список выбора определяет, какие столбцы промежуточной таблицы фактически выводятся.

Элементы списка выбора

Самый простой вид списка выбора — это список, в *котором выводятся все столбцы, созданные табличным выражением. В противном случае список выбора представляет собой список выражений значений, разделенных запятыми. Например, это может быть список имен столбцов:

SELECT a, b, c FROM ...

Имена столбцов a, bи cявляются либо фактическими именами столбцов таблиц, на которые есть ссылки в FROMпредложении, либо присвоенными им псевдонимами. Пространство имен, доступное в списке выбора, такое же, как и в WHEREпредложении, если только не используется группировка, и в этом случае оно такое же, как в HAVINGпредложении.

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

SELECT tbl1.a, tbl2.a, tbl1.b FROM ...

При работе с несколькими таблицами также может быть полезно запросить все столбцы конкретной таблицы:

SELECT tbl1.*, tbl2.a FROM ...

Если в списке выбора используется выражение произвольного значения, оно концептуально добавляет новый виртуальный столбец в возвращаемую таблицу. Выражение значения оценивается один раз для каждой строки результата, при этом значения строки заменяются любыми ссылками на столбцы. Но выражения в списке выбора не должны ссылаться ни на какие столбцы в табличном выражении FROMпредложения; например, они могут быть постоянными арифметическими выражениями.

Метки столбцов

Записям в списке выбора можно присвоить имена для последующей обработки, например, для использования в ORDER BYпредложении или для отображения клиентским приложением. Например:

SELECT a AS value, b + c AS sum FROM ...

Если имя выходного столбца не указано с помощью AS, система назначает имя столбца по умолчанию. Для простых ссылок на столбцы это имя столбца, на который делается ссылка. Для вызовов функций это имя функции. Для сложных выражений система сгенерирует общее имя.

Ключевое ASслово обычно является необязательным, но в некоторых случаях, когда желаемое имя столбца совпадает с ключевым словом PostgreSQL , вы должны написать ASимя столбца или заключить его в двойные кавычки, чтобы избежать двусмысленности. Например, FROMэто одно из таких ключевых слов, так что это не работает:

SELECT a from, b + c AS sum FROM ...

но любой из них:

SELECT a AS from, b + c AS sum FROM ...
SELECT a "from", b + c AS sum FROM ...

Для наибольшей безопасности от возможного добавления ключевых слов в будущем рекомендуется всегда либо писать ASимя выходного столбца, либо заключать его в двойные кавычки.

DISTINCT

После обработки списка выбора из таблицы результатов можно дополнительно удалить повторяющиеся строки. Ключевое DISTINCTслово пишется сразу после SELECT, чтобы указать это:

SELECT DISTINCT select_list ...

(Вместо DISTINCTключевого слова ALLможно использовать для указания поведения по умолчанию сохранения всех строк.)

Очевидно, что две строки считаются различными, если они отличаются хотя бы в одном значении столбца. Нулевые значения считаются равными в этом сравнении.

Кроме того, произвольное выражение может определить, какие строки следует считать различными:

SELECT DISTINCT ON (expression [, expression ...]) select_list ...

Вот expressionпроизвольное выражение значения, которое оценивается для всех строк. Набор строк, для которого все выражения равны, считается дубликатом, и в выходных данных сохраняется только первая строка набора. Обратите внимание, что « первая строка » набора непредсказуема, если только запрос не отсортирован по достаточному количеству столбцов, чтобы гарантировать уникальный порядок строк, попадающих в DISTINCTфильтр. ( DISTINCT ONобработка происходит после ORDER BYсортировки.)

Предложение DISTINCT ONне является частью стандарта SQL и иногда считается дурным стилем из-за потенциально неопределенного характера его результатов. При разумном использовании GROUP BYи подзапросов в FROM, этой конструкции можно избежать, но часто это самая удобная альтернатива.