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] В некоторых СУБД, включая старые версии PostgreSQL, реализация предложения DISTINCT
автоматически упорядочивает строки, так что ORDER BY
добавлять не обязательно. Но стандарт SQL этого не требует и текущая версия PostgreSQL не гарантирует определённого порядка строк после DISTINCT
.