2.5. Запрос к таблице#

2.5. Запрос к таблице

2.5. Запрос к таблице

Чтобы получить данные из таблицы, выполняется запрос к таблице. Для этого используется SQL-оператор SELECT. Оператор состоит из выборки (перечисление столбцов, которые должны быть возвращены), списка таблиц (перечисление таблиц, из которых нужно получить данные) и необязательного условия (в котором указываются любые ограничения). Например, чтобы получить все строки таблицы weather, необходимо ввести:

SELECT * FROM weather;

Здесь * означает все столбцы. [2] Такой же результат можно получить с помощью:

SELECT city, temp_lo, temp_hi, prcp, date FROM weather;

Результат должен выглядеть так:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
 San Francisco |      43 |      57 |    0 | 1994-11-29
 Hayward       |      37 |      54 |      | 1994-11-29
(3 rows)

Вы можете писать выражения, а не только простые ссылки на столбцы, в выборке. Например, вы можете сделать так:

SELECT city, (temp_hi+temp_lo)/2 AS temp_avg, date FROM weather;

Должно вернуться следующее:

     city      | temp_avg |    date
---------------+----------+------------
 San Francisco |       48 | 1994-11-27
 San Francisco |       50 | 1994-11-29
 Hayward       |       45 | 1994-11-29
(3 rows)

Обратите внимание, как используется предложение AS для переименования выходного столбца. (Предложение AS является необязательным).

Запрос можно уточнить добавив предложение WHERE, которое указывает, какие строки нужны. Предложение WHERE содержит логическое выражение (проверка истинности), и возвращаются только строки, для которых логическое выражение истинно. В качестве условий уточнения допускаются обычные логические операторы (AND, OR и NOT). Например, следующий запрос извлекает данные о погоде в Сан-Франциско в дождливые дни:

SELECT * FROM weather
    WHERE city = 'San Francisco' AND prcp > 0.0;

Результат:

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 San Francisco |      46 |      50 | 0.25 | 1994-11-27
(1 row)

Можно отсортировать результаты запроса:

SELECT * FROM weather
    ORDER BY city;

     city      | temp_lo | temp_hi | prcp |    date
---------------+---------+---------+------+------------
 Hayward       |      37 |      54 |      | 1994-11-29
 San Francisco |      43 |      57 |    0 | 1994-11-29
 San Francisco |      46 |      50 | 0.25 | 1994-11-27

В этом примере порядок сортировки указан не полностью, поэтому строки с городом Сан-Франциско отражаются в произвольном порядке. Но вы получите результаты, как показано выше, если выполните следующее:

SELECT * FROM weather
    ORDER BY city, temp_lo;

Вы можете указать удаление дублирующихся строк из результата запроса:

SELECT DISTINCT city
    FROM weather;

     city
---------------
 Hayward
 San Francisco
(2 rows)

Здесь снова порядок строк результата может варьироваться. Вы можете получить неизменные результаты, используя DISTINCT и ORDER BY вместе: [3]

SELECT DISTINCT city
    FROM weather
    ORDER BY city;



[2] Хотя SELECT * полезен для быстрых запросов, его использование считается плохим стилем кода для продакшена, так как добавление столбца в таблицу будет менять результаты запроса.

[3] В некоторых системах управления базами данных, включая более старые версии Tantor SE, при использовании DISTINCT строки автоматически упорядочиваются, поэтому ORDER BY необязателен. Однако это не требуется стандартом SQL, и текущая версия Tantor SE не гарантирует, что DISTINCT будет выдавать упорядоченные строки.