7.3. Списки выбора#

7.3. Списки выбора

7.3. Списки выбора

Как показано в предыдущем разделе, табличное выражение в команде SELECT создает промежуточную виртуальную таблицу, возможно, объединяя таблицы, представления, удаляя строки, группируя и т. д. Эта таблица в конечном итоге передается на обработку списку выбора. Выборка определяет, какие столбцы промежуточной таблицы фактически выводятся.

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

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

SELECT a, b, c FROM ...

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

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

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

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

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

См. Раздел 8.16.5 для получения дополнительной информации о нотации table_name.*.

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

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

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

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

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

Ключевое слово AS обычно необязательно, но в некоторых случаях, когда желаемое имя столбца совпадает с ключевым словом Tantor SE, необходимо написать AS или заключить имя столбца в двойные кавычки, чтобы избежать неоднозначности. (Предметный указатель C показывает, какие ключевые слова требуют использования 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, либо заключать имя выходного столбца в двойные кавычки.

Примечание

Название выходных столбцов здесь отличается от того, что делается в предложении FROM (см. Раздел 7.2.1.2). Возможно переименовать один и тот же столбец дважды, но имя, указанное в выборке, будет передано дальше.

7.3.3. DISTINCT

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

SELECT DISTINCT select_list ...

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

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

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

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

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

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