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

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

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

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

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

SELECT a, b, c FROM ...

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

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

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

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

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

(См. также Section 7.2.2.)

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

7.3.2. Метки колонок

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

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

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

Ключевое слово AS является необязательным, но только, если новое имя колонки не совпадает с другими ключевыми словами PostgreSQL (см. Appendix C). Чтобы избежать нежелательного совпадения с ключевым словом, вы можете заключить имя колонки в двойные кавычки. Например, VALUE является ключевым словом, так что такой запрос не работает:

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

а вот такой будет работать:

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

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

Note: Именование выходных колонок здесь отличается от того, что в предложении FROM (см. Section 7.2.1.2). Возможно переименовать одну и ту же колонку дважды, но имя, назначаемое в списке выбора является одним из тех, что передаются в него.

7.3.3. DISTINCT

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

SELECT DISTINCT список_выбора ...

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

В общем случае, две строки считаются отличными друг от друга, если они различаются хотя бы одним значением колонки. Значения при сравнении NULL считаются равными.

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

SELECT DISTINCT ON (выражение [, выражение ...]) список_выбора ...

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

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

Back to top

(С) Виктор Вислобоков, 2008-2023