Использование предложения WHERE.

С использованием предложения WHERE оператор SELECT имеет следующий формат:

 

SELECT {* | <значение1> [, <значение2> ...]}

FROM <таблица1> [, < таблица2> ...]

WHERE <условия_поиска>

 

В набор данных, который возвращается как результат выполнения оператора SELECT, будут включаться только те записи, которые удовлетворяют условию поиска. Ниже, в соответствующих подразделах, будут рассмотрены варианты формирования разнообразных условий поиска – их для оператора SELECT в SQL имеется достаточное количество, и все вместе они делают оператор исключительно мощным средством для построения запросов к БД.

Существует пять основных типов условий поиска (или предикатов, если пользоваться терминологией ISO).

· Сравнение. Сравниваются результаты вычисления одного выражения с результатами вычисления другого выражения.

· Диапазон. Проверяется, попадает ли результат вычисления выражения в заданный диапазон значений.

· Принадлежность к множеству. Проверяется, принадлежит ли результат вычисления выражений к заданному множеству значений.

· Соответствие шаблону. Проверяется, отвечает ли некоторое строковое значение заданному шаблону.

· Значение NULL. Проверяется, содержит ли данный столбец определитель NULL (неизвестное значение).

Пока разберем два простейших условия поиска.

При сравнении значения столбца с константой в условии поиска в качестве оператора сравнения могут выступать следующие отношения:

= равно < меньше > больше

<= меньше или равно

>= больше или равно

!< не меньше (т.е. больше или равно)

!> не больше (т.е. меньше или равно)

<> не равно

!= не равно

В качестве константы могут выступать строковые и числовые значения, указанные явно.

 

ПРИМЕР

 

Данный оператор реализует функцию выборки (или ограничения) реляционной алгебры.

 

Составьте список библиотекарей у которых табельный номер превышает 80.

 

 

Данная функция выборки реализуется следующим оператором SELECT.

 

SELECT *

FROM Librarians

WHERE ClockNumber>80

 

Напомним, что здесь исходным отношением является отношение Librarians, а предикатом — выражение Clock-Number>80. Операция выборки определяет новое отношение, содержащее только те кортежи отношения Librarians, в которых значение атрибута ClockNumber превышает 80. Результат выполнения этой операции показан в табл. 10.2.

Таблица 10.2.

Результат выполнения операции выборки из отношения Librarians кортежей с атрибутом ClockNumber > 80.

Code Clock-Number FamilyNamе Name Patronymic Pasport-Code Post HomePhone Note
Иноземцева Иванна Модестов-на Ст. биб- лиотекарь 775-34-00 blob
Мальцева Диана Петровна Библио-текарь 29-06-15 blob
Ставка Лилия Ивановна Библио-текарь 22-00-01 blob

 

При сравнении значения столбца одной таблицы со значением столбца из другой таблицы условие поиска имеет вид

 

<имя столбца таблицы 1> <оператор> <имя столбца таблицы 2>

 

ПРИМЕР

 

Данный оператор можно использовать для реализации различных видов соединения отношений. Возьмем пример для тета-соединения.

 

Создайте список всех читателей, которые когда-либо брали книги в библиотеке.

 

 

Напомним, что в примере тета-соединения для составления этого списка использовалось соединение по эквивалентности, но в нем присутствовали два атрибута Readers.Code и ReaderCode, содержащие коды читателей библиотеки. Если бы они имели одинаковое имя, например ReaderCode, то для устранения одного из них можно было бы воспользоваться операцией естественного соединения.

 

Оператор SELECT будет иметь следующий вид:

 

SELECT ReaderCode, FamilyName, Name, BookGiveOutRecord.Code, InventoryCode

FROM BookGiveOutRecord, Readers

WHERE Readers.Code = BookGiveOutRecord. ReaderCode

 

Результат работы оператора SELECT показан в таблице 10.3.

 

Таблица 10.3.

Естественное соединение сокращенного варианта отношений Readers и BookGiveOutRecord (использованы только некоторые атрибуты).

ReaderCode FamilyName Name BookGiveOutRecord.Code InventoryCode
Федорец Ирина
Иванов Петр
Ильин Иван
Суренко Дмитрий

 

При выполнении оператора SELECT для каждого кортежа из отношения BookGiveOutRecord ищется кортеж в таблице Readers, у которой значение атрибута ReaderCode совпадает со значением атрибута Code текущего кортежа отношения Readers.

При этом безразлично, в каком порядке перечислять таблицы в условии поиска, т.е. безразлично, какая из таблиц будет упомянута слева, а какая справа. Таким образом, следующие условия поиска идентичны:

Readers.Code = BookGiveOutRecord.ReaderCode идентично условию

BookGiveOutRecord.ReaderCode = Readers.Code

Напомним, что при тета-соединения соединении двух отношений и логический порядок формирования результирующего отношения можно представить себе следующим образом.

1. Из столбцов, которые указаны после слова SELECT, составляется декартово произведение путем сцепления результирующих столбцов каждой записи из таблицы и результирующих столбцов записи из таблицы .

2. Из получившегося отношения отбрасываются все кортежи, не удовлетворяющие условию поиска в предложении WHERE.

ЗАМЕЧАНИЕ. Определение "логический порядок формирования результирующего отношения" употреблено не случайно. В проектировании данных всегда различают два уровня - логический и физический. Логический уровень - это часто достаточно абстрактный уровень; физический уровень определяет действительно протекающие процессы, в большинстве случаев скрытые от взгляда, не лежащие на поверхности.

Поэтому, когда мы говорим о "логическом порядке выполнения запроса", то подразумеваем, что так нам легче понимать процессы, происходящие при выполнении внутреннего соединения; на самом же деле физические процессы, реально протекающие на сервере БД при выполнении запроса, могут не совпадать с нашим логическим представлением о них.

SQL-сервер при выполнении запроса всегда стремится его оптимизировать согласно заложенных в него алгоримах, то есть выполнить с максимальной быстротой при минимально возможных затратах ресурсов. В частности, оптимизация запросов в InterBase представляет собой "черный ящик", то есть нельзя сказать, как именно будет выполняться конкретный запрос, поскольку, помимо прочего, при оптимизации не последнюю роль играет текущее состояние БД. Подобные вопросы будут рассматриваться ниже в лекции, посвященной оптимизации запросов.