Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 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

Источник: https://studfile.net/preview/16418473/