SQL в PostgreSQL: запрос к таблице

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

SELECT * FROM weather;

Здесь * сокращенное обозначение "все столбцы".

Таким образом, такой же результат будет с:

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 * полезен для нестандартных запросов, он считается плохим стилем в производственном коде, поскольку добавление столбца в таблицу изменит результаты.

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

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 вместе:

SELECT DISTINCT city
    FROM weather
    ORDER BY city;

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


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий