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

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

  • автор:

Указание нескольких условий поиска для одного столбца (визуальные инструменты для баз данных)

Иногда может понадобиться сочетание нескольких условий поиска для одного столбца. Например, можно сделать следующее:

  • Найти несколько разных имен сотрудников в таблице employee , находящихся в разных группах по уровню зарплаты. Такой тип поиска требует использования условия OR (или).
  • Найти книгу, название которой начинается со слова «The» и содержит слово «Cook». Такой тип поиска требует использования условия AND (и).

Сведения, приведенные в этом подразделе, применимы к условиям поиска как в предложении WHERE, так и в предложении HAVING запроса. В примерах в основном используется предложение WHERE, но рассматриваемые принципы применимы к обоим типам задания условий поиска.

Для поиска альтернативных значений в одном столбце данных используется условие OR. Для поиска значений, удовлетворяющих одновременно нескольким условиям, используется условие AND.

Указание условия OR

Использование условия OR позволяет указать несколько альтернативных значений для поиска в столбце. Этот параметр расширяет пространство поиска и может вернуть больше записей, чем при поиске одного значения.

Часто можно использовать оператор IN вместо того, чтобы искать несколько значений в одном столбце.

Указание условия OR
  1. На панели критериевдобавьте столбец для поиска.
  2. Укажите первое условие в столбце Фильтр только что добавленного столбца данных.
  3. Укажите второе условие в столбце Или. этого столбца данных.

Конструктор запросов и представлений создает предложение WHERE, содержащее условие OR, подобное следующему:

SELECT fname, lname FROM employees WHERE (salary < 30000) OR (salary >100000) 

Указание условия AND

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

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

Указание условия AND
  1. На панели критериев добавьте столбец для поиска.
  2. Укажите первое условие в столбце Фильтр только что добавленного столбца данных.
  3. Добавьте тот же столбец на панель критериев еще раз, поместив его в пустую строку сетки.
  4. В столбце Фильтр второй строки укажите второе условие.

Конструктор запросов создает предложение WHERE, которое содержит условие AND, подобное следующему:

SELECT title_id, title FROM titles WHERE (title LIKE '%Cook%') AND (title LIKE '%Recipe%') 

Указание нескольких условий поиска для нескольких столбцов (визуальные инструменты для баз данных)

Можно расширить или сузить область видимости, включив несколько столбцов данных в качестве части условия поиска. Например, можно сделать следующее:

  • Выполнить поиск сотрудников, которые либо проработали в компании более пяти лет, либо занимают определенные должности.
  • Выполнить поиск книги, которая опубликована указанным издательством и имеет отношение к кулинарии.

Чтобы создать запрос, осуществляющий поиск значений в каком-либо из двух (или более) столбцов, необходимо указать условие OR. Чтобы создать запрос, который должен отвечать условиям в двух (или более) столбцах, необходимо указать условие AND.

Указание условия OR

Чтобы создать несколько условий, связанных оператором OR, необходимо поместить каждое отдельное условие в отдельный столбец на панели критериев.

Указание условия OR для двух различных столбцов
  1. В панели критериевдобавьте столбцы для поиска.
  2. В столбце Фильтр для первого столбца, подлежащего поиску, укажите первое условие.
  3. В столбце Или. для второго столбца данных, подлежащего поиску, укажите второе условие, оставив столбец Фильтр пустым. Конструктор запросов и представлений создает предложение WHERE, содержащее условие OR, подобное следующему:
SELECT job_lvl, hire_date FROM employee WHERE (job_lvl >= 200) OR (hire_date < '01/01/1998') 

Указание условия AND

Чтобы выполнить поиск разных столбцов данных с использованием условий, связанных оператором AND, необходимо поместить все условия в столбец Фильтр в сетке.

Указание условия AND для двух различных столбцов
  1. В панели критериевдобавьте столбцы для поиска.
  2. В столбце Фильтр для первого столбца данных, подлежащего поиску, укажите первое условие.
  3. В столбце Фильтр для второго столбца данных укажите второе условие. Конструктор запросов и представлений создает предложение WHERE, которое содержит предложение AND, подобное следующему:
SELECT pub_id, title FROM titles WHERE (pub_id = '0877') AND (title LIKE '%Cook%') 

Запрос на несколько условий

Совсем недавно на этом же сайте мне показали как сделать запрос на выбор данных из 4-х таблиц, взяв это за пример я сделал другой запрос:

 SELECT L.*, (SELECT group_concat(distinct client.client_full_name) FROM client JOIN cases ON (client.client_id=cases.client_id) JOIN lawyer ON (lawyer.lawyer_id=cases.lawyer_id) GROUP BY lawyer.lawyer_full_name) clientname, (SELECT count(cases.lawyer_id) FROM cases JOIN lawyer ON (lawyer.lawyer_id=cases.lawyer_id) WHERE cases.case_archive=1 GROUP BY lawyer.lawyer_id) archive FROM lawyer L 

