В SQL используется множество условий отбора, позволяющих эффективно и естественно создавать различные типы запросов. Ниже рассматриваются пять основных условий отбора (в стандарте ANSI/ISO они называются предикатами):
- Сравнение. Значение одного выражения сравнивается со значением другого выражения. Например, такое условие отбора используется для выбора всех офисов, находящихся в восточном регионе, или всех служащих, фактические объемы продаж которых превышают плановые.
- Проверка на принадлежность диапазону. Проверяется, попадает ли указанное значение в определенный диапазон значений. Например, такое условие отбора используется для нахождения служащих, фактические объемы продаж которых превышают
$100000
, но меньше$500000
. - Проверка наличия во множестве. Проверяется, совпадает ли значение выражения с одним из значений из заданного множества. Например, такое условие отбора используется для выбора офисов, расположенных в Нью- Йорке, Чикаго или Лос-Анджелесе.
- Проверка на соответствие шаблону. Проверяется, соответствует ли строковое значение, содержащееся в столбце, определенному шаблону. Например, такое условие отбора используется для выбора клиентов, имена которых начинаются с буквы "
Е
". - Проверка на равенство значению NULL. Проверяется, содержится ли в столбце значение
NULL
. Например, такое условие отбора используется для нахождения всех служащих, которым еще не был назначен менеджер.
Предыдущие статьи:
- Простейщие запросы SQL: оператор SELECT
- Вычисления в SQL запросах Select
- Выборка всех данных из таблицы
- SELECT DISTINCT - выборка уникальных значений
- WHERE: отбор по условию в операторе SELECT
Сравнение (=, о, <, <=, >, >=)
Наиболее распространенным условием отбора в SQL является сравнение. При сравнении SQL вычисляет и сравнивает значения двух SQL-выражений для каждой строки данных. Выражения могут быть как очень простыми, например содержать одно имя столбца или константу, так и более сложными, например содержать арифметические операции. В SQL имеется шесть различных способов сравнения двух выражений, показанных на рис. 6.
Рис. 6. Синтаксическая диаграмма сравнения
Ниже приведены типичные примеры сравнения.
Найти имена всех служащих, принятых на работу до 2006 года.
SELECT NAME
FROM SALESREPS
WHERE HIRE_DATE < '2006-01-01';
NAME
------------
Sue Smith
Bob Smith
Dan Roberts
Paul Cruz
Заметим, что не все SQL-продукты обрабатывают даты одинаково, поскольку разные производители были вынуждены поддерживать даты еще до того, как был создан стандарт SQL. Формат YYYY-MM-DD
, показанный в предыдущем примере, работает в большинстве продуктов, но кое-где его следует изменить. В Oracle, например, вам надо либо заменить формат даты на принятый в Oracle по умолчанию ('01-JAN-88'
), либо изменить формат по умолчанию для вашей сессии при помощи следующей команды:
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';
Вывести список офисов, фактические объемы продаж в которых составили менее 80 процентов от плановых.
SELECT CITY, SALES, TARGET
FROM OFFICES
WHERE SALES < (.8 * TARGET);
CITY SALES TARGET
------- ------------ ------------
Denver $186,042.00 $300,000.00
Вывести список офисов, менеджером которых не является служащий с идентификатором 108.
SELECT CITY, MGR
FROM OFFICES
WHERE MGR <> 108;
CITY MGR
--------- ----
New York 106
Chicago 104
Atlanta 105
Как показано на рис. 6, в соответствии со спецификацией ANSI/ISO проверка на неравенство записывается как А <> B
. В ряде реализаций SQL используются альтернативные системы записи, как, например, А != B
(поддерживается в SQL Server, DB2, Oracle и MySQL). Иногда такая форма записи является одной из допустимых, а иногда — единственной.
Когда СУБД сравнивает значения двух выражений, могут быть получены три результата:
- если сравнение истинно, то результат проверки имеет значение
TRUE
; - если сравнение ложно, то результат проверки имеет значение
FALSE
; - если хотя бы одно из двух выражений имеет значение
NULL
, то результатом сравнения будетNULL
.
Выборка одной строки
Чаще всего используется сравнение, в котором определяется, равно ли значение столбца некоторой константе. Если этот столбец представляет собой первичный ключ, то запрос возвращает всего одну строку, как в следующем примере.
Узнать имя и лимит кредита клиента с идентификатором 2107.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE CUST_NUM = 2107;
COMPANY CREDIT_LIMIT
------------------ -------------
Ace International $35,000.00
Этот тип запросов лежит в основе выборки из баз данных на основе форм вебстраниц. Пользователь вводит в форму идентификатор клиента, и программа использует его при создании и выполнении запроса. После этого она отображает извлеченные данные в форме. Обратите внимание на то, что инструкции SQL, предназначенные для выбора конкретного клиента по идентификатору, как в предыдущем примере, и для выбора всех клиентов, удовлетворяющих определенным параметрам (например, с лимитом кредита более $25000), имеют абсолютно одинаковый формат.
Значения NULL
Использование значений NULL
в запросах может привести к ''очевидным" предположениям, которые истинны только на первый взгляд, но на самом деле таковыми не являются. Например, можно предположить, что каждая строка из таблицы SALESREPS
будет содержаться в результатах только одного из двух следующих запросов.
Вывести список служащих, превысивших плановый объем продаж.
SELECT NAME
FROM SALESREPS
WHERE SALES > QUOTA;
NAME
------------
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Dan Roberts
Larry Fitch
Paul Cruz
Вывести список служащих, не выполнивших план.
SELECT NAME
FROM SALESREPS
WHERE SALES <= QUOTA;
NAME
--------------
Bob Smith
Nancy Angelli
Однако результаты этих запросов состоят из семи и двух строк соответственно, что дает в сумме девять строк, в то время как в таблице находится десять строк. Строка для Тома Снайдера (Tom Snyder) содержит значение NULL
в столбце QUOTA
, поскольку ему еще не был назначен плановый объем продаж. Эта строка не вошла ни в один запрос.
Как показывает приведенный пример, при определении условия отбора необходимо помнить об обработке значений NULL. В трехзначной логике, принятой в SQL, условие отбора может иметь значения TRUE
, FALSE
или NULL
. А в результаты запроса попадают только те игроки, для которых условие отбора равно TRUE
. Мы еще встретимся с NULL
позже в этой статье.
Проверка на принадлежность диапазону (BETWEEN)
Следующей формой условия отбора является проверка на принадлежность диапазону значений (оператор BETWEEN ... AND
), схематически изображенная на рис. 7. При этом проверяется, находится ли элемент данных между двумя заданными значениями. В условие отбора входят три выражения. Первое выражение определяет проверяемое значение; второе и третье выражения определяют нижнюю и верхнюю границы проверяемого диапазона. Типы данных трех выражений должны быть сравнимыми.
Рис. 7. Синтаксическая диаграмма проверки на принадлежность диапазону (between)
Следующий пример иллюстрирует типичную процедуру проверки на принадлежность диапазону.
Найти все заказы, сделанные в последнем квартале 2007 года.
SELECT ORDER_NUM, ORDER_DATE, MFR, PRODUCT, AMOUNT
FROM ORDERS
WHERE ORDER_DATE BETWEEN '2007-10-01' AND '2007-12-31';
ORDER_NUM ORDER_DATE MFR PRODUCT AMOUNT
---------- ----------- ---- -------- -----------
112961 2007-12-17 REI 2A44L $31,500.00
112968 2007-10-12 ACI 41004 $3,978.00
112963 2007-12-17 ACI 41004 $3,276.00
112983 2007-12-27 ACI 41004 $702.00
112979 2007-10-12 ACI 4100Z $15,000.00
112992 2007-11-01 ACI 41002 $760.00
112975 2007-10-12 REI 2A44G $2,100.00
112987 2007-12-31 ACI 4100Y $27,500.00
При проверке на принадлежность диапазону верхняя и нижняя границы считаются частью диапазона, поэтому в результаты запроса вошли заказы, сделанные 1 октября и 31 декабря. Далее приведен другой пример проверки на принадлежность диапазону.
Найти заказы, стоимости которых попадают в различные диапазоны.
SELECT ORDER_NUM, AMOUNT
FROM ORDERS
WHERE AMOUNT BETWEEN 20000.00 AND 29999.99;
ORDER_NUM AMOUNT
---------- -----------
113036 $22,500.00
112987 $27,500.00
113042 $22,500.00
SELECT ORDER_NUM, AMOUNT
FROM ORDERS
WHERE AMOUNT BETWEEN 30000.00 AND 39999.99;
ORDER_NUM AMOUNT
---------- -----------
112961 $31,500.00
113069 $31,350.00
SELECT ORDER_NUM, AMOUNT
FROM ORDERS
WHERE AMOUNT BETWEEN 40000.00 AND 49999.99;
ORDER_NUM AMOUNT
---------- -----------
113045 $45,000.00
Инвертированная версия проверки на принадлежность диапазону (NOT between
) позволяет выбрать значения, которые лежат за пределами диапазона, как в следующем примере.
Вывести список служащих, фактические объемы продаж которых не попадают в диапазон от 80 до 720 процентов плана.
SELECT NAME, SALES, QUOTA
FROM SALESREPS
WHERE SALES NOT BETWEEN (.8 * QUOTA) AND (1.2 * QUOTA);
NAME SALES QUOTA
-------------- ------------ ------------
Mary Jones $392,725.00 $300,000.00
Sue Smith $474,050.00 $350,000.00
Bob Smith $142,594.00 $200,000.00
Nancy Angelli $186,042.00 $300,000.00
Проверяемое выражение, задаваемое в операторе BETWEEN
, может быть любым допустимым выражением SQL, однако на практике оно обычно представляет собой имя столбца.
В стандарте ANSI/ISO определены относительно сложные правила обработки значений NULL
в проверке BETWEEN
.
- Если проверяемое выражение имеет значение
NULL
либо оба выражения, определяющие диапазон, равныNULL
, то проверкаBETWEEN
возвращаетNULL
. - Если выражение, определяющее нижнюю границу диапазона, имеет значение
NULL
, то проверка between возвращает false, когда проверяемое значение больше верхней границы диапазона, иNULL
— в противном случае. - Если выражение, определяющее верхнюю границу диапазона, имеет значение
NULL
, то проверка between возвращает false, когда проверяемое значение меньше нижней границы диапазона, иNULL
— в противном случае.
Однако прежде чем полагаться на эти правила, неплохо было бы поэкспериментировать со своей СУБД.
Необходимо отметить, что проверка на принадлежность диапазону не расширяет возможности SQL, поскольку ее можно выразить в виде двух сравнений. Проверка
A BETWEEN В AND С
полностью эквивалентна сравнению
(А > = В) AND (А <= С)
Тем не менее проверка BETWEEN
является более простым способом выразить условие отбора в терминах диапазона значений.
Проверка наличия во множестве (IN)
Еще одним распространенным условием отбора является проверка на наличие во множестве (in), схематически изображенная на рис. 8. В этом случае выполняется проверка, соответствует ли значение какому-либо элементу заданного списка. Ниже приведен ряд запросов с использованием проверки наличия во множестве.
Рис. 8. Синтаксическая диаграмма проверки наличия во множестве (IN)
Вывести список служащих, которые работают в Нью-Йорке, Атланте или Денвере.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE REP_OFFICE IN (11, 13, 22);
NAME QUOTA SALES
-------------- ------------ ------------
Bill Adams $350,000.00 $367,911.00
Mary Jones $300,000.00 $392,725.00
Sam Clark $275,000.00 $299,912.00
Nancy Angelli $300,000.00 $186,042.00
Найти все заказы, сделанные в пятницы в январе 2008 года.
SELECT ORDER_NUM, ORDER_DATE, AMOUNT
FROM ORDERS
WHERE ORDER_DATE IN ('2008-01-04', '2008-01-11',
'2008-01-18', '2008-01-25');
ORDER_NUM ORDER_DATE AMOUNT
---------- ----------- ----------
113012 2008-01-11 $3,745.00
113003 2008-02-25 $5,625.00
Найти все заказы, полученные четырьмя конкретными служащими.
SELECT ORDER_NUM, REP, AMOUNT
FROM ORDERS
WHERE REP IN (107, 109, 101, 103);
ORDER_NUM REP AMOUNT
---------- ---- -----------
112968 101 $3,978.00
113058 109 $1,480.00
112997 107 $652.00
113062 107 $2,430.00
113069 107 $31,350.00
112975 103 $2,100.00
113055 101 $150.00
113003 109 $5,625.00
113057 103 $600.00
113042 101 $22,500.00
С помощью проверки NOT IN
можно проверить, что элемент данных не является членом заданного множества. Проверяемое выражение в операторе IN
может быть любым допустимым SQL-выражением, однако обычно оно представляет собой короткое имя столбца, как в предыдущих примерах. Если результатом проверяемого выражения является значение null, то проверка in также возвращает NULL
. Все элементы в списке заданных значений должны иметь один и тот же тип данных, который должен быть сравним с типом данных проверяемого выражения.
Как и проверка BETWEEN
, проверка IN
не добавляет в возможности SQL ничего нового, поскольку условие
X IN (А, В, С)
полностью эквивалентно условию
(X = A) OR (X = В) OR (X = С)
Однако проверка IN
предлагает гораздо более эффективный способ выражения условия отбора, особенно если множество содержит большое число элементов.
В стандарте ANSI/ISO не определено максимальное количество элементов множества, и в большинстве СУБД явный верхний предел не задан. По соображениям переносимости, лучше избегать множеств, содержащих один элемент.
CITY IN ('New York')
Их следует заменять простым сравнением:
CITY = 'New York'
Проверка на соответствие шаблону (LIKE)
Для выборки строк, в которых содержимое некоторого текстового столбца совпадает с заданным текстом, можно использовать простое сравнение. Например, следующий запрос извлекает строку из таблицы CUSTOMERS
по имени.
Показать лимит кредита для Smithson Corp.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY = 'Smithson Corp.';
Однако очень легко можно забыть, какое именно название носит интересующая нас компания: "Smith", "Smithson" или "Smithsonian". Проверка на соответствие шаблону позволяет выбрать из базы данных строки на основе частичного соответствия имени клиента.
Проверка на соответствие шаблону (оператор LIKE
), схематически изображенная на рис. 9, позволяет определить, соответствует ли значение данных в столбце некоторому шаблону. Шаблон представляет собой строку, в которую может входить один или несколько подстановочных символов. Эти символы интерпретируются особым образом.
Рис. 9. Синтаксическая диаграмма проверки на соответствие шаблону (LIKE)
Подстановочные знаки
Подстановочный знак %
совпадает с любой последовательностью из нуля или более символов. Ниже приведена измененная версия предыдущего запроса, в которой используется шаблон, содержащий знак процента.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY LIKE 'Smith% Corp.';
Оператор like
указывает SQL, что необходимо сравнивать содержимое столбца NAME
с шаблоном "Smith% Corp.". Этому шаблону соответствуют все перечисленные ниже имена.
Smith Corp.
Smithsen Corp.
Smithson Corp.
Smithsonian Corp.
А вот эти имена данному шаблону не соответствуют.
SmithCorp
Smithson Inc.
Подстановочный знак _
(символ подчеркивания) совпадает с любым отдельным символом. Например, если вы уверены, что название компании либо "Smithson", либо "Smithsen", то можете воспользоваться следующим запросом.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY LIKE 'Smiths_n Corp.';
В таком случае шаблону будет соответствовать любое из представленных ниже имен.
Smithson Corp.
Smithsen Corp.
Smithsun Corp.
А вот ни одно из следующих ему соответствовать не будет.
Smithsoon Corp.
Smithsn Corp.
Подстановочные знаки можно помещать в любое место строки шаблона, и в одной строке может содержаться несколько подстановочных знаков. Следующий запрос допускает как написание "Smithson" и "Smithsen", так и любое другое окончание названия компании, включая "Corp.", "Inc." или какое-то другое.
SELECT COMPANY, CREDIT_LIMIT
FROM CUSTOMERS
WHERE COMPANY LIKE 'Smiths_n %';
С помощью формы NOT LIKE
можно находить строки, которые не соответствуют шаблону. Проверку LIKE
можно применять только к столбцам, имеющим строковый тип данных. Если в столбце содержится значение NULL
, то результатом проверки like
будет null
.
Вероятно, вы уже встречались с проверкой на соответствие шаблону в операционных системах, имеющих интерфейс командной строки (таких, как Unix). Обычно в этих системах звездочка (*
) используется для тех же целей, что и символ процента (%
) в SQL, а вопросительный знак (?
) соответствует символу подчеркивания (_
) в SQL, но в целом возможности работы с шаблонами строк в них такие же.
Управляющие символы *
При проверке строк на соответствие шаблону может оказаться, что подстановочные знаки входят в строку символов в качестве литералов. Например, нельзя проверить, содержится ли знак процента в строке, просто включив его в шаблон, поскольку SQL будет считать этот знак подстановочным. Как правило, это не вызывает серьезных проблем, поскольку подстановочные знаки довольно редко встречаются в именах, названиях товаров и других текстовых данных, которые обычно хранятся в базе данных.
В стандарте ANSI/ISO определен способ проверки наличия в строке литералов, использующихся в качестве подстановочных знаков. Для этого применяются управляющие символы. Когда в шаблоне встречается такой символ, то символ, следующий непосредственно за ним, считается не подстановочным знаком, а литералом. Непосредственно за управляющим символом может следовать либо один из двух подстановочных символов, либо сам управляющий символ, поскольку он также приобретает в шаблоне особое значение.
Символ пропуска определяется в виде строки, состоящей из одного символа, и предложения ESCAPE
(рис. 9). Ниже приведен пример использования знака доллара ($
) в качестве управляющего символа.
Найти товары, коды которых начинаются с четырех букв "A%ВС".
SELECT ORDER_NUM, PRODUCT
FROM ORDERS
WHERE PRODUCT LIKE 'A$%BC%' ESCAPE '$';
Первый символ процента в шаблоне, следующий за управляющим символом, считается литералом, второй — подстановочным символом.
Управляющие символы — распространенная практика в приложениях проверки на соответствие шаблону; именно поэтому они были включены и в стандарт ANSI/ISO. Однако они не входили в ранние реализации SQL и поэтому не очень распространены. Для обеспечения переносимости приложений следует избегать использования предложения ESCAPE
.
Проверка на равенство NULL (IS NULL)
Значения NULL
обеспечивают возможность трехзначной логики в условиях отбора. Для любой заданной строки результат применения условия отбора может быть TRUE
, FALSE
или NULL
(в случае, когда в одном из столбцов содержится значение null
). Иногда необходимо явно проверять значения столбцов на равенство NULL
и непосредственно обрабатывать их. Для этого в SQL имеется специальная проверка IS NULL
, синтаксическая диаграмма которой изображена на рис. 10.
Рис. 10. Синтаксическая диаграмма проверки на равенство null (is null)
В следующем запросе проверка на равенство NULL используется для нахождения в учебной базе данных служащего, который еще не был закреплен за офисом.
Найти служащего, который еще не закреплен за офисом.
SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE IS NULL;
NAME
-----------
Tom Snyder
Инвертированная форма проверки на равенство NULL
(IS NOT NULL
) позволяет отыскать строки, которые не содержат значений null
.
Вывести список служащих, которые уже закреплены за офисами.
SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE IS NOT NULL;
NAME
--------------
Bill Adams
Mary Jones
Sue Smith
Sam Clark
Bob Smith
Dan Roberts
Larry Fitch
Paul Cruz
Nancy Angelli
В отличие от условий отбора, описанных выше, проверка на равенство NULL
не может возвратить значение NULL
в качестве результата. Она всегда возвращает TRUE
ИЛИ FALSE
.
Может показаться странным, что нельзя проверить значение на равенство NULL
с помощью операции сравнения, например:
SELECT NAME
FROM SALESREPS
WHERE REP_OFFICE = NULL;
Ключевое слово NULL
здесь нельзя использовать, поскольку на самом деле это не настоящее значение; это просто свидетельство того, что значение неизвестно. Даже если бы сравнение
REP_OFFICE = NULL
было возможно, правила обработки значений NULL
в сравнениях привели бы к тому, что оно вело бы себя не так, как ожидается. Если бы СУБД обнаружила строку, в которой столбец REP_OFFICE
содержит значение null, выполнилась бы следующая проверка.
NULL = NULL
Что будет результатом этого сравнения: TRUE
или FALSE
? Так как значения по обе стороны знака равенства неизвестны, то, в соответствии с правилами логики SQL, условие отбора должно вернуть значение NULL
. Поскольку условие отбора возвращает результат, отличный от true
, строка исключается из таблицы результатов запроса — это противоположно тому, к чему вы стремились! Из-за правил обработки значений null в SQL необходимо использовать проверку IS NULL
.
Составные условия отбора (AND, OR и NOT)
Простые условия отбора, описанные в предыдущих разделах, после применения к некоторой строке возвращают значения TRUE
, FALSE
или NULL
. С помощью правил логики эти простые условия можно объединять в более сложные, как изображено на рис. 11. Обратите внимание на то, что условия отбора, объединяемые с помощью операторов AND
, OR
и NOT
, сами могут быть составными.
Рис. 11. Синтаксическая диаграмма предложения WHERE
Оператор OR используется для объединения двух условий отбора, из которых или одно, или другое (или оба) должно быть истинным.
Найти служащих, у которых фактический объем продаж меньше планового или меньше $300000.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE SALES < QUOTA
OR SALES < 300000.00;
NAME QUOTA SALES
-------------- ------------ ------------
Sam Clark $275,000.00 $299,912.00
Bob Smith $200,000.00 $142,594.00
Tom Snyder NULL $75,985.00
Paul Cruz $275,000.00 $286,775.00
Nancy Angelli $300,000.00 $186,042.00
Для объединения двух условий отбора, оба из которых должны быть истинными, следует использовать оператор AND
.
Найти служащих, у которых фактический объем продаж меньше планового и меньше $300000.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE SALES < QUOTA
AND SALES < 300000.00;
NAME QUOTA SALES
-------------- ------------ ------------
Bob Smith $200,000.00 $142,594.00
Nancy Angelli $300,000.00 $186,042.00
И наконец, можно использовать оператор NOT, чтобы выбрать строки, для которых условие отбора ложно.
Найти служащих, у которых фактический объем продаж меньше планового, но не меньше $150000.
SELECT NAME, QUOTA, SALES
FROM SALESREPS
WHERE SALES < QUOTA
AND NOT SALES < 150000.00;
NAME QUOTA SALES
-------------- ------------ ------------
Nancy Angelli $300,000.00 $186,042.00
С помощью логических операторов AND
, OR
, NOT
и круглых скобок можно создавать очень сложные условия отбора, как в следующем примере.
Найти всех служащих, которые: (а) работают в Денвере, Нью-Йорке или Чикаго; или (б) не имеют менеджера и были приняты на работу после июня 2006 года; или (в) у которых продажи превысили плановый объем, но не превысили $600000.
SELECT NAME
FROM SALESREPS
WHERE (REP_OFFICE IN (22, 11, 12))
OR (MANAGER IS NULL AND HIRE_DATE >= '2006-06-01')
OR (SALES > QUOTA AND NOT SALES > 600000.00);
Лично для меня остается загадкой, зачем может понадобиться такой список имен, однако приведенный пример является иллюстрацией довольно сложного запроса.
Как и в случае с простыми условиями отбора, значения NULL
влияют на интерпретацию составных условий отбора, вследствие чего результаты последних становятся не столь очевидными. В частности, результатом операции NULL OR TRUE
является значение TRUE
, а не NULL
, как можно было ожидать. Табл. 1-3 являются таблицами истинности для операторов AND
, OR
и NOT
соответственно в случае тернарной логики (со значениями NULL
).
Таблица 1. Таблица истинности оператора and
AND | TRUE | FALSE | NULL |
TRUE | TRUE | FALSE | NULL |
FALSE | FALSE | FALSE | FALSE |
NULL | NULL | FALSE | NULL |
Таблица 2. Таблица истинности оператора OR
OR | TRUE | FALSE | NULL |
TRUE | TRUE | TRUE | TRUE |
FALSE | TRUE | FALSE | NULL |
NULL | TRUE | NULL | NULL |
Таблица 3. Таблица истинности оператора NOT
NOT | TRUE | FALSE | NULL |
| FALSE | TRUE | NULL |
В соответствии со стандартом ANSI/ISO, если с помощью операторов AND
, OR
и NOT
объединяется более двух условий отбора, то оператор NOT
имеет наивысший приоритет, за ним следует AND
и только потом OR
. Однако чтобы гарантировать переносимость, всегда следует использовать круглые скобки; это позволит устранить все возможные неоднозначности.
В стандарте SQL2 (известном также как SQL-92 и SQL: 1992) появилось еще одно логическое условие отбора — проверка IS
. На рис. 12 изображена синтаксическая диаграмма этой проверки. Оператор IS
проверяет значение результата логического выражения.
Рис. 12. Синтаксическая диаграмма оператора IS
Например, проверку
((SALES - QUOTA) > 10000.00) IS UNKNOWN
можно использовать, чтобы отыскать строки, в которых нельзя выполнить сравнение из-за того, что либо столбец SALES
, либо столбец QUOTA
имеет значение NULL
. Подобным образом проверка
((SALES - QUOTA) > 10000.00) IS FALSE
позволяет выбрать строки, в которых значение столбца SALES
если и превышает значение столбца QUOTA
, то незначительно. Как показывает данный пример, на самом деле проверка IS
не привносит в SQL ничего нового, поскольку ее можно легко переписать в следующем виде.
NOT ((SALES - QUOTA) > 10000.00)
Хотя проверка IS внесена в стандарт SQL с 1992 года, ее поддерживает очень небольшое количество SQL-продуктов. Так что для обеспечения максимальной переносимости следует избегать подобных проверок и записывать выражения только с помощью операторов AND
, OR
и NOT
. Однако избежать проверки IS UNKNOWN
удается не всегда.