Проверка нескольких условий. AND, OR
При выборке данных мы можем указывать несколько условий одновременно. Для объединения условий можно использовать операторы and
(логическое "И") и or
(логическое "ИЛИ"). Разберем каждый из них на примерах.
Пример №1: получим список блюд с рейтингом, меньшим чем 320, но со стоимостью большей, чем 2:
select *
from dishes
where rating < 320
and price > 2
select *
from dishes
where rating < 320
and price > 2
Пример №2: получим список блюд, рейтинг которых варьируется от 280 до 320 включительно, и цена которых меньше 30:
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
следует всегда помнить о том, что если хотя бы одно из условий будет ложным, то результат всего выражения также будет ложным:
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:
select d.*
from dishes d
where rating =280
or rating = 320
select d.*
from dishes d
where rating =280
or rating = 320
При использовании ключевого слова OR
все выражение будет считаться истинным, если хотя бы одно условие из перечисленных будет истинным.
Например, следующий запрос вернет все строки из таблицы dishes:
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:
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
, то в выборку попадает любая строка, которая удовлетворяет хотя бы одному из этих условий.
Для того, чтобы лучше понять, какую роль здесь выполняют скобки, выполним тот же запрос, но только расставим в нем скобки по-другому:
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
. Но, как видно, ни одно из них не является истинным. Это значит, что все выражение в скобках является ложным, а значит и данная строка не попадет в выборку.