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 BE, при использовании DISTINCT
строки автоматически упорядочиваются, поэтому ORDER BY
необязателен. Однако это не требуется стандартом SQL, и текущая версия Tantor BE не гарантирует, что DISTINCT
будет выдавать упорядоченные строки.