Выдает мне ошибку, я не понимаю почему и как ее исправить. Задача запроса получить строки на каждого адвоката (таблица lawyer) все (*) его данные + список его клиентов сейчас (достать из таблицы cases) и сума его архивных дел (тоже из cases, только тут cases.case_archive=1). Предоставляю так же онлайн модель базы для удобной проверки запросов: http://sqlfiddle.com/#!9/9130c/ И последнее: прошу описать каждый шаг запроса, я очень путаюсь в запросах и вот засоряю форум почти одинаковыми темами.

Отслеживать
задан 13 дек 2015 в 10:36
1,810 1 1 золотой знак 19 19 серебряных знаков 37 37 бронзовых знаков
в group_concat separator не нужен?
13 дек 2015 в 10:43

Выглядит жутковато 🙂 запрос очень странно заканчивается на FROM lawyer L, client CL без условий по которым эти таблицы клеятся WHERE . В итоге перемножаются все записи адвокатов на всех клиентов. сильно сомневаюсь что так задумано

13 дек 2015 в 10:44
И запятая после ) archive явно не в кассу
13 дек 2015 в 10:47

И что такое "сумма архивных дел". сейчас вы делаете sum по id адвокатов в делах. сомневаюсь, что сумма ID кому то интересна

13 дек 2015 в 10:54

@Mike Да, я ту запятую на пробнике заметил после публикации поста и удалил. Условия склеивания вы имеете ввиду USING или GROUP BY?

13 дек 2015 в 10:54

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Вообще подзапросы в списке выборки - это крайний случай. Да, он удобен. Но обычно он утяжеляет запрос. Его надо использовать тогда, когда обычных средств не хаватает. Например, если основной запрос, произведя склейку нескольких таблиц создает такое кол-во записей, что по ним уже нельзя получить сумму какого то поля, т.к. одно и то же значение этого поля встречается несколько раз.

Примерный план составления такого запроса:

  1. Определяем участвующие таблицы. Во главе у нас lawyer т.к. именно из нее надо получить все записи, вне зависимости от наличия дел и клиентов. Для получения количества дел надо добавить таблицу cases и для получения клиентов таблицу client , причем она клеится через дела.
  2. Составляем базовый запрос:

SELECT * FROM lawyer L LEFT JOIN cases S ON (L.lawyer_id=S.lawyer_id) LEFT JOIN client C ON (S.client_id=C.client_id) 
SELECT L.*, group_concat(distinct C.client_full_name) clients, sum(IF(S.case_archive=1,1,0)) case_arx_sum, count(S.case_id) case_all_sum FROM lawyer L LEFT JOIN cases S ON (L.lawyer_id=S.lawyer_id) LEFT JOIN client C ON (S.client_id=C.client_id) GROUP BY L.lawyer_id 

Предположим, нам надо было бы в этом запросе показать заодно суммарное наказание клиентов данного адвоката. Если мы приклеим таблицу punishment в этот же запрос то некоторые дела буду попадаться несколько раз, т.к. записи просто размножатся, в случаях когда есть несколько наказаний у клиента. Если есть 2 дела и 2 наказания - то мы получим 4 записи, со всеми вариантами дело/наказание. В такой ситуации посчитать кол-во чего либо будет крайне сложно. Поэтому тут нам поможет как раз подзапрос в списке выборки.

Подзапрос должен возвращать одно значение для каждого адвоката. Пишем его сначала как отдельный запрос, который получит нужное значение для ID одного конкретного адвоката. нам нужен только ID адвоката, поэтому таблицу самих адвокатов использовать не обязательно, до нужной нам ID мы можем добраться через таблицу дел ( cases ). Получаем такой запрос для адвоката >

SELECT sum(P.punishment_value) FROM punishment P, cases C1 WHERE C1.client_id=P.client_id and C1.lawyer_id=1 

осталось только вставить его в основной запрос, использовав в качестве id адвоката соответствующий id из основного запроса ( C1.lawyer_id=L.lawyer_id ):

SELECT L.*, group_concat(distinct C.client_full_name) clients, sum(IF(S.case_archive=1,1,0)) case_arx_sum, count(S.case_id) case_all_sum, (SELECT sum(P.punishment_value) FROM punishment P, cases C1 WHERE C1.client_id=P.client_id and C1.lawyer_id=L.lawyer_id) punish_sum FROM lawyer L LEFT JOIN cases S ON (L.lawyer_id=S.lawyer_id) LEFT JOIN client C ON (S.client_id=C.client_id) GROUP BY L.lawyer_id 

Урок 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 не будет опубликован. Обязательные поля помечены *