- •Информационное обеспечение систем управления Построение запросов при работе с базой данных (Учебное пособие)
- •Тестовая база данных
- •Выборка данных. Команда select
- •Синтаксис оператора select
- •Простые варианты поиска данных
- •Упорядочение результата запроса. Предложение order by
- •Использование ключевого слова distinct
- •Предложение where
- •Синтаксис предложения where
- •Использование операторов сравнения
- •Использование варианта between
- •Проверка на присутствие в списке значений (вариант in)
- •Проверка на пустое значение
- •Поиск в строковых столбцах
- •Вариант like
- •Использование логических операций в условиях поиска
- •Порядок выполнения логических операций
- •Преобразование данных при выборке
- •Обобщение Данных с помощью Агрегатных Функций
- •Использование distinct с count
- •Предложение group by
- •Предложение having
- •Соединение таблиц
- •Внутренние соединения (связывание по равенству)
- •Внешние соединения
- •Левое внешнее соединение
- •Правое внешнее соединение
- •Полное внешнее соединение
- •Более сложные примеры соединений
- •Рефлексивное соединение, или самосоединение
- •Использование подзапросов в операторах sql
- •Выбор одного
- •Использование в подзапросе агрегатных функций
- •Связанные подзапросы
- •Использование оператора exists
- •Использование варианта in с подзапросами
- •Использование not exists
- •Объединение запросов
- •Команда union
- •Добавление данных. Команда insert
- •Добавление отдельной строки
- •Добавление группы строк
- •Обновление уже имеющихся данных. Команда update
- •Удаление данных из таблиц. Команда delete
- •Генераторы и их использование
- •Создание генераторов
- •Использование генераторов
- •Увеличение значения генератора
- •Получение значения генератора в приложение
- •Триггер
Использование логических операций в условиях поиска
Вот последние четыре строки в описании синтаксиса предложения WHERE:
...
| (<условия поиска>)
| NOT <условия поиска>
| <условия поиска> OR <условия поиска>
| <условия поиска> AND <условия поиска>
Это означает, что любую правильную часть условия можно заключать в круглые скобки и что можно строить сколь угодно сложные логические условия, используя операции отрицания (NOT), дизъюнкции (OR) и конъюнкции (AND).
Следует быть аккуратным при построении сложных логических условий, особенно если вам нужно выполнить некоторые преобразования условий, содержащих отрицание. Люди часто допускают здесь ошибки.
В математической логике существует два замечательных закона де Моргана1, которые позволяют выполнить преобразование отрицания конъюнкции и отрицания дизъюнкции. Законы простые:
NOT (A AND B) = NOT (A) OR NOT (B)
NOT (A OR B) = NOT (A) AND NOT (B)
То есть отрицание конъюнкции двух высказываний (в нашем случае — условий, которые так же, как и высказывания, возвращают истинностное значение: "истина" или "ложь") равно дизъюнкции отрицаний этих высказываний. Отрицание дизъюнкции равно конъюнкции отрицаний. Если вы это хорошо запомните, то у вас не будет головной боли при выполнении преобразований условий.
ЗАМЕЧАНИЕ
Тот факт, что в SQL используется не двухзначная, а трехзначная логика, ничего не меняет в используемых нами законах исчисления высказываний. В случае допустимости у столбцов пустых значений мы должны лишь проверить нужные нам столбцы на NULL. Этого достаточно.
Рассмотрим пример. Чуть раньше мы отображали список тех, чья дата рождения находится в диапазоне от 1.01.1960 до 31.12.1969. Мы использовали следующий оператор:
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия",
PR_BIRTHDAY AS "Дата рождения"
FROM PERSON
WHERE PR_BIRTHDAY >= '1.01.1960' AND PR_BIRTHDAY <= '31.12.1969'
Если же нам нужен список людей с датами рождения, не входящими в этот диапазон (то есть находящимися в точности за пределами этого диапазона), то мы должны выполнить отрицание выражения:
PR_BIRTHDAY >= '1.01.1960’ AND PR_BIRTHDAY <= ‘31.12.1969’
В соответствии с законом де Моргана мы получаем оператор:xxiii
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия",
PR_BIRTHDAY AS "Дата рождения"
FROM PERSON
WHERE (PR_BIRTHDAY < '1.01.1960' OR PR_BIRTHDAY > '31.12.1969')
Здесь нам нужно выполнить отрицание нашего выражения, задающего условия для окладов сотрудников. Отрицанием для операции сравнения >= будет < (или !>= или ^>=), для операции <= отрицанием будет > (!<=, ^ <=). Конъюнкцию мы меняем на дизъюнкцию.
Если кому-то вдруг по непонятной причине не очень нравится использование фактов из математической логики, то в данном случае легко можно использовать вариант BETWEEN, что мы и делали раньше:
PR_BIRTHDAY BETWEEN '1.01.1960’ AND ‘31.12.1969’
для задания первоначального диапазона и
PR_BIRTHDAY NOT BETWEEN '1.01.1960’ AND ‘31.12.1969’
для дат рождения за пределами этого диапазона. Применение закона де Моргана в этом случае выполнит сам сервер базы данных.
