Выражение SELECT

Выражение SELECT — это DML-оператор, который применяется для извлечения данных из таблицы или представления.

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

Синтаксис

[ WITH ... ]
SELECT [ DISTINCT ]
    { * | <col_name> | <expression> [ [AS] <alias> ] [,...] }
    [ FROM ... ]
    [ WHERE ... ]
    [ GROUP BY ... ]
    [ HAVING ... ]
    [ QUALIFY ... ]
    [ UNION ... ]
    [ INTERSECT ... ]
    [ EXCEPT ... ]
    [ ORDER BY ... ]
    [ OFFSET ... ]
    [ LIMIT ...]

Параметры

  • DISTINCT
    Указывает, следует ли выполнять удаление дубликатов в наборе результатов.
    Подробное описание см. в разделе Выражение DISTINCT.


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


  • <col_name>
    Указывает идентификатор колонки.


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


  • <alias>
    Задает псевдоним колонки в результирующей таблице.

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

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


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

SELECT
    name,
    department,
    FROM employees;

Примеры

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

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

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

    SELECT DISTINCT name FROM employees;
  • Выводим общее количество строк в таблице employees с помощью агрегатной функции count:

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

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

Список колонок SELECT

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

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

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

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

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

    SELECT * FROM my_table;

Выражение DISTINCT

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

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

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

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

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

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

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

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

Подробное описание см. в разделе Агрегатные функции.

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

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

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

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

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

Подробное описание см. в разделе Оконные функции.