Выражение SELECT

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

Синтаксис

Выбор всех столбцов

[ ... ]
SELECT [ { ALL | DISTINCT } ]
       [ TOP <n> ]
       [{<object_name>|<alias>}.]*

       [ ILIKE '<pattern>' ]

       [ EXCLUDE
         {
           <col_name> | ( <col_name>, <col_name>, ... )
         }
       ]

       [ REPLACE
         {
           ( <expr> AS <col_name> [ , <expr> AS <col_name>, ... ] )
         }
       ]

       [ RENAME
         {
           <col_name> AS <col_alias>
           | ( <col_name> AS <col_alias>, <col_name> AS <col_alias>, ... )
         }
       ]

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

SELECT * ILIKE ... REPLACE ...
SELECT * ILIKE ... RENAME ...
SELECT * ILIKE ... REPLACE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ...
SELECT * EXCLUDE ... RENAME ...
SELECT * EXCLUDE ... REPLACE ... RENAME ...
SELECT * REPLACE ... RENAME ...

Выбор определенных столбцов

[ ... ]
SELECT [ { ALL | DISTINCT } ]
       [ TOP <n> ]
       {
         [{<object_name>|<alias>}.]<col_name>
         | [{<object_name>|<alias>}.]$<col_position>
         | <expr>
       }
       [ [ AS ] <col_alias> ]
       [ , ... ]
[ ... ]

В списке столбцов поддерживается конечная запятая. Например, поддерживается следующее выражение SELECT:

SELECT emp_id,
       name,
       department,
    FROM employees;

Параметры

  • ALL | DISTINCT
    Указывает, следует ли выполнять удаление дубликатов в наборе результатов:

    • ALL включает все значения в набор результатов.

    • DISTINCT удаляет дубликаты из набора результатов.

    По умолчанию: ALL
    Подробное описание см. в разделе Выражение DISTINCT.


  • <object_name> или <alias>
    Указывает идентификатор объекта или псевдоним объекта (как определено в выражении FROM).


  • * (звездочка)
    Звездочка является сокращением, обозначающим, что в выводе должны быть указаны все столбцы указанного объекта или все столбцы всех объектов, если * не сопровождается именем объекта или псевдонимом.
    Подробное описание см. в разделе Выражение со звездочкой *.


  • <col_name>
    Указывает идентификатор столбца (как определено в выражении FROM).


  • $<col_position>
    Указывает положение столбца (начиная с 1) в соответствии с определением в выражении FROM. Если на столбец есть ссылка из таблицы, это число не может превышать максимальное количество столбцов в таблице.


  • <expr>
    Указывает выражение (например математическое), которое вычисляется как определенное значение для любой заданной строки.


  • [ AS ] <col_alias>
    Указывает псевдоним столбца, назначенный результирующему выражению. Он используется в качестве отображаемого имени в списке SELECT верхнего уровня и в качестве имени столбца во встроенном представлении.

    Не назначайте такой псевдоним столбца, который будет совпадать с именем другого столбца, на который есть ссылка в запросе. Например, если вы выбираете столбцы с именами prod_id и product_id, не назначайте псевдоним product_id столбцу prod_id.

    См. также раздел Оператор AS


  • ILIKE <pattern>
    Указывает, что в результаты запроса должны быть включены только столбцы, соответствующие заданному шаблону.
    В шаблоне можно использовать следующие выражения SQL:

    • Cимвол подчеркивания _ для сопоставления с любым одиночным символом.

    • Символ процента % для сопоставления с любой последовательностью из нуля или более символов.


  • EXCLUDE <col_name> или
    EXCLUDE (<col_name_1>, <col_name_2>, …​)
    Указывает столбцы, которые должны быть исключены из результатов запроса.


  • REPLACE (<expr> AS <col_name> [ , <expr> AS <col_name>, …​] )
    Replaces the value of col_name with the value of the evaluated expression expr. Заменяет значение указанного столбца на результат применения выражения <expr> к его исходному значению.


  • RENAME <col_name> AS <col_alias> или
    RENAME (<col_name_1> AS <col_alias_1>, <col_name_2> AS <col_alias_2>, …​)
    Указывает псевдонимы столбцов, которые будут использованы в результатах запроса.


  • TOP <n>
    Указывает максимальное количество строк, которые будут результатом запроса.

