Понимание SQL
Шрифт:
Следующее определяет список различных типов предиката<predicate >
описаных на следующих страницах:
<predicate> ::=[NOT]
{ < comparison predicate > | <in predicate > | <null predicate > | <between predicate> | <like predicate > | <quantified predicate> | <exists predicate > }
[ANDI OR <predicate>]
<predicate > - это выражение, которое может быть верным, неверным, или неизвестным, за исключением <exists predicate> и <null predicate>, которые могут быть только верными или неверными.
Будет
AND
AND | верно | неверно | неизвестно |
верно | верно | неверно | неизвестно |
неверно | неверно | неверно | неверно |
неизвестно | неизвестно | неверно | неизвестно |
OR
OR | верно | неверно | неизвестно |
верно | верно | верно | верно |
неверно | верно | неверно | неизвестно |
неизвестно | верно | неизвестно | неизвестно |
Эти таблицы читаются способом на подобии таблицы умножения: вы объединяете верные, неверные, или неизвестные значения из строк с их столбцами чтобы на перекрестье получить результат. В таблице AND, например, третий столбец (Неизвестно) и первая строка (Верно) на пересечении в верхнем правом углу дают результат - неизвестно, другими словами: Верно AND Неизвестно=неизвестно.
Порядок вычислений определяется круглыми скобками. Они не представляются каждый раз. NOT оценивается первым, далее AND и OR. Различные типы предикатов<predicate> рассматриваются отдельно в следующем разделе.
<comparison predicate> (предикат сравнения)
Синтаксис
<value expresslon> <relational op> <value expresslon> |
<subquery> <relatlonal op> ::= = | < | > | < | >= | <>
Если либо <value expression>=NULL, либо <comparison predicate >=неизвестно; другими словами, это верно если сравнение верно или невер-но если сравнение неверно.
<relational op> имеет стандартные математические значения для числовых значений; для других типов значений, эти значения определяются конкретной реализацией. Оба <value expression> должны иметь сравнимые типы данных. Если подзапрос<subquery> используется, он должен содержать одно выражение <value expression> в предложении SELECT, чье значение будет заменять второе выражение <value expression> в предикате сравнения<comparision predicate>, каждый раз когда <subquery > действительно выполняется.
<between predicate>
Синтаксис
< value expression > [NOT] BETWEEN < value expression >
AND < value expression >
< between predicate > - A BETWEEN B AND C, имеет такое же значение что и <predicate > - (A >=B AND <=C). <between predicate> для которого A NOT BETWEEN B AND C, имеет такое же значение что и NOT (BETWEEN B AND C). <value expression> может быть выведено с помощью нестандартного запроса <subquery> (*nonstandard* ).
< in prediicate >
Синтаксис
<value expression> [NOT] IN <value list> | <subquery>
Список значений<value list> будет состоять из одного или более перечисленых значений в круглых скобках и отделяемых запятыми, которые имеют сравнимый с <value expression> тип данных. Если используется подзапрос<subquery>, он должен содержать только одно выражение <value expression> в предложении SELECT (возможно и больше, но это уже будет вне стандарта ANSI). Подзапрос<subquery > фактически, выполняется отдельно для каждой строки-кандидата основного запроса, и значения которые он выведет, будут составлять список значений<value list> для этой строки. В любом случае, предикат<in predicate> будет верен если выражение<value expression> представленное в списке значений<value list>, если не указан NOT. Фраза A NOT IN (B, C) является эквивалентом фразы NOT (A IN (B, C)).
< like predicate >
Синтаксис
<charvalue> [NOT] LIKE <pattern> [ESCAPE
<escapechar>]
<charvalue > - это любое *нестандартное* выражение <value expression> алфавитно-цифрового типа. <charvalue > может быть, в сооветствии со стандартом, только определенным столбцом<column spec>. Образец<pattern> состоит из строки<string> которая будет проверена на совпадение с <charvalue>. Символ окончания<escapechar > - это одиночный алфавитно-цифровой символ. Совпадение произойдет, если верны следующие условия :
* Для каждого символа подчеркивания<underscore > в бразце<pattern > которая не предшесивует символу окончания<escapechar>, имеется один соответствующий ему символ <charvalue>.
* Для каждого < percent sign> в образце<pattern> который не предшествует <escapechar>, имеются нули или более соответствующие символы в <charvalue>.
* Для каждого <escapechar > в <pattern > который не предшествует другому <escapechar>, нет никакого соответствующего символа в <charvalue>.
* Для каждого иного символа в <pattern>, один и тот же символ устанавливается у соответствующей отметке в <charvalue>.
Если совпадение произошло, <like predicate > - верен, если не был указан NOT. Фраза NOT LIKE 'текст' - эквивалентна NOT (A LIKE 'текст').
< null predicate >
Синтаксис
<column spec> IS [NOT] NULL
<column spec>=IS NULL, если NULL значение представлено в этом столбце. Это сделает <null predicate > верным если не указан NULL. Фраза <column spec> IS NOT NULL, имеет тот же результат что и NOT (<column spec > IS NULL ).