Здавалка
Главная | Обратная связь

Логические выражения раздела WHERE



Синтаксически логическое выражение раздела WHERE определяется как булевское выражение (boolean_value_expression), правила построения которого обсуждались в предыдущей лекции. Основой логического выражения являются предикаты. Предикат позволяет специфицировать условие, результатом вычисления которого может быть true, false или unknown. В языке SQL:1999 допустимы следующие предикаты:135)

predicate ::= comparison_predicate | between_predicate | null_predicate | in_predicate | like_predicate | similar_predicate | exists_predicate | unique_predicate | overlaps_predicate | quantified_comparison_predicate | match_predicate | distinct_predicate

Далее мы будем последовательно обсуждать разные виды предикатов и приводить примеры запросов с использованием базы данных СЛУЖАЩИЕ-ОТДЕЛЫ-ПРОЕКТЫ, определения таблиц которой на языке SQL были приведены в лекции 16. Для удобства повторим здесь структуру таблиц.

EMP:
EMP_NO : EM_NO
EMP_NAME : VARCHAR
EMP_BDATE : DATE
EMP_SAL : SALARY
DEPT_NO : DEPT_NO
PRO_NO : PRO_NO

 

DEPT:
DEPT_NO : DEPT_NO
DEPT_NAME : VARCHAR
DEPT_EMP_NO : INTEGER
DEPT_TOTAL_SAL : SALARY
DEPT_MNG : EMP_NO

 

PRO:
PRO_NO : PRO_NO
PRO_TITLE : VARCHAR
PRO_SDATE : DATEP
PRO_DURAT : INTERVAL
PRO_MNG : EMP_NO
PRO_DESC : CLOB

135 Мы не обсуждаем в этом курсе предикаты, основанные на использовании выражений типа мультимножества, которые были введены в стандарте SQL:2003.

Столбцы EMP_NO, DEPT_NO и PRO_NO являются первичными ключами таблиц EMP, DEPT и PRO соответственно. Столбцы DEPT_NO и PRO_NO таблицы EMP являются внешними ключами, ссылающимися на таблицы DEPT и PRO соответственно (DEPT_NO указывает на отделы, в которых работают служащие, а PRO_NO – на проекты, в которых они участвуют; оба столбца могут принимать неопределенные значения). Столбец DEPT_MNG является внешним ключом таблицы DEPT (DEPT_MNG указывает на служащих, которые исполняют обязанности руководителей отделов; у отдела может не быть руководителя, и один служащий не может быть руководителем двух или более отделов). Столбец PRO_MNG является внешним ключом таблицы PRO (PRO_MNG указывает на служащих, которые являются менеджерами проектов, у проекта всегда есть менеджер, и один служащий не может быть менеджером двух или более проектов).

Предикат сравнения

Этот предикат предназначен для спецификации сравнения двух строчных значений. Синтаксис предиката следующий:

comparison_predicate ::= row_value_constructor comp_op row_value_constructorcomp_op ::= = | <> («не равно»)| < | > | <= («меньше или равно») | >= («больше или равно»)

Строки, являющиеся операндами операции сравнения, должны быть одинаковой степени. Типы данных соответствующих значений строк-операндов должны быть совместимы.

Пусть X и Y обозначают соответствующие элементы строк-операндов, а xv и yv – их значения. Тогда:

  1. если xv и/или yv являются неопределенными значениями, то значение условия X comp_op Y - unknown;
  2. в противном случае значением условия X comp_op Y является true или false в соответствии с естественными правилами применения операции сравнения.

При этом:

  • Числа сравниваются в соответствии с правилами алгебры.
  • Сравнение двух символьных строк производится следующим образом:
    • если длина строки X не равна длине строки Y, то для выравнивания длин строк более короткая строка расширяется символами набивки (pad symbol); если для используемого набора символов порядок сортировки явным образом не специфицирован, то в качестве символа набивки используется пробел;
    • далее производится лексикографическое сравнение строк в соответствии с предопределенным или явно определенным порядком сортировки символов.
  • Сравнение двух битовых строк X и Y основано на сравнении соответствующих бит. Если Xi и Yi – значения i-тых бит X и Y соответственно и если lx и ly обозначает длину в битах X и Y соответственно, то:
    • X равно Y тогда и только тогда, когда lx = ly и Xi = Yi для всех i;
    • X меньше Y тогда и только тогда, когда (a) lx < ly и Xi = Yi для всех i меньших или равных lx, или (b) Xi = Yi для всех i < n и Xn = 0, а Yn =1 для некоторого n меньшего или равного min (lx, ly).
  • Сравнение двух значений типа дата-время производится в соответствии с видом интервала, который получается при вычитании второго значения из первого. Пусть X и Y – сравниваемые значения, а H – наименее значимое поле даты-времени X и Y. Результат сравнения X comp_op Y определяется как (X – Y) H comp_ op INTERVAL (0) H. (Два значения типа дата-время сравнимы только в том случае, если они содержат одинаковый набор полей даты-времени.)
  • Сравнение двух значений анонимного строкового типа производится следующим образом. Пусть Rx и Ry обозначают строки-операнды, а Rxi и Ryi – i-тые элементы Rx и Ry соответственно. Вот как определяется результат сравнения Rx comp_op Ry:
    • Rx = Ry есть true тогда и только тогда, когда Rxi = Ryi есть true для всех i;
    • Rx <> Ry есть true тогда и только тогда, когда Rxi <> Ryi есть true для некоторого i;
    • Rx < Ry есть true тогда и только тогда, когда Rxi = Ryi есть true для всех i < n, и Rxn < Ryn есть true для некоторого n;
    • Rx > Ry есть true тогда и только тогда, когда Rxi = Ryi есть true для всех i < n, и Rxn > Ryn есть true для некоторого n;
    • Rx <= Ry есть true тогда и только тогда, когда Rx = Ry есть true или Rx < Ry есть true;
    • Rx >= Ry есть true тогда и только тогда, когда Rx = Ry есть true или Rx > Ry есть true;
    • Rx = Ry есть false тогда и только тогда, когда Rx <> Ry есть true;
    • Rx <> Ry есть false тогда и только тогда, когда Rx = Ry есть true;
    • Rx < Ry есть false тогда и только тогда, когда Rx >= Ry есть true;
    • Rx > Ry есть false тогда и только тогда, когда Rx <= Ry есть true;
    • Rx <= Ry есть false тогда и только тогда, когда Rx > Ry есть true;
    • Rx >= Ry есть false тогда и только тогда, когда Rx < Ry есть true;
    • Rx comp_op Ry есть unknown тогда и только тогда, когда Rx comp_op Ry не есть true или false.






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.