Запросы, в которых есть только одно условие, являются наиболее простыми. Чаще всего необходимо найти данные по нескольким условиям одновременно. Эта проблема решается с помощью булевых операторов. В стандарте предусмотрено три булевых оператора: AND (логическое "и"), OR (логическое "или"), NOT (логическое "нет"). Например, если необходимо найти данные в таблице по двум условиям и при этом оба условия должны выполняться одновременно, то необходимо объединить их с помощью оператора AND.
Сразу же рассмотрим пример, в котором найдем человека по имени Андрей и с идентификатором должности равным 12:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' AND idPosition=12
Результат запроса - все строки содержащие в поле "vcName" имя Андрей и в поле "idPosition" значение больше 12. Если какое-то из этих условий не выполнится, то строка не будет выбрана.
Теперь посмотрим на пример, в котором выбираются все люди с именем Андрей, и работник, у которого поле "idPosition" равно 1 (это должность генерального боса). Это значит, что объединить эти два условия нужно через оператор OR:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' OR idPosition=1
Следующий пример отображает строку для Пирогова Андрея:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' AND vcFamil='Пирагов'
Для того чтобы строка была выбрана, необходимо чтобы оба условия были верны (потому что мы используем оператор AND).
Теперь познакомимся с оператором NOT (не). Посмотрите на следующий запрос:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' AND NOT idPosition=12
В этом запросе выбираются все Андреи, но при этом "idPosition" не должно быть равно 12. Обратите внимание, что во втором условии "NOT idPosition =1" оператор NOT стоит вначале. Вот именно там он и должен стоять, и не вздумайте его ставить в середину или даже в конец условия. В принципе, это условие идентично условию " не равно", т.е. <>:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' AND idPosition<>12
Но это не значит, что этот оператор не нужен. Иногда он действительно очень удобен, вы в этом особенно убедитесь, когда мы начнем изучать такие операторы как IN и BETWEEN или познакомимся со сравнением с нулевым значением.
При использовании булевых операторов вы можете использовать скобки для объединения условий. Допустим, что нужно вывести всех людей с именем Андрей и при этом "idPosition" должно быть равно 10 или 12. Если написать следующий запрос:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' AND idPosition=12 OR idPosition=10
Результат будет не совсем таким, как мы ожидали. Будут выбраны все Андреи с idPosition =12 или все записи, вне зависимости от имени, но с "idPosition" равным 10. А ведь в нашем условии было сказано совершенно другое.
11 СЕРЕЖКИН АНДРЕЙ ВАСИЛЬЕВИЧ 10 1969-01-05 12 КОРОВА ВЛАД ИВАНОВИЧ 10 1969-08-02 16 САДОВОДОВ АНДРЕЙ ИВАНЫЧ 12 1969-08-03 19 СОВИН АНДРЕЙ ВАСИЛЬЕВИЧ 12 1969-09-08
Обратите внимание, что у второй строки имя не Андрей, но она появилась среди результата. Правильным будет запрос:
SELECT * FROM tbPeoples WHERE vcName = 'Андрей' AND (idPosition=12 OR idPosition=10)
Результат запроса - все строки, содержащие в поле "vcName" значение Андрей и в поле "idPosition" значение равное 1 или 2. Для того чтобы строка была выбрана, необходимо чтобы условие vcName = 'Андрей' и условие в скобках были верны.
Можно еще больше усложнить запрос и сделать вложенные скобки:
SELECT * FROM tbPeoples WHERE idPeoples>1 AND (idPosition>10 OR (vcName='ИВАН' AND vcSurname='ПАЛЫЧ'))
Получается, что у нас могут быть круглые скобки внутри круглых скобок, что позволяет создать логику выбора любой сложности.