Оператор SELECT позволяет строить выборки данных по различным критериям. В данном разделе мы будем использовать модельную базу данных, содержащую сведения о скважинах (borehole), образцах (sample), горных породах (rock) и объектах, например, строительных площадках или месторождениях (object). Структура этой базы данных представлена на этой странице.
Обязательными рзделами оператора являются SELECT список полей и FROM список таблиц. Простейшим запрсоом является безусловная выборка данных из одной таблицы.
SELECT borehole_name, borehole_height
FROM borehole
*
При вводе запрсов в клиентских программах после запроса обычно
ставится символ ;, который не является частью запроса,
но позволяет программе определить место окончания запроса.
borehole_name borehole_height X12-5/2 132 X18-1/2 101 Z18-1/2 91 Z02-2/1 120 ZP02-2/6 93 X01-14/8 80 P01-14/1 91 P01-14/2 101 P01-14/X 115
Такой запрос выбирает все записи из таблицы borehole, причём из каждой строки таблицы выбирается только два поля. Список требуемых полей перечисляется после ключевого слова SELECT. Полная форма имени поля имеет вид имя таблицы.имя поля. В приведенном примере это SELECT borehole.borehole_name, borehole.borehole_height. Использование полных имён полей необходимо при выборе из нескольких таблиц, когда краткие имена неоднозначны, о чём будет сказано далее.
Из всего множества записей, попадающих в выборку, средствами оператора SELECT можно отобрать только те, которые необходимы. Для этого используется выражение WHERE, после которого указывается условие фильтрации. Условием фильтрации может быть произвольное логическое выражение, использующее имена столбцов таблиц, перечисленных в выражении FROM запроса. В выражении FROM могут использоваться как полные, так и краткие имена полей, если это не приводит к неоднозначности. Следующий запрос выбирает скважины, верхняя точка которых находятся на высоте 100-125 метров над уровнем моря.
SELECT borehole_name, borehole_height
FROM borehole
WHERE borehole.borehole_height >= 100
AND borehole.borehole_height <= 125
borehole_name borehole_height X18-1/2 101 Z02-2/1 120 P01-14/2 101 P01-14/X 115
Важно: условие фильтрации применяется к одной строке выборки. Нельзя сравнить значения в соседних строчках таблицы.
При выполнении команды SELECT порядок записей в полученной выборке может быть произвольным. Возможно, что при повторном выполнении запроса порядок следования записей изменится. Для сортировки записей в определенном порядке используется выражение ORDER BY. Например, следующий запрос сортирует записи в порядке возрастания значений поля borehole_height, а в случае равенства значений — в порядке убывания названия скважины (в обратном лексикографическом порядке).
SELECT borehole_name, borehole_height
FROM borehole
WHERE borehole.borehole_height >= 100
AND borehole.borehole_height <= 125
ORDER BY borehole_height, borehole_name DESC
borehole_name borehole_height X18-1/2 101 P01-14/2 101 P01-14/X 115 Z02-2/1 120
В списке полей, которые указываются в выражении ORDER BY, могут использоваться любые поля таблиц, перечисленных в выражении FROM. Само поле может не выбираться, то есть не быть указано в выражении SELECT.
Если в выражении FROM указать несколько таблиц через запятую, то в выборку попадут все возможные комбинации строк этих таблиц. Так, если в одной таблице 3 строки, а в другой 7, то в случае выбора из этих таблиц выборка будет состоять из 21 строчки. Обычно строчки одной таблицы соединяются со строчками другой по некоторому условию. В нашем случае таблица borehole содержит поле object_id, значениями которого являются первичные ключи таблицы object. Такая связь логически означает, что скважина относится к указанному объекту исследований. Поэтому логично соединять строки по условию совпадения этих значений: к строке с описанием скважины можно "прикрепить" описание соотвествующего объекта. Это можно сделать двумя способами.
SELECT borehole_name, object_name
FROM borehole, object
WHERE object.object_id = borehole.object_id
В данном случае строится произведение таблиц, из которого удаляются "лишние" записи. Заметим, что использование полных имён полей в этом запросе необходимо, так как поле object_id есть в обоих таблицах.
Второй способ соединения таблиц по сути эквивалентен указанному, но использует специальный синтаксис, разработанный для соединения таблиц.
SELECT borehole_name, object_name
FROM borehole
JOIN object ON object.object_id = borehole.object_id
В современных приложениях следует использовать синтаксис JOIN. Он позволяет явно укзать условие соединения таблиц, а не "выискивать" его среди других частей выражения WHERE.
SELECT borehole_id, COUNT(*)
FROM sample
GROUP BY borehole_id
Пример более сложного запроса.
SELECT object.object_name
, borehole.borehole_name
, COUNT(*) AS num_samples
FROM sample
JOIN borehole ON borehole.borehole_id = sample.borehole_id
JOIN object ON object.object_id = borehole.object_id
WHERE borehole.borehole_height <= 100 AND sample.sample_height > 15
GROUP BY object.object_name, borehole.borehole_name
ORDER BY num_samples DESC