Логічні вирази SQL

Як і в попередньому розділі, почнемо з розгляду граматики у формі БекусаНаура, потім перейдемо до більш докладного опису умов&ltlike  cond&gt,  &ltmatch cond&gt і &ltall or any cond&gt.

&ltbool exp&gt

:: =  &ltbool term&gt | &ltbool exp&gt OR &ltbool term&gt

&ltbool term&gt

: : =                                          &ltbool  factor&gt   [  &ltbool  term&gt AND &ltbool  factor&gt

&ltbool   factor&gtm

::=                                          [  NOT  ]  &ltbool primary&gt

&ltbool primary&gt

::=                                        &ltsimple cond&gt  |   (  &ltbool  exp&gt  )

&ltsimple cond&gt

::=                                        &ltcomp cond&gt  \  &ltin  cond&gt   \   &ltlike cond&gt   \   &ltmatch  cond&gt

|   &ltall   or any cond&gt  \   &ltexists  cond&gt   \   &ltunigue  cond&gt

j   &ltdistinct  cond&gt   |   &lttype cond&gt

&ltcomp cond&gt

: : =                                         &ltrow constructor&gt &ltcomp op&gt  &ltrow constructor&gt

&ltcomp op&gt

: : =                                          =   |   &lt   |  &lt=   |   &gt   |   &gt=   |  &lt&gt

&ltin  cond&gt

: : =                                         &ltrow constructor   [   NOT   ]  IN   (   &lttable  exp&gt   )

|  &ltscalar exp&gt  [  NOT  ]  IN  (  &ltscalar exp commalist&gt  )

&ltlike  cond&gt

::=  &ltchar string exp&gt [ NOT ] LIKE &ltpattern&gt

[ ESCAPE &ltescape&gt ]

&ltmatch cond&gt

: : =                                         &ltrow constructors MATCH UNIQUE  (  &lttable exp&gt )

&ltall   or any cond&gt

::=                                        &ltrow constructor  &ltcomp op&gt ALL   (   &lttable exp&gt   )

|  &ltxow constructor &ltcomp op&gt ANY  (  &lttable exp&gt  )

&ltexists cond&gt

: : =                                           EXISTS   (  &lttable  exp&gt  )

&ltunique  cond&gt

: : =                                         UNIQUE   (   &lttable  exp&gt   )

&ltdistinct  cond&gt

::=                                                                                 &ltrow constructor   IS  DISTINCT  FROM &ltrow constructor&gt

&lttype cond&gt

::= TYPE ( &ltscalar exp&gt )

IS [ NOT ] OF ( &lttype spec commalist&gt )

&lttype spec&gt

: :=  &lttype name&gt

Умови LIKE

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

&ltchar string exp&gt  [  NOT  ]  LIKE &ltpattern&gt  [  ESCAPE &ltescape&gt  ]

Тут&ltpattern&gt   —   довільне вираження у вигляді символьного рядка, а позначення маскирующего символу &ltescape&gt, якщо воно визначено, являє собою вираження у вигляді символьного рядка, результатом обчислення якого є один символ Приклад застосування умови LIKE наведено нижче

SELECT   PP# ,     PPNAME FROM  P

WHERE РPNAME LIKE С%;

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

Якщо конструкція ESCAPE не визначена, то символи, що входять до складу шаблону

, інтерпретуються таким чином

■ Символ підкреслення _ позначає будь-який окремий символ

■ Знак відсотка % представляє будь-яку послідовність з п символів (де п може бути

дорівнює нулю)

■ Всі інші символи позначають самі себе

Тому в наведеному вище прикладі запит повертає з таблиці Р такі рядки, в яких значення PNAME починається з великої букви З, за якою слід послідовність будь-яких символів в кількості від нуля і більше Нижче наведено ще кілька прикладів

ADDRESS LIKE %Berkeley%

■ Приймає значення TRUE, якщо в будь-якому місці поля ADDRESS міститься рядок Berkeley.

S#  LIKE   S    

■ Приймає значення TRUE, якщо вміст поля S # має довжину точно три символи, і першим з них є S.

PNAME LIKE % С

■ Приймає значення TRUE, якщо вміст поля PNAME має довжину чотири символу або більше, і четвертим праворуч символом є с.

MYTEXT LIKE =_% ESCAPE =

■ Приймає значення TRUE, якщо конструкція MYTEXT починається з символу підкреслення (див

наступний абзац)

У даному останньому прикладі символ = був визначений як маскує Це означає, що при бажанні можна скасувати спеціальну інтерпретацію, застосовувану до символів _ і %, поставивши перед ними символ =, позначений як маскує символ

Нарешті, така умова &ltlike cond&gt, як

X NOT LIKE у [ESCAPE z] визначено в якості семантичного еквівалента наступного виразу

NOT (х LIKE у [ESCAPE z])

Умови MATCH

Умова узгодження &ltma tch cond&gt приймає наступну форму

&ltrow constructor MATCH UNIQUE   (   &lttable exp&gt   )

Припустимо, що rl – рядок, отримана в результаті обчислення виразу конструктора рядка

&ltrow constructor, a T – таблиця, яка отримана в результаті обчислення табличного вираження

&lttable ехр> У такому випадку умова &ltmatch cond&gt приймає значення TRUE тоді і тільки тоді,

коли Т містить точно один рядок (скажімо, r2), таку що наведена нижче операція порівняння приймає значення TRUE

rl   =  r2

Наприклад, розглянемо наступну пропозицію

SELECT SP* FROM SP

WHERE NOT ( SPS# MATCH UNIQUE ( SELECT SS# FROM S ) )

(Визначити поставки, яким не відповідає один і тільки один постачальник з таблиці постачальників.) Такий запит може застосовуватися при перевірці цілісності бази даних, оскільки, безумовно, якщо база даних є правильною, то не повинно бути жодної такої поставки Але слід зазначити, що для виконання точно такий же перевірки може використовуватися умова IN &ltin cond&gt.

До речі, слід зазначити, що ключове слово UNIQUE в конструкції MATCH UNIQUE може бути опущено, але тоді конструкція MATCH стає синонімом конструкції IN (у відсутність невизначених значень)

Умови ALL або ANY

Умова для всіх або для деякого, or any cond&gt, має таку загальну форму

&ltrow constructor &ltcomp op&gt &ltqualifier&gt   (    

)

Тут операцією порівняння<Співр ор>може бути будь-яка операція із звичайного набору (=, о і тд) a уточнітелі &ltqualifier&gt може приймати значення ALL або ANY4 Взагалі кажучи, умова &ltall or any cond&gt приймає значення TRUE тоді і тільки тоді, коли відповідне порівняння без ключового слова ALL (відповідно, ANY) приймає значення TRUE для всіх (відповідно, деяких) рядків таблиці, представленої за допомогою табличного вираження < table exp&gt. (Якщо ця таблиця порожня, то умови ALL приймають значення TRUE, а умови ANY – значення FALSE) Нижче наведений один приклад (Визначити назви деталей, що мають вагу більше порівняно з усіма деталями синього кольору )

SELECT DISTINCT PXPNAME FROM P AS PX

WHERE PXWEIGHT &gtALL ( SELECT PYWEIGHT FROM P AS PY WHERE PYCOLOR = Blue )

При використанні даних, зазвичай розглядаються в цій книзі як приклад,

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

ПоясненняВкладене табличне вираз

повертає безліч значень ваги деталей синього кольору Потім зовнішня конструкція SELECT повертає назви деталей, що мають вагу, більший в порівнянні з будь-яким із значень в цій множині Безумовно, в загальному випадку остаточний результат може включати будь-яку кількість назв деталей (включаючи нуль)

Примітка Необхідно зробити одне застереження, яке стосується смислового значення застосовуваних здесьключевих слів Фактично умови &ltall or any cond&gt можуть стати джерелом помилки Підбираючи ключове слово для формулювання наведеного вище запиту, користувач може помилково припустити, що слово ANY (будь-який) означає кожен, і тому (Неправильно) застосувати вираз> ANY замість> ALL

Аналогічне зауваження стосується всіх (будь-яким) Операторам з ключовими словами ANY

і ALL

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*