Главная » SQL, Базы данных » ЛОГИЧЕСКИЕ ВЫРАЖЕНИЯ SQL

0

Как и в предыдущем разделе, начнем с рассмотрения грамматики в форме  БэкусаНаура, затем перейдем  к  более  подробному  описанию  условий  <like  cond>,  <match cond> и <all or any cond>.

<bool exp>

:: =  <bool term> | <bool exp> OR <bool term>

<bool term>

: : =                                          <bool  factor>   [  <bool  term> AND <bool  factor>

<bool   factor>m

::=                                          [  NOT  ]  <bool primary>

<bool primary>

::=                                        <simple cond>  |   (  <bool  exp>  )

<simple cond>

::=                                        <comp cond>  \  <in  cond>   \   <like cond>   \   <match  cond>

|   <all   or any cond>  \   <exists  cond>   \   <unigue  cond>

j   <distinct  cond>   |   <type cond>

<comp cond>

: : =                                         <row constructor> <comp op>  <row constructor>

<comp op>

: : =                                          =   |   <   |  <=   |   >   |   >=   |  <>

<in  cond>

: : =                                         <row constructor   [   NOT   ]  IN   (   <table  exp>   )

|  <scalar exp>  [  NOT  ]  IN  (  <sca.lar exp commalist>  )

<like  cond>

::=  <char string exp> [ NOT ] LIKE <pattern>

[ ESCAPE <escape> ]

<match cond>

: : =                                         <row constructors MATCH UNIQUE  (  <table exp> )

<all   or any cond>

::=                                        <row constructor  <comp op> ALL   (   <table exp>   )

|  <xow constructor <comp op> ANY  (  <table exp>  )

<exists cond>

: : =                                           EXISTS   (  <table  exp>  )

<unique  cond>

: : =                                         UNIQUE   (   <table  exp>   )

<distinct  cond>

::=                                                                                 <row constructor   IS  DISTINCT  FROM <row constructor>

<type cond>

::= TYPE ( <scalar exp> )

IS [ NOT ] OF ( <type spec commalist> )

<type spec>

: :=  <type name>

Условия LIKE

Условия LIKE предназначены для сопоставления символьных строк с простым образцом, т.е. для проверки заданной символьной строки в целях определения того, соответствует ли она некоторому установленному образцу. Ниже (еще раз) показан синтаксис такого условия.

<char string exp>  [  NOT  ]  LIKE <pattern>  [  ESCAPE <escape>  ]

Здесь   <pattern>   —   произвольное   выражение   в   виде   символьной   строки,   а обозначение маскирующего символа <escape>, если оно определено, представляет собой выражение в виде символьной строки, результатом вычисления  которого является один символ. Пример применения условия LIKE приведен ниже.

SELECT   P.P# ,     P.PNAME FROM  P

WHERE Р.PNAME LIKE ‘С%';

("Определить номера и названия деталей, названия которых начинаются с буквы С"). При использовании данных, обычно рассматриваемых в данной книге, будет получен следующий результат.

SELECT SP.* FROM SP

WHERE NOT ( SP.S# MATCH UNIQUE ( SELECT S.S# FROM S ) ) ;

("Определить поставки, которым  не соответствует один и только  один поставщик из  таблицы поставщиков".) Такой запрос может применяться при проверке целостности базы данных, поскольку, безусловно, если база данных является правильной, то не должно быть ни одной такой поставки. Но следует отметить, что для выполнения точно такой же проверки может использоваться условие IN <in cond>.

Кстати, следует отметить, что ключевое слово UNIQUE в конструкции MATCH UNIQUE может быть опущено, но тогда конструкция MATCH становится синонимом конструкции IN (в отсутствие неопределенных значений).

Условия ALL или ANY

Условие "для всех или для некоторого", <all or any cond>, имеет следующую общую форму.

<row constructor <comp op> <qualifier>   (    <table ехр>   )

Здесь  операцией  сравнения  <сотр  ор>  может  быть  любая  операция  из  обычного набора ("=", "о" и т.д.). a уточнитель <qualifier> может принимать значение ALL или ANY4. Вообще говоря, условие <all or any cond> принимает значение TRUE тогда и только тогда, когда   соответствующее  сравнение  без  ключевого   слова   ALL  (соответственно,  ANY) принимает   значение   TRUE   для   всех    (соответственно,   некоторых)   строк   таблицы, представленной с помощью табличного выражения < table exp>. (Если эта таблица пуста, то условия ALL принимают значение TRUE, а условия ANY — значение FALSE.) Ниже приведен один пример ("Определить названия деталей, имеющих вес больше по сравнению со всеми деталями синего цвета").

SELECT DISTINCT PX.PNAME FROM P AS PX

WHERE PX.WEIGHT >ALL ( SELECT PY.WEIGHT FROM P AS PY WHERE PY.COLOR = ‘Blue’ ) ;

При использовании данных, обычно рассматриваемых в этой книге в качестве примера,

полученный результат будет выглядеть следующим образом.

Пояснение.  Вложенное  табличное  выражение  <table  exp>  возвращает   множество значений  веса  деталей  синего  цвета.  Затем  внешняя  конструкция  SELECT  возвращает названия деталей, имеющих вес, больший по сравнению с  любым из значений в этом множестве. Безусловно, в общем случае окончательный результат может включать любое количество названий деталей (включая нуль).

Примечание. Необходимо сделать одно предостережение, которое касается  смыслового значения применяемых здесьключевых слов. Фактически условия <all or any cond> могут стать источником ошибки. Подбирая ключевое слово для формулировки приведенного выше запроса, пользователь может ошибочно  предположить, что слово ANY (любой) означает "каждый",   и   поэтому   (неправильно)   применить   выражение   >ANY   вместо   >ALL.

Аналогичное замечание относится ко всем (любым?) операторам с ключевыми словами ANY

и ALL.

Источник: Дейт К. Дж., Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом «Вильямс», 2005. — 1328 с.: ил. — Парал. тит. англ.

По теме:

  • Комментарии