Примеры

  • Выбираем все столбцы из таблицы с именем my_table:

    SELECT * FROM my_table;
  • Выполняем арифметические действия над столбцами таблицы и указываем псевдоним:

    SELECT column_1 + column_2 AS sum, sqrt(column_1) AS sq_root FROM my_table;
  • Используем префиксные псевдонимы для получения того же результата:

    SELECT
        sum: column_1 + column_2,
        sq_root: sqrt(column_1)
    FROM my_table;
  • Выбираем все уникальные имена из таблицы employees (работники):

    SELECT DISTINCT name FROM employees;
  • Выводим общее количество строк в таблице employees:

    SELECT count(*) FROM employees;
  • Выбираем все столбцы, кроме столбца name, из таблицы employees:

    SELECT * EXCLUDE (name) FROM employees;
  • Выбираем все столбцы из таблицы employees, но заменяем name на результат применения функции lower(name):

    SELECT * REPLACE (lower(name) AS name) FROM employees;
  • Выбираем из таблицы все столбцы, соответствующие заданному регулярному выражению:

    SELECT COLUMNS('number\d+') FROM employees;
  • Вычисляем функцию по всем заданным столбцам таблицы:

    SELECT min(COLUMNS(*)) FROM employees;
  • Используем двойные кавычки ("), чтобы выбрать столбцы с пробелами или специальными символами:

    SELECT "Фамилия Имя Отчество" FROM employees;

Список столбцов SELECT

Выражение SELECT содержит список выражений, которые определяют результат запроса. Список SELECT может ссылаться на любые столбцы в выражении FROM и объединять их с помощью выражений. Поскольку результатом SQL-запроса является таблица, каждое выражение в выражении SELECT также имеет имя. Выражения могут быть явно названы с помощью оператора AS (например, expr AS name). Если пользователь не указал имя, то выражения именуются системой автоматически.

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

Выражение со звездочкой *

Выражение со звездочкой (*) — это специальное выражение, которое расширяется до множества выражений на основе содержимого выражения FROM. В простейшем случае * расширяется до всех выражений в выражении FROM. Столбцы также можно выбирать с помощью регулярных выражений или лямбда-функций.

  • Выбираем все столбцы из таблицы с именем my_table:

    SELECT * FROM my_table;

Выражение DISTINCT

Выражение DISTINCT можно использовать для получения только уникальных строк в результате — таким образом, все дубликаты будут отфильтрованы.

  • Выбираем все уникальные имена из таблицы employees:

    SELECT DISTINCT name FROM employees;
Запросы, начинающиеся с SELECT DISTINCT, выполняют дедупликацию, которая является дорогостоящей операцией. Поэтому используйте DISTINCT только в случае необходимости.

Выражение DISTINCT ON

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

Выбираем сотрудника с наибольшей зарплатой для каждого отдела:

SELECT DISTINCT ON(department) name, salary
    FROM employees
    ORDER BY salary DESC;
При запросе больших наборов данных использование DISTINCT для всех столбцов может быть дорогостоящей операцией. Поэтому рассмотрите возможность использования DISTINCT ON для столбца (или набора столбцов), гарантирующего достаточную степень уникальности результатов. Например, использование DISTINCT ON для ключевого столбца (столбцов) таблицы гарантирует полную уникальность.

Агрегатные функции

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

  • Получаем общее количество строк в таблице сотрудников:

    SELECT count(*) FROM employees;
  • Получаем общее количество строк в таблице сотрудников, сгруппированных по отделам:

    SELECT department, count(*)
        FROM employees
        GROUP BY department;

Оконные функции

Оконные функции — это специальные функции, которые позволяют вычислять значения относительно других строк в результате. Оконные функции обозначаются выражением OVER, которое содержит спецификацию окна.

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

  • Получаем столбец row_number, содержащий инкрементные идентификаторы для каждой строки таблицы зарплат:

    SELECT row_number() OVER ()
        FROM salaries;
  • Вычисляем разницу между текущей и предыдущей суммой в порядке убывания времени:

    SELECT amount - lag(amount) OVER (ORDER BY time)
        FROM salaries;