Skip to content

Проверка нескольких условий. AND, OR

При выборке данных мы можем указывать несколько условий одновременно. Для объединения условий можно использовать операторы and (логическое "И") и or(логическое "ИЛИ"). Разберем каждый из них на примерах.

Пример №1: получим список блюд с рейтингом, меньшим чем 320, но со стоимостью большей, чем 2:

sql
select *
from dishes
where rating < 320
and price > 2
select *
from dishes
where rating < 320
and price > 2

Пример №2: получим список блюд, рейтинг которых варьируется от 280 до 320 включительно, и цена которых меньше 30:

sql
select d.*
from dishes d
where rating ≥ 280
and rating ≤ 320
and price < 30
select d.*
from dishes d
where rating ≥ 280
and rating ≤ 320
and price < 30

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

sql
select d.*
from dishes d
where rating ≥ 280
and rating ≤ 320
and price < 30
and 1 = 0
select d.*
from dishes d
where rating ≥ 280
and rating ≤ 320
and price < 30
and 1 = 0

В приведенном выше примере выражение 1 = 0 является ложным, а значит и всё условие также становится ложным, что приводит к отсутствию данных в выборке.

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

Пример №3: Получить список блюд, рейтинг которых либо 320, либо 280:

sql
select d.*
from dishes d
where rating =280
or rating = 320
select d.*
from dishes d
where rating =280
or rating = 320

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

Например, следующий запрос вернет все строки из таблицы dishes:

sql
select d.*
from dishes d
where rating = -1
or 1 < 2
select d.*
from dishes d
where rating = -1
or 1 < 2

Несмотря на то, что у нас нет ни одного блюда с рейтингом, равным -1, запрос вернул все строки, так как для каждой строки будет истинным условие "1 < 2".

Используя комбинирование AND и OR, можно составлять более сложные условия.

Пример №4: Получить список блюд, рейтинг которых равен 320 и стоимость больше 30, либо рейтинг которых меньше, чем 270:

sql
select d.*
from dishes d
where (d.rating = 320 and d.price > 30)
or d.rating < 270
select d.*
from dishes d
where (d.rating = 320 and d.price > 30)
or d.rating < 270

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

Свиная отбивная попала в выборку потому, что она удовлетворяет условию d.rating = 320 and d.price > 30 (Ее стоимость 30.5, а рейтинг = 320). Борщ попал в выборку потому, что он удовлетворяет условию d.rating < 270 (его рейтинг равен 130). Так как между двумя условиями (выражение в скобках рассматриваем как одно условие) стоит OR, то в выборку попадает любая строка, которая удовлетворяет хотя бы одному из этих условий.

Для того, чтобы лучше понять, какую роль здесь выполняют скобки, выполним тот же запрос, но только расставим в нем скобки по-другому:

sql
select d.*
from dishes d
where d.rating = 320 and
(d.price > 30 or d.rating < 270)
select d.*
from dishes d
where d.rating = 320 and
(d.price > 30 or d.rating < 270)

Сейчас в выборку попала только свиная отбивная. Давайте разберемся, почему. Учитывая скобки, каждая строка в выборке должна удовлетворять следующим условиям:

  • Рейтинг должен быть равен 320
  • Стоимость должна быть больше 30, либо рейтинг должен быть меньше 270

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

Итак, блюд с рейтингом, равным 320, всего два - "Макароны с сыром" и "Свиная отбивная". Т.е. по первому условию в выборку попадают всего 2 блюда. Теперь по второму условию. У Макарон с сыром стоимость = 20.56, рейтинг = 320. Посмотрим, будет ли истинным второе условие для них; для этого просто мысленно подставим значения в условие: 20.56 > 30 или 320 < 270. Для того, чтобы данное условие было истинным, достаточно, чтобы хотя бы одно из его частей было истинным, т.к. используется OR. Но, как видно, ни одно из них не является истинным. Это значит, что все выражение в скобках является ложным, а значит и данная строка не попадет в выборку.