Запросы к таблицам

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

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

SELECT * FROM weather;

Здесь * означает "все колонки"). [1] So the same result would be had with:

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

В этом примере порядок сортировки задан неполностью и таким образом вы можете получить строки, содержащие San Francisco в произвольном порядке. Но всегда можете получить результат в том виде, как он показан выше, если применить

SELECT * FROM weather
    ORDER BY city, temp_lo;

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

SELECT DISTINCT city
    FROM weather;

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

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

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

Notes

[1]

В то время как выражение SELECT * полезно для off-the-cuff запросов, его использование в продуктивном коде является плохим стилем, так как добавление колонки в таблицу приведёт к изменению результатов запроса.

[2]

В некоторых СУБД, включая старые версии PostgreSQL, реализация DISTINCT автоматически сортирует строки и таким образом, использование ORDER BY не является обязательным. Но такое поведение не требуется стандартом SQL и текущая версия PostgreSQL не гарантирует, что при использовании DISTINCT строки результата будут отсортированы.

Back to top

(С) Виктор Вислобоков, 2008-2010