Чтение онлайн

на главную - закладки

Жанры

Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Борри Хелен

Шрифт:

В этом примере выражения были использованы:

* для преобразования найденных данных в выходные столбцы;

* для задания условий поиска в предложении WHERE оператора SELECT. Тот же подход может быть использован для условий поиска операторов UPDATE и DELETE.

Другие контексты, где могут использоваться выражения:

* для задания условий проверки данных в ограничениях CHECK;

* для определения вычисляемых (COMPUTED BY) столбцов в операторах CREATE TABLE и ALTER TABLE;

* для преобразования или создания входных данных в процессе их

сохранения в таблице при использовании операторов INSERT или UPDATE;

* для упорядочения или группирования выходных наборов;

* при установке во время выполнения условий определения вывода;

* в условиях потока управления в модулях PSQL.

Предикаты

Предикат - это просто выражение, которое утверждает некоторый факт о значении. Операторы SQL обычно проверяют предикаты во фразах WHERE и В выражениях CASE, ON является проверкой для предикатов JOIN, HAVING проверяет атрибуты в сгруппированном выводе. В PSQL операторы управления потоком выполнения проверяют предикаты в предложениях IF, WHILE и WHEN. Решения принимаются в соответствии с результатом вычисления предиката - истина или ложь.

Строго говоря, предикат может быть истинным, ложным и неопределенным. В SQL ложный и неопределенный результаты объединяются и трактуются как ложь. Иными словами, "если он не истинный, значит он ложный".

Стандартный язык SQL имеет формальные спецификации для множества операторов выражений, которые признаются необходимыми для конструирования предикатов поиска. Предикат состоит из трех базовых элементов: двух сравниваемых значений и оператора, который задает проверку утверждения об этой паре значений.

Все операторы, включенные в табл. 21.1 (которая появится позже в этой главе), могут быть операторами предикатов. Значения, включенные в предикат, могут быть простыми или чрезвычайно сложными вложенными выражениями. Пока сравниваемые выражения, которые могут растворяться среди константных значений, являются правильными, то не имеет значения, насколько они сложны.

Возьмем такой простой оператор, где равенство = используется для проверки точного соответствия:

SELECT * FROM EMPLOYEE

WHERE LAST_NAME = 'Smith';

Это предикат "значением столбца LAST_NAME является 'smith'". Сравниваются две константы (текущее значение столбца и строковый литерал) для проверки их равенства. Выбирая каждую строку из таблицы EMPLOYEE, сервер будет отбрасывать все, где предикат является ложным (значение отличается от 'Smith') или неопределенным (столбец имеет значение NULL, следовательно, он не может быть определен, как имеющий значение 'Smith' или не имеющий значение 'Smith').

Где проверяется истинность

Синтаксическими элементами, проверяющими истинность, являются:

* в DDL: CHECK для проверки условий достоверности данных;

* в SQL: WHERE (для условий поиска), HAVING и NOT HAVING (для условий выбора групп), ON (для условий соединения)

и случаи проверки множества условий CASE, COALESCE и NULLIF;

* в PSQL: IF (универсальная проверка истина/ложь), WHILE (для проверки условий цикла) и WHEN (для проверки кодов исключения).

Утверждения

Часто условия, проверяемые в WHERE, IF и т.д., не являются простыми предикатами, а группой нескольких предикатов, каждый из которых при вычислении делает вклад в вычисление общей истинности. Утверждение может состоять из одного предиката или из нескольких предикатов, связанных логическими операциями AND или OR. Каждый из этих предикатов сам может содержать вложенные предикаты. Окончательный результат вычисление истинности утверждения получается в результате процесса, который работает по направлению от внутренних предикатов к внешним. Каждый "уровень" должен быть вычислен в порядке своего приоритета, пока не будет возможным получить окончательное значение утверждения.

В следующем наборе условий поиска проверяемое утверждение содержит два условия. Ключевое слово AND связывает два предиката, приводя к тому, что окончательное утверждение будет истинным, если оба предиката будут истинными:

SELECT * FROM EMPLOYEE

WHERE (

(HIRE_DATE > CURRENT_DATE - 366)

AND (SALARY BETWEEN 25000.00 AND 39999.99));

Строки, для которых одно утверждение истинно, а другое ложно, будут отбрасываться.

Первый предикат (HIRE_DATE > CURRENT_DATE - 366) использует выражение, состоящее из переменной и операции вычисления значения, которое будет сравниваться со значением столбца. В этом случае утверждение использует оператор- утверждение будет истинным, если значение столбца будет больше, чем значение, полученное из выражения.

Второй предикат использует другой оператор. Ключевое слово BETWEEN задает проверку "больше или равно значению в левой части и меньше или равно значению в правой части".

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

Решение, что является истинным

На рис. 21.1 показаны возможные результаты вычисления двух предикатов из предыдущего примера.

В нашем примере вначале проверяется (HIRE_DATE > CORRENT_DATE - 366), потому что это самый левый предикат. Если бы у него были вложенные предикаты, то сначала проверялись бы они. Ни для одного из предикатов нет проверки на NULL, но мы включили сюда тот случай, когда встречается пустое ("неизвестное") значение в проверяемых данных, что приведет к результату "ложь", поскольку проверка не может вернуть истину. Должна быть доказана истинность предикатов, чтобы они считались истинными.

Поделиться:
Популярные книги

Хозяйка усадьбы, или Графиня поневоле

Рамис Кира
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Хозяйка усадьбы, или Графиня поневоле

Бастард Императора. Том 6

Орлов Андрей Юрьевич
6. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Бастард Императора. Том 6

Темный Лекарь 4

Токсик Саша
4. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 4

Хозяйка дома на холме

Скор Элен
1. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка дома на холме

Чехов. Книга 3

Гоблин (MeXXanik)
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Чехов. Книга 3

Прометей: повелитель стали

Рави Ивар
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Прометей: повелитель стали

Наследник пепла. Книга II

Дубов Дмитрий
2. Пламя и месть
Фантастика:
фэнтези
5.00
рейтинг книги
Наследник пепла. Книга II

Наследник, скрывающий свой Род

Тарс Элиан
2. Десять Принцев Российской Империи
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Наследник, скрывающий свой Род

Наследие Маозари 7

Панежин Евгений
7. Наследие Маозари
Фантастика:
боевая фантастика
юмористическое фэнтези
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 7

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Нищий барин

Иванов Дмитрий
1. Барин
Фантастика:
попаданцы
5.00
рейтинг книги
Нищий барин

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Солдат Империи

Земляной Андрей Борисович
1. Страж
Фантастика:
попаданцы
альтернативная история
6.67
рейтинг книги
Солдат Империи