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 BE, необходимо написать 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, эту конструкцию можно избежать, но она часто является наиболее удобной альтернативой.