Глава 4. Использованиереляционных и булевых операторов
Булевы операторы
SQL распознает основные булевы операторы. Булевы выражения - это те выраже ния, относительно которых, подобно предикатам, можно сказать, истинны они или ложны. Булевы операторы связывают одно или несколько значений "истина/ложь" и в результате получают единственное значение "истина/ложь". Стандартные булевы опе раторы, распознаваемые SQL, - это AND, OR, NОТ. Существуют и другие, более сложные булевы операторы (как, например, "исключающее ИЛИ"), но их можно по строить с помощью трех простых. Булева логика "истина/ложь" представляет собой полный базис для работы цифрового компьютера. Поэтому фактически весь SQL (или какой-либо другой язык программирования) можно свести к булевой логике. Далее пе речислены булевы операторы и основные принципы их действия:
• AND берет два булевых выражения (в виде А AND В) в качестве аргументов и дает в результате истину, если они оба истинны.
• OR два булевых выражения (в виде А OR В) в качестве аргументов и оценивает результат как истину, если хотя бы один из них истинен.
• NOT берет единственное булево выражение (в виде NOT А) в качестве аргу
мента и изменяет его значение с истинного на ложное или с ложного на истин
ное.
Используя предикаты с булевыми операторами, можно значительно увеличить их избирательную мощность. Предположим, необходимо увидеть всех покупателей
(customers) из San Jose, чей рейтинг (rating) превышает 200:
SELECT •
FROM Customers
WHERE city = 'San Jose'
AND rating > 200;
Выходные данные для этого запроса представлены на рис. 4.2. Существует только один покупатель, удовлетворяющий этому условию.
При испоj1ьзовании OR , будут получены сведения обо всех тех покупателях (custoшers}, которые либо проживают в San Jose, либо имеют рейтинг (rating}, превы шающий 200.
SELECT •
FROM Customers
WHERE city = ·san Jose·
OR rating > 200;
Результат выполнения этого запроса представлен на рис. 4.3.
32
Булевы операторы
Рис. 4.1. SELECT с использованием AND
Рис. 4.3. SELECT с использованием OR
NOT дает возможность получить отрицание (противоположное значение) булева выражения. Вот пример запроса с использованием NOT:
SELECT *
FROM Customers
WHERE city = ·san Jose·
OR NOT rating > 200;
33
Глава 4. Использованиереляц1101111ых и булевых операторов
Рис. 4.4. SELECT с использованием NOT
Результат выполнения этого запроса представлен на рис. 4.4.
Все записи, за исключением Grass, были выбраны. Grass не находится в San Jose и его рейтинг превышает 200, таким образом он не удовлетворяет обоим условиям. Каж дая из других строк удовлетворяет либо первому, либо второму условию (либо каждому из них). Заметим, что оператор NOT должен предшествовать булеву выражению, значе
ние которого он должен изменить, но не может располагаться непосредственно перед
оператором сравнения, как это можно сделать во фразе на английском языке. Таким об
разом некорректно вводить
rating NOT > 200
в качестве предиката, несмотря на то, что эту фразу можно легко сформулировать по анrлийски. Отсюда следует ряд проблем. Например, как SQL оценит следующее?
SELECT *
FROM Customers
WHERE NOT city = ·san Jose· OR rating > 200;
Применяется ли NOT к выражению city = 'San Jose' или к двум выражениям: тому, что указано, и выражению rating > 200? В соответствии с приведенной записью пра вильным является первый вариант. SQL применяет NOT только к тому булеву выраже нию, которое непосредственно следует за ним. Можно получить другой результат по
следующей команде:
SELECT * |
|
|
FROM |
Customers |
|
WHERE |
NOT (city |
·san Jose' |
34
Булевы 011ераторы
OR rating > 200);
SQL понимает круглые скобки следующим образом: все то, что расположено внут ри крутлых скобок, вычисляется прежде всего и рассматривается как единственное
выражение по отношению к тому, что расположено за пределами крутлых скобок (это соответствует стандартной интерпретации в математике). Другими словами, SQL из
влекает каждую строку и определяет, выполняется ли для нее условие city = 'San Jose' или rating > 200. Если одно из этих выражений истинно, то булево выражение, распо
ложенное в круглых скобках, тоже истинно. Однако, если булево выражение в круглых
скобках истинно, пре;:щкат в целом ложен, поскольку NOT превращает истину в ложь и наоборот. Результат выполнения этого запроса представлен на рис. 4.5.
Вот преднамеренно усложненный пример. Проследим его логику (результат вы полнения запроса представлен на рис. 4.6):
Рис. 4.5. SELECT с использованием NOT и круглых скобок
SELECT •
FROM Orders
WHERE NOT((odate = 10/03/1990 AND snum > 1002)
OR amt > 2000.00);
Комбинации булевых операторов в сложных выражениях не столь просты, как каж дый из в отдельности. Способ оценки сложного булева выражения следующий: оце нить булево(ы) выражение(ия), имеющее(ие) наибольшую глубину вхождения в круглые скобки, скомбинировать результаты в одно булево выражение, а затем связать
его значение со значениями выражений, имеющих меньшую глубину вхождения в
круглые скобки.
35
Глава 4. Использованиереляционных и булевых операторов
Дадим детальное объяснение оценки рассмотренного выше примера. Наибольшую глубину вхождения в булево выражение имеет предикат: odate = 10/03/1990 and snum > 1002, со связкой AND, образующий булево выражение, которое оценивается как ис тинное для всех тех строк, которые удовлетворяют каждому из этих условий. Это со ставное булево выражение (которое мы назовем булево выражение номер 1 или, для краткости, Bl) соединено с amt > 2000.00 (выражение В2) с помощью OR и образует третье выражение (В3), которое является истинным для данной строки в том случае, если либо Bl либо В2 истинны для этой строки. В3 полностью содержится в круглых скобках, которым предшествует NOT, и образует заключительное булево выражение (В4), которое является условием предиката. Следовательно, В4 - предикат запроса - истинен, если В3 ложен и наоборот. ВЗ ложен, если ложен каждый из Bl и В2. Bl ло жен для строк, в которых либо order date не совпадает с заданным значением 10/03/1990, либо значение snum не превышает 1002. В2 ложен для всех строк, в кото рых значение поля amount не превосходит 2000.00. Любая строка с суммой, превы шающей 2000.00, делает В2 истинным, отсюда В3 тоже истинно, а 84 - ложно. Следовательно, все такие строки исключаются из числа выходных данных. Остаю щиеся строки от 3 октября 1990 года с snum, превышающим 1002 (такой, например, является строка с onum 3001 за октябрь, 3, 1990 с snum 1007), делают В! истинным,
следовательно, и В3 истинно, а значит предикат ложен. Эти записи также исключают
ся из рассмотрения. Оставшиеся строки входят в состав выходных данных (см. рис.
4.6).
Рис. 4.6. Сложный запрос
36