2.4. SQL - Булевы операторы

Запросы, в которых есть только одно условие, являются наиболее простыми. Чаще всего необходимо найти данные по нескольким условиям одновременно. Эта проблема решается с помощью булевых операторов. В стандарте предусмотрено три булевых оператора: 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='ПАЛЫЧ'))

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

Предыдущая глава

2.3. SQL - Ограничение выборки

Следующая глава

SQL – поиск данных

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне