Сложные условия фильтрации — Основы SQL
Достаточно распространенная ситуация — нам нужно выбрать строки по нескольким условиям. Например, мы ищем все курсы, которые созданы до 14 июня 2022 года и содержат в описании слово dolor .
Мы можем составить два запроса: один на условие с датой, второй — на условие с текстом в описании. Потом мы сравниваем, какие строки попали в оба запроса. Этот способ крайне неудобный и чреват ошибками.
В этом уроке мы научимся решать эту задачу по-другому. Вы узнаете, как сочетать несколько условий в одном запросе с помощью логических операторов OR и AND .
Таблицы истинности
Прежде чем приступать к запросам, давайте рассмотрим, в чем разница между логическими операторами OR и AND .
Начнем с оператора OR . Он переводится как «ИЛИ» и указывает, что выражение будет верным, если хотя бы одно условие выполняется.
Пусть у нас будет два условия: A и B . Например:
- А: В описании содержится слово «dolor»?
- B: Дата создания до 14 июня 2022 года?
Составим таблицу, в которой перечислим всевозможные сочетания этих условий и результат A OR B . Такая таблица называется таблицей истинности оператора OR :
Второй оператор — это AND . Он переводится как «И» и указывает, что выражение будет верным, только если оба условия A и B выполняются.
Таблица истинности оператора AND выглядит так:
Как объединять условия
Теперь вы знаете, как работают логические операторы. Попробуем объединить несколько условий в одном запросе.
Представим, что строка должна попасть в результирующую таблицу только если оба условия будут выполнены. В таком случае мы используем AND .
Выведем всю информацию о курсах, созданных до 14 июня 2022 года и содержащих слово dolor в описании:
SELECT * FROM courses WHERE body SIMILAR TO '%dolor%' AND created_at '2022-06-14';
В этом запросе мы выбираем по двум условиям:
- В описании встречается слово dolor
- И при этом дата создания курса строго раньше 14 июня 2022 года
Обратите внимание на запись запроса выше. Он разбит на отдельные строки: строка для перечисления столбцов, строка для указания таблицы, строка для условий фильтрации. Ранее мы работали с более простыми запросами, в которых разбиение не требовалось.
Для сложных запросов будем придерживаться такого формата записи, потому что он позволяет лучше ориентироваться.
Теперь представим такую задачу: нужно выбрать пользователей с идентификатором больше 90. Мы знаем, что иногда идентификатор не проставляется из-за сбоя. Поэтому мы добавляем в результирующую таблицу еще и тех пользователей, у кого идентификатор не проставлен вовсе.
Чтобы это сделать, нам нужно использовать логический оператор OR :
SELECT * FROM users WHERE id > 90 OR id IS NULL
Если бы мы ошиблись в этом запросе и вместо OR использовали бы AND , то такой запрос всегда бы возвращал пустую таблицу — идентификатор не может быть одновременно пустым и больше 90.
Логические операторы OR и AND можно комбинировать, однако нужно помнить об особенности — приоритет AND выше, чем OR . Другими словами, всегда сначала выполняются проверки на «И», а уже потом — на «ИЛИ».
Чтобы не создавать неоднозначностей, в сложных условиях рекомендуем использовать круглые скобки. Проверка в скобках имеет больший приоритет:
SELECT * FROM users WHERE first_name = 'Andy' OR (created_at > '2022-06-13' AND created_at '2022-06-14');
В этом запросе мы выберем либо пользователей с именем Andy, либо тех, кто зарегистрировался между 13 и 14 июня 2022 года.
Выводы
В этом уроке мы научились объединять условия с помощью логических операторов OR и AND .
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
SQL комбинирование условий AND и OR
SQL условия AND и OR можно комбинировать для проверки нескольких условий в операторе SELECT, INSERT, UPDATE или DELETE.
Синтаксис
Синтаксис для условий AND и OR в SQL:
WHERE condition1
AND condition2
.
OR condition_n;
Параметры или аргументы
condition1 , condition2 , . condition_n Условия, которые оцениваются, чтобы определить, будут ли выбраны записи.
Примечание
- SQL условия позволяют тестировать несколько условий.
- Не забудьте порядок операций в скобках!
Пример — использование условий AND и OR с оператором SELECT
Рассмотрим пример того, как совместно использовать условие AND и условие OR в операторе SELECT.
В этом примере у нас есть таблица suppliers со следующими данными:
| supplier_id | supplier_name | city | state |
|---|---|---|---|
| 100 | Yandex | Moscow | Moscow |
| 200 | Lansing | Michigan | |
| 300 | Oracle | Redwood City | California |
| 400 | Bing | Redmond | Washington |
| 500 | Yahoo | Sunnyvale | Washington |
| 600 | DuckDuckGo | Paoli | Pennsylvania |
| 700 | Qwant | Paris | Ile de France |
| 800 | Menlo Park | California | |
| 900 | Electronic Arts | San Francisco | California |
Введите следующий SQL оператор:
Transact-SQL
FROM suppliers
WHERE ( state = ‘California’ AND supplier_id < >900 )
OR ( supplier_id = 100 );
Будет выбрано 3 записи. Вот результаты, которые вы получите:
| supplier_id | supplier_name | city | state |
|---|---|---|---|
| 100 | Yandex | Moscow | Moscow |
| 300 | Oracle | Redwood City | California |
| 800 | Menlo Park | California |
В этом примере будут возвращены все записи таблицы suppliers , которые находятся в штате California, но не имеют значения supplier_id , равного 900. В запросе также будут возвращены все записи suppliers , supplier_id которых равен 100. Скобки определяют порядок оценки условий AND и OR.
Пример использование условий AND и OR с оператором UPDATE
Далее давайте рассмотрим, как использовать условия AND и OR с оператором UPDATE.
В этом примере у нас есть таблица customers со следующими данными:
| customer_id | first_name | last_name | favorite_website |
|---|---|---|---|
| 4000 | Justin | Bieber | google.com |
| 5000 | Selena | Gomez | bing.com |
| 6000 | Mila | Kunis | yahoo.com |
| 7000 | Tom | Cruise | oracle.com |
| 8000 | Johnny | Depp | NULL |
| 9000 | Russell | Crowe | google.com |
Теперь продемонстрируем, как использовать условия AND и OR для обновления записей в таблице. Введите следующий оператор UPDATE:
Как в where написать несколько условий sql
Проверка нескольких условий (операторы OR и AND)
Если в предложение WHERE нужно проверить несколько условий, то для их соединения можно использовать логические операторы AND, OR и NOT.
Оператор AND объединяет два и более условий и возвращает истинное значение только при выполнении всех условий.
Найти в таблице tbl_clients данные о Bennett Sherry.
SQL:
SELECT * FROM tbl_clients
WHERE lastname=’Bennett’ AND name=’Sherry’
Найти данные о клиентах проживающих в Сиэтле и имеющих семьи численностью более 3-х человек:
SQL:
SELECT * FROM tbl_clients
WHERE region=’Seattle’ AND fam_size>3
Оператор OR также связывает два или больше условий, но возвращает истинный результат при выполнении хотя бы одного условия.
Вывести список клиентов, проживающих в Сиэтле или в Лос-Анджелесе:
SQL:
SELECT * FROM tbl_clients
WHERE region = ‘Seattle’ OR region=’Los Angeles’
Логический оператор NOT используется для построения отрицаний и помещается перед самим выражением.
Получить список всех клиентов, кроме тех, кто проживает Лос-Анджелесе.
SQL:
SELECT * FROM tbl_clients WHERE region != ‘Los Angeles’
SQL:
SELECT * FROM tbl_clients WHERE NOT region = ‘Los Angeles’
Аналогично арифметическим операторам, логические операторы также выполняются в строго определенной последовательности. Если в выражении используется несколько логических операторов, они выполняются в следующей последовательности: сначала NOT, затем AND и, наконец, OR.
Вывести данные о всех клиентах, проживающих в Сиэтле и только о тех клиентах из Лос-Анджелеса, численность семьи которых превышает 3-х человек.
SQL:
SELECT lastname, name, region, fam_size
FROM tbl_clients
WHERE region= ‘Seattle’ OR region = ‘Los Angeles’ AND fam_size>3
Ограничение на количество членов семьи в предыдущем запросе применяется только к клиентам из Лос-Анджелеса, так как оператор AND выполняется перед оператором OR. Чтобы первым выполнялся оператор OR, в запросе нужно использовать скобки.
В результате выполнения следующего запроса будут данные о всех клиентах из Сиэтла и Лос-Анджелеса, имеющих семьи численностью больше 3 человек:
SQL:
SELECT lastname, name, region, fam_size
FROM tbl_clients
WHERE (region= ‘Seattle’ OR region = ‘Los Angeles’) AND fam_size>3
Урок 2. Составные условия
В прошлом уроке мы научились выбирать совершеннолетних пользователей с помощью простого SQL запроса.
SELECT last_name, first_name, birthday FROM users WHERE age >= 18
Теперь попробуем немного уточнить запрос. Например, выберем всех совершенолетних мужчин. В таблицу я добавил дополнительное строковое поле sex, которое хранит m для мужчин и w для женщин:
| id | first_name | last_name | birthday | age | sex |
|---|---|---|---|---|---|
| 1 | Дмитрий | Иванов | 1996-12-11 | 20 | m |
| 2 | Олег | Лебедев | 2000-02-07 | 17 | m |
| 3 | Тимур | Шевченко | 1998-04-27 | 19 | m |
| 4 | Светлана | Иванова | 1993-08-06 | 23 | w |
| 5 | Олег | Ковалев | 2002-02-08 | 15 | m |
| 6 | Алексей | Иванов | 1993-08-05 | 23 | m |
| 7 | Алена | Процук | 1997-02-28 | 18 | w |
Давайте добавим вывод столбца sex и оставим только мужчин. Для этого в блоке условий, который начинается со слова WHERE нужно добавить AND sex = ‘m’:
SELECT last_name, first_name, birthday, sex FROM users WHERE age >= 18 AND sex = 'm'
После выполнения SQL запроса получиться такая таблица:
| id | last_name | first_name | birthday | sex |
|---|---|---|---|---|
| 1 | Иванов | Дмитрий | 1996-12-11 | m |
| 3 | Шевченко | Тимур | 1998-04-27 | m |
| 6 | Иванов | Алексей | 1993-08-05 | m |
Посмотрим на SQL запрос. Сейчас блок WHERE содержит составное условие: возраст больше или равен 18 годам и пол равен m. Это простое логическое выражение, которому соответствуют все записи для которых оба условия верны. То есть у которых одновременно и возраст от 18 лет и sex = «m».
Кстати, о sex = «m». Так как мы используем равенство, в результируеющей таблице в колонке sex для всех записей у нас выводится m. Это не логично, ведь мы и так знаем, что выбираем мужчин, поэтому смысла в том, что мы эту информацию выводим в таблице нет. А значит можно удалить sex из запроса. Удалим и посмотрим на результат выполнения SQL-запроса:
SELECT last_name, first_name, birthday FROM users WHERE age >= 18 AND sex = 'm'
| id | last_name | first_name | birthday |
|---|---|---|---|
| 1 | Иванов | Дмитрий | 1996-12-11 |
| 3 | Шевченко | Тимур | 1998-04-27 |
| 6 | Иванов | Алексей | 1993-08-05 |
Строки выводятся те же, однако столбца sex больше нет.
Обратите внимание, что извлекаем мы столбцы last_name, first_name, birthday, а фильтрутем по age и sex. То есть не обязательно чтобы столбцы, которые мы получаем, совпадали со столбцами в условии. Главное, чтобы все они были в таблице.
Но вернемся к составным условиям.
Кроме операции AND (И), в условии можно применять OR (ИЛИ). Давайте заменим AND на OR, а также вернем колонки sex и age:
SELECT last_name, first_name, birthday, sex FROM users WHERE age >= 18 OR sex = 'm'
И посмотрим на результат:
| id | last_name | first_name | birthday | sex | age |
|---|---|---|---|---|---|
| 1 | Иванов | Дмитрий | 1996-12-11 | m | 20 |
| 2 | Лебедев | Олег | 2000-02-07 | m | 17 |
| 3 | Шевченко | Тимур | 1998-04-27 | m | 19 |
| 4 | Иванова | Светлана | 1993-08-06 | w | 23 |
| 5 | Ковалев | Олег | 2002-02-08 | m | 15 |
| 6 | Иванов | Алексей | 1993-08-05 | m | 23 |
| 7 | Процук | Алена | 1997-02-28 | w | 18 |
Получили всех мужчин, а также женщин, которым исполнилось 18 лет. В частности в SQL-таблице две женщины старше 18 лет и все мужчины, даже те, которым меньше 18. Всё это соответствует условию ИЛИ. ИЛИ возраст от 18 лет, ИЛИ мужской пол.
Теперь переключимся на таблицу products. В ней появилось поле country, которое содержит данные о стране производителе:
| id | name | count | price | country |
|---|---|---|---|---|
| 1 | Телевизор | 3 | 43200.00 | RU |
| 2 | Микроволновая печь | 4 | 3200.00 | RU |
| 3 | Холодильник | 3 | 12000.00 | UA |
| 4 | Роутер | 1 | 1340.00 | US |
| 5 | Компьютер | 0 | 26150.00 | US |
| 6 | Утюг | 6 | 3200.00 | BL |
| 7 | Пылесос | 11 | 4500.00 | UA |
Давайте выберем товары, произведененные в России, Белоруссии и на Украине. Напишем SQL-запрос:
SELECT * FROM products WHERE country = "RU" OR country = "UA" OR country = "BL"
После выполнения запроса мы получим следующую таблицу:
| id | name | count | price | country |
|---|---|---|---|---|
| 1 | Телевизор | 3 | 43200.00 | RU |
| 2 | Микроволновая печь | 4 | 3200.00 | RU |
| 3 | Холодильник | 3 | 12000.00 | UA |
| 6 | Утюг | 6 | 3200.00 | BL |
| 7 | Пылесос | 11 | 4500.00 | UA |
Разберем запрос: в блоке WHERE мы используем три условия, разделенные OR (или). Во всех трех условиях мы с помощью символа равенства сравниваем значение в столбце country с одной из стран: ИЛИ Россия, ИЛИ Украина, ИЛИ Белоруссия.
Если мы хотим получить товары еще каких-то стран, то нужно добавить еще условия OR. Это не очень удобно, так как запрос становится громоздиким.
Но его можно упростить. Кроме стандартных условий сравнения AND и OR в языке SQL есть условие принадлежности IN, которое в данном случае подходит лучше. Напишем после WHERE:
SELECT * FROM products WHERE country IN ("RU", "UA", "BL")
Конструкция получилась короче и понятней. И с помощью неё мы выбираем данные, в которых страна равна любом из значений перечисленных в скобках. После запуска запроса мы получим результат, аналогичный предыдущему.
Но давайте добавим к запросу еще одно условие. Например нам нужны не просто товары, а товары стоимостью до 10 000 рублей. Напишем:
SELECT * FROM products WHERE country IN ("RU", "UK", "BL") AND price < 10000
И посмотрим результат:
| id | name | count | price | country |
|---|---|---|---|---|
| 2 | Микроволновая печь | 4 | 3200.00 | RU |
| 6 | Утюг | 6 | 3200.00 | BL |
| 7 | Пылесос | 11 | 4500.00 | UA |
Получили новую таблицу с тремя записями, которые удовлетовряют новому условию. И в этом условии мы совместили AND и IN. То есть в SQL-запросах можно совмещать логические операции AND и OR с оператором IN. Что делает их очень гибкими.
Теперь давай попробуем выбрать товары, стоимостью от 10000 до 20000.
Условие с country уберем и напишем:
SELECT * FROM products WHERE price >= 10000 AND price
В результате получается такая таблица:
| id | name | count | price | country |
|---|---|---|---|---|
| 3 | Холодильник | 3 | 12000.00 | UA |
Выполним — получили 1 товар в этом ценовом интервале. Рассмотрим на запрос. Как видите в этой конструкции мы снова написали двойное условие по одному полю — price. И с одной строны всё логично и понятно, а с другой стороны эту конструкцию также можно упростить.
SELECT * FROM products WHERE price BETWEEN 10000 AND 20000
Теперь запрос звучит так: ВЫБРАТЬ все столбцы из таблицы products, в которых цена между 10000 и 20000. Звучит более чем понятно.
После запуска мы получим всё тот же один товар.
Вообще AND, OR, IN и BETWEEN — это основные конструкции для построения условий в SQL запросах и используются они в блоке WHERE. Вы можете применять их как по одиночке, так комбинируя в самых разлчных вариантах.
Следующий урок
Урок 3. Порядок AND и OR
Вы узнаете о приоритете AND и OR, а также с ошибками, которые возникают у новичков в SQL-запросах с несколькими условиями.
Полный курс с практикой
- 57 уроков
- 261 задание
- Сертификат
- Поддержка преподавателя
- Доступ к курсу навсегда
- Можно в рассрочку