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