=========== БУЛЕВЫ ОПЕРАТОРЫ ===========
Основные Булевы операторы также распознаются в SQL.Выражения Буля - являются
или верными или неверными, подобно предикатам. Булевы операторы связывают одно или более верных/неверных
значений и производят едиственное верное/или/неверное значение. Стандартными операторами Буля распознаваемыми
в SQL являются: AND, OR, и NOT.
SELECT * FROM Customers WHERE rating > 200;
snum |
cname |
city |
rating |
snum |
2004 |
Crass |
Berlin |
300 |
1002 |
2008 |
Cirneros |
San Jose |
300 |
1007 |
Рисунок 4.1: Использование больше чем (>)
Существуют другие, более сложные, операторы Буля ( типа
" исключенный или " ), но они могут быть сформированы из этих трех простых операторов - AND, OR, NOT.
Операторы Буля и как они работают:
* AND берет два Буля ( в форме A AND B) как аргументы и оценивает их
по отношению к истине, верны ли они оба.
* OR берет два Буля ( в форме A OR B) как аргументы и оценивает
на правильность, верен ли один из них.
* NOT берет одиночный Булев ( в форме NOT A) как аргументы и заменяет
его значение с неверного на верное или верное на неверное.
Связывая предикаты с операторами Буля, вы можете
значительно увеличить их возможности. Предположим вы хотите видеть всех заказчиков в San Jose, которые
имеют оценку(рейтинг) выше 200:
SELECT * FROM Customers WHERE city = " San Jose' AND rating > 200;
Вывод
для этого запроса показан на Рисунке 4.2. Имеется только один заказчик который удовлетворяет этому условию.
Если вы же используете OR вы получите всех заказчиков которые находились в San Jose или(OR) которые имели
оценку выше 200.
SELECT * FROM Customers WHERE city = 'San Jose' AND rating > 200;
сnum |
cname |
city |
rating |
snum |
2008 |
Cirneros |
San Jose |
300 |
1007 |
Рисунок 4.2: SELECT использующий AND SELECT * FROM Customers WHERE city = " San Jose' OR rating > 200;
Вывод для этого запроса показывается в Рисунке 4.3. NOT может использоваться для инвертирования значений
Буля. Имеется пример запроса с NOT:
SELECT * FROM Customers WHERE city = " San Jose' OR NOT rating > 200;
Вывод этого запроса показывается в Рисунке 4.4.
сnum |
cname |
city |
rating |
snum |
2003 |
Liu |
San Jose |
200 |
1002 |
2004 |
Grass |
Berlin |
300 |
1002 |
2008 |
Cirneros |
San Jose |
300 |
1007 |
Рисунок 4.:3: SELECT использующий OR SELECT * FROM Customers WHERE city = 'San Jose' OR NOT rating > 200;
cnum |
cname |
city |
rating |
snum |
2001 |
Hoffman |
London |
100 |
1001 |
2002 |
Giovanni |
Rome |
200 |
1003 |
2003 |
Liu |
San Jose |
200 |
1002 |
2006 |
Clemens |
London |
100 |
1001 |
2008 |
Cirneros |
San Jose |
300 |
1007 |
2007 |
Pereira |
Rome |
100 |
1004 |
Рисунок 4.4: SELECT использующий NOT
Все записи за исключением Grass были выбраны. Grass не был в San Jose,
и его оценка была больше чем 200, так что он потерпел неудачу при обеих проверках. В каждой из других
строк встретился один или другой или оба критериев. Обратите внимание что оператор NOT должен предшествовать
Булеву оператору, чье значение должно измениться, и не должен помещаться перед реляционным оператором.
Например неправильным вводом оценки предиката будет: rating NOT > 200 Он выдаст другую отметку. А как SQL
оценит следующее?
SELECT * FROM Customers WHERE NOT city = " San Jose' OR rating > 200;
NOT применяется
здесь только к выражению city = 'SanJose', или к выражению rating > 200 тоже ? Как и написано, правильный
ответ будет прежним. SQL может применять NOT с выражением Буля только сразу после него. Вы можете получить
другой результат при команде:
SELECT * FROM Customers WHERE NOT( city = " San Jose' OR rating > 200 );
Здесь SQL понимает круглые скобки как означающие, что все внутри них будет оцениваться первым и обрабатываться
как единое выражение с помощью всего что снаружи них ( это является стандартной интерпретацией в математике ).
Другими словами, SQL берет каждую строку и определяет, соответствует ли истине равенство city = " San Jose'
или равенство rating > 200. Если любое условие верно, выражение Буля внутри круглых скобок верно. Однако,
если выражение Буля внутри круглых скобок верно, предикат как единое целое неверен, потому что NOT преобразует
верно в неверно и наоборот. Вывод для этого запроса - показывается в Рисунке 4.5. Имеется намеренно сложный
пример. Посмотрим сможете ли вы проследить его логику (вывод показан в Рисунке 4.6 ):
SELECT * FROM Orders WHERE NOT ((odate = 10/03/1990 AND snum >1002) OR amt > 2000.00);
cnum |
cname |
city |
rating |
snum |
2001 |
Hoffman |
London |
100 |
1001 |
2002 |
Giovanni |
Rome |
200 |
1003 |
2006 |
Clemens |
London |
100 |
1001 |
2007 |
Pereira |
Rome |
100 |
1004 |
Рисунок 4.5: SELECT использующий NOT и вводное предложение
SELECT * FROM Orders WHERE NOT ((odate = 10/03/1990 AND snum > 1002) | | OR amt > 2000.00);
onum |
amt |
odate |
cnum |
snum |
3003 |
767.19 |
10/03/1990 |
2001 |
1001 |
3009 |
1713.23 |
10/04/1990 |
2002 |
1003 |
3007 |
75.75 |
10/04/1990 |
2004 |
1002 |
3010 |
1309.95 |
10/06/1990 |
2004 |
1002 |
Рисунок 4.6: Полный (комплексный) запрос
Несмотря на то что Булевы опреаторы индивидуально просты, они
не так просты когда комбинируются в комплексное выражение. Способ оценки комплекса Булева состоит в том,
чтобы оценивать Булевы выражения наиболее глубоко вложенные в круглых скобках, объединять их в единичное
Булево значение, и затем объединять его с верхними значениями. Имеется подробное объяснение того как пример
выше был вычислен. Наиболее глубоко вложенные выражения Буля в предикате - это odate = 10/03/1990 и
snum > 1002 являются объединеными с помощью AND, формируя одно выражение Буля которое будет оценено как
верное для всех строк в которых встретились оба эти условия. Это составное Булево выражение (которое мы
будем называть Булево номер 1, или B1 для краткости) объдиняется с выражением (amt) > 2000.00 (B2) с
помощью OR, формируя третье выражение (B3), которое является верным для данной строки, если или B1 или
B2 - верны для этой строки. B3 полностью содержится в круглых скобках которым предшествует NOT, формируя
последнее выражение Буля(B4), которое является условием предиката. Таким образом B4, предикат запроса,
- будет верен всякий раз, когда B3 неправилен. B3 - неправилен всегда, когда B1 и B2 - оба неверны. B1
неправилен для строки если дата порядка строки не 10/03/1990, или если значение snum не большее чем 1002.
B2 неправилен для всех строк, значения суммы приобретений которых не превышает 2000.00. Любая строка со
значением выше 2000.00 сделает B2 - верным; в результате B3 будет верен, а B4 нет. Следовательно, все
эти строки будут удалены из вывода. Из оставшихся, строки которые на 3 Октября имеют snum > 1002 ( такие
как строки для onum 3001 на 3 Октября со snum = 1007 ), делают B1 верным, с помощью верного B3 и неверного
предиката запроса. Они будут также удалены из вывода. Вывод показан для строк которые оставлены.