Как в where написать несколько условий sql
Перейти к содержимому

Как в where написать несколько условий sql

  • автор:

Сложные условия фильтрации — Основы 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 Google 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 Facebook 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 Facebook 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 для женщин:

Новая таблица users

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 запроса получиться такая таблица:

Результат выполнения 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'
Результат выполнения SQL-запроса

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'

И посмотрим на результат:

Новая таблица users

>

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, которое содержит данные о стране производителе:

Таблица products

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

И посмотрим результат:

Результат выполнения SQL-запроса

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 

В результате получается такая таблица:

Таблица products

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 задание
  • Сертификат
  • Поддержка преподавателя
  • Доступ к курсу навсегда
  • Можно в рассрочку

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *