Проверка нескольких условий. 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
NAME | PRICE | RATING |
---|---|---|
Борщ | 10 | 130 |
Пример №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
NAME | PRICE | RATING |
---|---|---|
Макароны с сыром | 20.56 | 320 |
Чай с молоком | 1.2 | 280 |
INFO
При использовании оператора 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
Результат:
no data found
no data found
В приведенном выше примере выражение 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
NAME | PRICE | RATING |
---|---|---|
Макароны с сыром | 20.56 | 320 |
Чай с молоком | 1.2 | 280 |
Свиная отбивная | 30.5 | 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
NAME | PRICE | RATING |
---|---|---|
Макароны с сыром | 20.56 | 320 |
Борщ | 10 | 130 |
Чай с лимоном | 1.34 | 270 |
Чай с молоком | 1.2 | 280 |
Свиная отбивная | 30.5 | 320 |
Овощной салат | 5.7 | - |
Несмотря на то, что у нас нет ни одного блюда с рейтингом, равным -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
NAME | PRICE | RATING |
---|---|---|
Борщ | 10 | 130 |
Свиная отбивная | 30.5 | 320 |
В приведенном выше примере использовались скобки для группировки условий.
Скобки используются для того, чтобы определить приоритет вычисления выражения. Здесь все, как если бы мы считали обычное математическое выражение - то, что в скобках, вычисляется отдельно.
Свиная отбивная попала в выборку потому, что она удовлетворяет условию 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)
NAME | PRICE | RATING |
---|---|---|
Свиная отбивная | 30.5 | 320 |
Сейчас в выборку попала только свиная отбивная. Давайте разберемся, почему. Учитывая скобки, каждая строка в выборке должна удовлетворять следующим условиям:
- Рейтинг должен быть равен 320
- Стоимость должна быть больше 30, либо рейтинг должен быть меньше 270
При этом, эти два условия должны быть истинными одновременно, т.к. между ними указано ключевое слово AND
.
Итак, блюд с рейтингом, равным 320, всего два:
- "Макароны с сыром"
- "Свиная отбивная"
Т.е. по первому условию в выборку попадают всего 2 блюда.
Теперь по второму условию. У Макарон с сыром стоимость - 20.56, рейтинг - 320. Посмотрим, будет ли истинным второе условие для них: "20.56 > 30 или 320 < 270".
Для того, чтобы данное условие выполнилось, достаточно, чтобы хотя бы одно из его частей было истинным, т.к. используется OR
. Но, очевидно, все они являются ложными. Это значит, что все выражение в скобках является ложным, и поэтому вся строка не попадет в выборку.