Использование реляционных и булевых операторов.

Реляционный оператор — это математический символ, который задает оп­ределенный тип сравнения между двумя значениями. Уже известно как приме­няются равенства, такие как 2+3=5 или city = 'London'. Однако существуют и другие операторы сравнения. Предположим, необходимо вычислить продавцов (Salespeople), комиссионные (commissions) которых превышают заданное значе­ние. В этом случае следует воспользоваться сравнением типа "больше или равно". SQL распознает следующие операторы сравнения:

= Равно

> Больше, чем

< Меньше, чем

>= Больше или равно

<= Меньше или равно

<> Неравно

Эти операторы имеют стандартное значение для числовых величин. Их оп­ределение для символьных значений зависит от используемого формата пред­ставления (ASCII или EBCDIC). SQL сравнивает символьные значения в терминах соответствующих чисел, определенных в формате преобразования. Символьные значения, представляющие числа, например, необязательно равны тому числу, которое они представляют.

Предположим, необходимо увидеть всех покупателей (Customers) с рейтин­гом (rating) более 200. Поскольку 200 — это скалярное значение, как и все значения столбца rating, для их сравнения можно использовать оператор отно­шения:

SELECT * FROM Customers WHERE rating > 200

При необходимости увидеть всех покупателей, рейтинг (rating) которых боль­ше или равен 200, следовало бы использовать предикат:

rating >= 200.

SQL распознает основные булевы операторы. Далее перечислены булевы операторы и основные принципы их действия:

• AND берет два булевых выражения (в виде A AND В) в качестве аргументов и дает в результате истину, если они оба истинны.

• OR два булевых выражения (в виде A OR В) в качестве аргументов и оценивает результат как истину, если хотя бы один из них истинен.

• NOT берет единственное булево выражение (в виде NOT А) в качестве аргу­мента и изменяет его значение с истинного на ложное или с ложного на истинное.

Используя предикаты с булевыми операторами, можно значительно увели­чить их избирательную мощность. Предположим, необходимо увидеть всех по­купателей (customers) из San Jose, чей рейтинг (rating) превышает 200:

SELECT *FROM Customers WHERE city = 'San Jose' AND rating > 200

При использовании OR , будут получены сведения обо всех тех покупателях (customers), которые либо проживают в San Jose, либо имеют рейтинг (rating), превышающий 200.

SELECT *FROM Customers WHERE city = 'San Jose' OR rating > 200

NОТ дает возможность получить отрицание (противоположное значение) булева выражения. Вот пример запроса с использованием NOT:

SELECT*FROM Customers WHERE city ='San Jose' OR NOT rating > 200

Заметим, что оператор NOT должен предшест­вовать булеву выражению, значение которого он должен изменить, но не может располагаться непосредственно перед оператором сравнения.

Можно по­лучить другой результат по следующей команде:

SELECT * FROM Customers WHERE NOT (city = 'San Jose' OR rating > 200)

SQL понимает круглые скобки следующим образом: все то, что расположено внутри круглых скобок, вычисляется прежде всего и рассматривается как един­ственное выражение по отношению к тому, что расположено за пределами круг­лых скобок (это соответствует стандартной интерпретации в математике).

Использование специальных операторов в «условиях»

Оператор IN

IN полностью определяет множество, которому данное значение может при­надлежать или не принадлежать. Если нужно найти всех продавцов, располо­женных либо в 'Barcelona', либо в 'London', основываясь только на том, что известно к настоящему моменту, необходимо написать следующий запрос:

SELECT *FROM Salespeople WHERE city IN ('Barcelona', 'London')

Как видно из примера, IN определяет множество, элементы которого точно перечисляются в круглых скобках и разделяются запятыми. Если в поле, имя которого указано слева от IN, есть одно из перечисленных в списке значений (требуется точное совпадение), то предикат считается истинным. Если элементы множества имеют числовой, а не символьный тип, то одиночные кавычки непо­средственно слева и справа от значения необходимо опустить. Можно найти всех покупателей, обслуживаемых продавцами 1001, 1007, 1004.

SELECT *FROM Customers WHERE snum IN (1001,1007,1004)

Оператор BETWEEN

Оператор BETWEEN сходен с IN. Вместо перечисления элементов множества, как это делается в IN, BETWEEN задает границы, в которые должно попадать значение, чтобы предикат был истинным. Используется ключевое слово BETWEEN, за которым следуют начальное значение, ключевое слово AND и конечное значение. Также как и IN, BETWEEN чувствителен к порядку: первое значение в предложении должно быть первым в соответствии с алфавитным или числовым порядком.

Следующий запрос позволит извлечь из таблицы Salespeople всех продавцов (salespeople), комиссионные которых имеют величину в диапазоне .10 и .12:

SELECT * FROM Salespeople WHERE comm BETWEEN .10 AND. 12

Оператор BETWEEN является включающим, т.е. граничные значения (в дан­ном примере это .10 и .12) делают предикат истинным. SQL непосредственно не поддерживает исключающий BETWEEN. Необходимо сформулировать гра­ничные значения так, чтобы включающая интерпретация была справедлива, либо сделать примерно следующую запись:

SELECT *FROM Salespeople WHERE (comm BETWEEN .10, AND.12) AND NOT comm. IN (.10, .12)

Пусть эта запись и неуклюжа, но она показывает, как новые операторы можно комбинировать с булевыми операторами для получения более сложных предикатов. Значит, IN и BETWEEN используются, как и операторы сравнения, для сопоставления значений, одно из которых является множеством (для IN) или диапазоном (для BETWEEN).

Следующий запрос выбирает всех покупателей, имена которых попадают в заданный алфавитный диапазон:

SELECT *FROM Customers WHERE cname BETWEEN 'A' AND 'G'

Оператор LIKE

LIKE применим только к полям типа CHAR или VARCHAR, поскольку он используется для поиска подстрок. Другими словами, он осуществляет просмотр строки для выяснения: входит ли заданная подстрока в указанное поле. С этой же целью используются шаблоны — специальные символы, которые могут обозначать все, что угодно. Существует два типа шаблонов, используемых с LIKЕ:

§ Символ "подчеркивание" (_) заменяет один любой символ. Например, образцу 'b_t' соответствуют 'bat' или 'bit', но не соответствует 'brat'.

§ Символ "процент" (%) заменяет последовательность символов произвольной длины, в том числе и нулевой. Например, образцу '%p%t' соответствуют 'put', 'posit', 'opt', но не 'spite'.

Можно найти покупателей, фамилии которых начинаются на'G' :

SELECT * FROM Customers WHERE cname LIKE 'G%'

Работа с NULL-значениями

Часто в таблице встречаются записи с незаданными значениями какого-либо полей, потому что значение поля неизвестно или его просто нет. В таких случаях SQL позволяет указать в поле NULL-значение. Строго говоря, NULL-значение вовсе не представлено в поле. Когда значение поля есть NULL это значит, что программа базы данных специальным образом помечает поле, как не содержащее какого-ибо значения для данной строки (записи). Дело обстоит не так в случае простого приписывания полю значения "нуль" или "пробел", которые база данных трактует как любое другое значение. Поскольку NULL не является значением как таковым, он не имеет типа данных. NULL может раз­даться в поле любого типа. Тем не менее, NULL, как NULL-значение, часто используется в SQL.

Оператор IS NULL

Поскольку NULL фиксирует пропущенные значения, результат любого сравнения при наличии NULL-значений неизвестен. Когда NULL-значение сравнивается с любым значением, даже с NULL-значением, результат просто неизвестен. Булево значение "неизвестно" ведет себя также, как "ложь" — строка на которой предикат принимает значение "неизвестно", не включается в результат запроса — при одном важном исключении: NOT от лжи есть истина (NOT(false)=true), тогда как NOT от неизвестного значения есть также неизвестное значение. Следовательно, такое выражение как "city = NULL" или "city IN (NULL)” является неизвестным независимо от значения city.

Часто необходимо различать false и unknown — строки, содержащие значения не удовлетворяющие предикату, и строки, которые содержат NULL. Для этой цели SQL располагает специальным оператором IS, который используется с ключевым словом NULL для локализации NULL-значения.

Для нахождения всех записей со значениями NULL в таблице Customers в столбце city следует ввести:

SELECT * FROM Customers WHERE city IS NULL

Использование NOT со специальными операторами

Специальные операторы, которые были рассмотрены в этой главе, могут непосредственно предшествовать булеву оператору NOT. Этим они отличаются от операторов сравнения, которые должны содержать NOT перед всем выраже­нием. Например, если не осуществляется поиск NULL-значений, а, напротив, необходимо исключить их из выходных данных, то нужно использовать NOT для того, чтобы придать предикату противоположное значение:

SELECT *FROM Customers WHERE City IS NOT NULL

Если NULL-значения отсутствуют, то в результате выполнения этого запроса будет получена вся таблица Customers.

SELECT * FROM Salespeople WHERE city NOT IN ('London', 'San Jose')

Другой способ выразить то же самое:

SELECT *FROM Salespeople WHERE NOT city IN ('London', 'San Jose')

Аналогичным образом можно использовать NOT BETWEEN и NOT LIKE.

Наши рекомендации