Условия отбора в операторе SELECT в запросах SQL на практике

SELECT: , BETWEEN, LIKE, IN, NULL, OR, AND
Vovan_ST

Vovan_ST

ИТ специалист со стажем. Автор статьи. Профиль

В SQL используется множество условий отбора, позволяющих эффективно и естественно создавать различные типы запросов. Ниже рассматриваются пять основных условий отбора (в стандарте ANSI/ISO они называются предикатами):

  • Сравнение. Значение одного выражения сравнивается со значением дру­гого выражения. Например, такое условие отбора используется для вы­бора всех офисов, находящихся в восточном регионе, или всех служащих, фактические объемы продаж которых превышают плановые.
  • Проверка на принадлежность диапазону. Проверяется, попадает ли ука­занное значение в определенный диапазон значений. Например, такое условие отбора используется для нахождения служащих, фактические объемы продаж которых превышают $100000, но меньше $500000.
  • Проверка наличия во множестве. Проверяется, совпадает ли значение вы­ражения с одним из значений из заданного множества. Например, такое условие отбора используется для выбора офисов, расположенных в Нью- Йорке, Чикаго или Лос-Анджелесе.
  • Проверка на соответствие шаблону. Проверяется, соответствует ли стро­ковое значение, содержащееся в столбце, определенному шаблону. На­пример, такое условие отбора используется для выбора клиентов, имена которых начинаются с буквы "Е".
  • Проверка на равенство значению NULL. Проверяется, содержится ли в столбце значение NULL. Например, такое условие отбора используется для нахождения всех служащих, которым еще не был назначен менеджер.


Предыдущие статьи:

  1. Простейщие запросы SQL: оператор SELECT
  2. Вычисления в SQL запросах Select
  3. Выборка всех данных из таблицы
  4. SELECT DISTINCT - выборка уникальных значений
  5. 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. При этом проверяется, находится ли элемент данных между двумя задан­ными значениями. В условие отбора входят три выражения. Первое выражение определяет проверяемое значение; второе и третье выражения определяют ниж­нюю и верхнюю границы проверяемого диапазона. Типы данных трех выражений должны быть сравнимыми.

интаксическая диаграмма проверки на принадлежность диапазону (between)

Рис. 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. В этом случае выполня­ется проверка, соответствует ли значение какому-либо элементу заданного списка. Ниже приведен ряд запросов с использованием проверки наличия во множестве.

Синтаксическая диаграмма проверки наличия во множестве (IN)

Рис. 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, позволяет определить, соответствует ли значение данных в столбце некоторому шаблону. Шаблон представляет собой строку, в которую может вхо­дить один или несколько подстановочных символов. Эти символы интерпретируют­ся особым образом.

Синтаксическая диаграмма проверки на соответствие шаблону (LIKE)

Рис. 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.

Синтаксическая диаграмма проверки на равенство null (is null)

Рис. 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, сами могут быть составными.

 Синтаксическая диаграмма предложения WHERE

Рис. 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 проверяет значение результата логи­ческого выражения.

 Синтаксическая диаграмма оператора 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 удается не всегда.

Вас заинтересует / Intresting for you:

Оператор SQL SELECT: введение ...
Оператор SQL SELECT: введение ... 361 просмотров Боба Thu, 24 Jun 2021, 18:58:21
Оператор SELECT: использование...
Оператор SELECT: использование... 108 просмотров Боба Thu, 24 Jun 2021, 18:59:42
SQL: Правила выполнения однота...
SQL: Правила выполнения однота... 49 просмотров Дэйзи ак-Макарова Sat, 31 Jul 2021, 06:47:05
DISTINCT: выборка уникальных з...
DISTINCT: выборка уникальных з... 189 просмотров Боба Thu, 24 Jun 2021, 19:20:28
Войдите чтобы комментировать