Грубер Мартин
Шрифт:
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.
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
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);
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 |