Логические операторы
Сложные задачи требуют сложных условий для среза. Представьте, что вам нужно отобразить покупателей из Москвы или Перми, которые покупают продукцию только определённой компании. Отбирать данные по городам вы умеете, но как объединить два города в запросе? И добавить условие с названием компании?
Для таких задач используют логические операторы. С их помощью можно объединять условия или выбирать всё, что этим условиям не соответствует. В SQL таких операторов три:
AND, OR, NOT.Операторы AND и OR
Операторы
AND и OR позволяют объединять условия. AND применяют в том случае, если выгружаемые данные должны соответствовать всем перечисленным условиям.Объединим два условия и отберём всех жителей Тулы старше 43 лет:
SQL
Туляки младше этого возраста в список не войдут. А жители других городов и подавно.
Отобрать данные, которые удовлетворяют одному из условий, можно оператором
OR:SQL
В таком списке окажутся не только жители Тулы, но и жители Перми.
Оператор NOT
Чтобы отобрать жителей всех городов, кроме Тулы, можно «перевернуть» условие оператором
NOT. С его помощью выгружают записи, которые не соответствуют условию:SQL
Оператор
NOT можно также использовать в нескольких условиях. Следом за туляками из выборки пропадут и пермяки:SQL
Правила действия логических операторов
С такими простыми примерами сложностей не возникает, но иногда непросто разобраться, какие значения вернёт тот или иной оператор.
На самом деле поведение операторов можно описать правилами. Условия, которые вы объединяете в запросе после
WHERE, представляют собой утверждения. В запросе ниже их два:SQL
В переводе с языка SQL на человеческий эти утверждения выглядят так:
- Человек проживает в городе Тула.
- Человек проживает в городе Пермь.
Каждое из них проверяется на истинность, и на выходе получается либо значение
TRUE, если утверждение истинно, или FALSE, если ложно. Затем каждый из логических операторов действует по своим правилам:ANDвозвращаетTRUE, только если оба логических значения тожеTRUE.ORвозвращаетTRUE, если хотя бы одно логическое значение тожеTRUE.NOTменяет значение выражения на противоположное:TRUEнаFALSE, аFALSEнаTRUE.
Возможные сочетания можно собрать в таблицу истинности:
Благодаря логическим операторам в SQL можно записать сложные, но непротиворечивые условия. Ради этого приходится заучивать правила, по которым действуют логические операторы.
Попробуйте поменять различные параметры в мини-тренажёре ниже. Обратите внимание, как параметры влияют на результат.
Приоритет операторов
Кажется, разобраться с такими условиями уже не так легко. Чем больше условий, тем сложнее уследить за логикой операторов. Условия с разными логическими операторами различаются приоритетом. Первым всегда выполняется условие с оператором
NOT, за ним AND и только в последнюю очередь — условие с OR. Управлять порядком можно с помощью скобок. В математике арифметические операции в скобках имеют больший приоритет и выполняются первыми. В SQL так же: скобки помогут комбинировать условия и получить нужный срез.
Продолжим отбирать жителей разных городов:
SQL
Кого охватит такое условие — туляков старше 43 лет или пермяков моложе 43 лет? И тех и других. Это условие можно переписать так:
SQL
Результат будет одинаковым. Условия с оператором
AND обладают большим приоритетом, чем условия с OR. Вспомните математику: умножение выполняется перед сложением. У логических операторов похожая логика. Если добавить скобки, можно не сомневаться в том, что в срез попадут нужные данные.Сравните с другим условием:
SQL
Условие в скобках приоритетнее, значит, в таблицу попадут и туляки, и пермяки, чей возраст больше 43 лет.