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.
SQL Execution Log
SELECT * FROM Customers WHERE city='San Jose' OR rating > 200;
с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
SQL Execution Log
SELECT * FROM Customers WHERE city='San Jose' OR NOT rating > 200;
сnum
|
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);
SQL Execution Log
SELECT * FROM Customers WHERE NOT
(city='San Jose' OR rating > 200);
сnum
|
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 и вводное предложение
SQL Execution Log
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 - верны для этой строки.
Читать дальше