SQLГлава 4. Использование реляционных и булевых операций для создания более сложных предикатов
В Главе 3 вы узнали, что предикаты могут оценивать равенство в операции как Эта глава будет исследовать другие реляционные операции, используемые в SQL. Вы также узнаете, как использовать булевы операции, чтобы изменять и объединять значения предиката. С помощью булевых операций (или, проще говоря, логических операций) одиночный предикат может содержать любое число условий. Это позволяет создавать очень сложные предикаты. Использование круглых скобок в структуре этих сложных предикатов будет также разъясняться. Реляционные операции
Реляционная операция — математический символ, который указывает на определённый тип сравнения двух значений. Вы уже видели, как используются равенства, такие как
Эти операции имеют стандартное значение для чисел. Для символов их определение зависит от формата преобразования, ASCII или EBCDIC, который вы используете.
SQL сравнивает символьные значения в терминах основных чисел, как определено в формате преобразования. Даже значение символа, такого как "1", который представляет число, не обязательно равняется числу, которое он представляет. Вы можете использовать реляционные операции, чтобы установить алфавитный порядок, например,
И в ASCII, и в EBCDIC символы сортируются по значению: символ имеет значение меньше, чем все другие символы, которым он предшествует в алфавитном порядке и которые имеют с ним один вариант регистра (верхний или нижний). В ASCII все символы верхнего регистра меньше, чем все символы нижнего регистра, поэтому Чтобы сохранить обсуждение более простым, мы допустим, что вы будете использовать текстовый формат ASCII. Проконсультируйтесь в документации вашей системы, если вы не уверены, какой формат вы используете или как он работает.
Значения, сравниваемые здесь, называются скалярными значениями. Скалярные значения производятся скалярными выражениями; Предикаты обычно сравнивают значения скалярных величин, используя реляционные операции или специальные операции SQL, чтобы увидеть, верно ли это сравнение. Некоторые операции/операторы SQL описаны в Главе 5.
Предположим, что вы хотите увидеть всех заказчиков с оценкой ( SELECT * FROM Customers WHERE rating > 200; Вывод для этого запроса показан на Рисунке 4.1. =============== SQL Execution Log ============ | | | SELECT * | | FROM Customers | | WHERE rating > 200; | |===============================================| | snum cname city rating snum | | ----- -------- -------- ----- ----- | | 2004 Crass Berlin 300 1002 | | 2008 Cirneros San Jose 300 1007 | =============================================== Рисунок 4.1 Использование операции "больше" (>) Конечно, если бы мы захотели увидеть ещё и заказчиков с оценкой, равной 200, мы использовали бы предикат rating >= 200 Булевы операцииОсновные булевы операции также распознаются в SQL. Выражения Буля являются или верными (
Стандартными булевыми операциями, распознаваемыми в SQL, являются
Существуют другие, более сложные булевы операции (типа "исключающее ИЛИ"), но они могут быть сформированы из этих трёх простых операций — Как вы можете понять, булева логика верно/неверно основана на цифровой компьютерной операции; и фактически весь SQL (или любой другой язык) может быть сведён до уровня булевой логики. Булевы операции, и как они работают:
Связывая предикаты с булевыми операциями, вы можете значительно расширить их возможности. Предположим, вы хотите видеть всех заказчиков в San Jose, которые имеют оценку (рейтинг) выше 200: SELECT * FROM Customers WHERE city = 'San Jose' AND rating > 200; Вывод для этого запроса показан на Рисунке 4.2. Имеется только один заказчик, который удовлетворяет этому условию. =============== SQL Execution Log ============ | | | 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 Если же вы используете OR, вы получите всех заказчиков, которые находились в San Jose или (OR) которые имели оценку выше 200. SELECT * FROM Customers WHERE city = 'San Jose' OR rating > 200; Вывод для этого запроса показан на Рисунке 4.3. =============== 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 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 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, так что он потерпел неудачу при обеих проверках. В каждой из других строк встретился тот или другой, или оба критерия.
Обратите внимание, что операция rating NOT > 200 Он выдаст другую отметку. А как SQL оценит следующее? SELECT * FROM Customers WHERE NOT city = 'San Jose' OR rating > 200;
NOT применяется здесь только к выражению SELECT * FROM Customers WHERE NOT ( city = 'San Jose' OR rating > 200 );
Здесь SQL понимает круглые скобки как означающие, что всё внутри них будет вычисляться в первую очередь и обрабатываться как единое выражение с помощью всего, что снаружи них (это является стандартной интерпретацией, как в математике). Другими словами, SQL берет каждую строку и определяет, соответствует ли истине равенство =============== SQL Execution Log ============ | | | SELECT * | | FROM Customers | | WHERE NOT (city = 'San Jose' | | OR rating > 200); | |===============================================| | 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 и вводное предложение Вывод для этого запроса показан на Рисунке 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 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 Полный (комплексный) запрос Несмотря на то что булевы операции по отдельности просты, они не так просты, когда комбинируются в комплексное выражение. Способ оценки булева комплекса состоит в том, чтобы оценивать булевы выражения, наиболее глубоко вложенные в круглых скобках, объединять их в единое булево значение, а затем объединять его с вышележащими значениями.
Вот подробное объяснение того, как пример выше был вычислен. Наиболее глубоко вложенные булевы выражения, в предикате это
Таким образом,
Из оставшихся, строки, которые на 3 октября имеют РезюмеВ этой главе вы значительно расширили ваше знакомство с предикатами. Теперь вы можете находить значения, которые связаны с данным значением любым способом, определяемым различными реляционными операциями.
Вы можете также использовать булевы операции
Булева операция Булевы и Реляционные операции могут эффективно управляться с помощью круглых скобок, которые определяют порядок, в котором операции будут выполнены. Эти операции применимы к любому уровню сложности, и вы поняли, как сложные условия могут создаваться из этих простых частей. Теперь, когда мы показали, как используются стандартные математические операции, мы можем перейти к операциям которые являются специфичными для SQL. Это мы сделаем в Главе 5. работа с SQL
См. ответы в Приложении A. |
||