В прошлом уроке мы научились выбирать совершеннолетних пользователей с помощью простого 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 <= 20000
В результате получается такая таблица:
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. Вы можете применять их как по одиночке, так комбинируя в самых разлчных вариантах.