Базовые конструкции оператора SELECT

Оператор 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