Условия в предложении where могут быть либо простыми, либо содержать множество условий. Множественные условия могут быть созданы с помощью операторов and, or и not. Поведение этих операторов было описано с использованием таблиц истинности.
Если два условия соединяются оператором and, то выбираются строки, соответствующие обоим условиям. Если два условия соединены оператором or, то выбираются все строки таблицы, для которых истинны либо первое условие, либо второе, либо оба вместе, как показано в примере 6.5.
Результат примера 6.5 содержит некоторые дубликаты значений столбца emp по. Если лишнюю информацию нужно устранить, то должна быть использована опция distinct, как показано здесь:
В этом случае результатом будет:
Заметьте, что опция distinct может быть использована только один раз в списке оператора select, и она должна предшествовать всем именам столбцов в этом списке. Поэтому пример 6.6 ошибочен.
Предложение where может включать любое количество одних и тех же или различных логических операций. Вы должны помнить, что все три логические операции имеют различные приоритеты выполнения: операция not имеет наивысший приоритет, and вычисляется следующей, а операция or имеет самый низший приоритет. Если вы не можете запомнить все эти отличия приоритетов логических операций, то можете получить неожиданный результат, как показано в примере 6.7.
Здесь два оператора select отображают два различных набора данных результатов. В первом операторе select система вычисляет в первую очередь оба оператора and (слева направо), затем вычисляется оператор or. Во втором операторе select использование скобок изменяет порядок выполнения операций: все выражения внутри круглых скобок выполняются первыми в порядке слева направо. Как вы можете видеть, первый оператор возвращает одну строку, в то время как второй возвращает ноль строк.
Существование нескольких логических операций в предложении where усложняет соответствующий оператор select и делает его подверженным ошибкам. В таких случаях очень рекомендуется использовать круглые скобки, даже если в них и нет особой необходимости. Читаемость таких операторов select будет сильно улучшена, а вероятность ошибок уменьшится. Вот первый оператор select из примера 6.7, измененный с использованием рекомендованной формы:
use sample;
select emp_no, emp_fname, emp_lname from employee
where (emp_no = 25348 and emp_lname = 'Smith') or (emp_fname = 'Matthew' and dept_no = 'dl');
Третий логический оператор, not, изменяет логическое значение соответствующего условия. Таблица истинности для not показывает, что отрицание истинного значения дает ложь и наоборот. Отрицание значения null дает также null.
В примере 6.8 показано использование оператора отрицания.
В этом случае оператор not может быть заменен оператором сравнения о (не равно).