SQL для начинающих

Урок 2. Составные условия

В прошлом уроке мы научились выбирать совершеннолетних пользователей с помощью простого SQL запроса.

SELECT last_name, first_name, birthday FROM users WHERE age >= 18

Теперь попробуем немного уточнить запрос. Например, выберем всех совершенолетних мужчин. В таблицу я добавил дополнительное строковое поле sex, которое хранит m для мужчин и w для женщин:

Новая таблица users
idfirst_namelast_namebirthdayagesex
1ДмитрийИванов1996-12-1120m
2ОлегЛебедев2000-02-0717m
3ТимурШевченко1998-04-2719m
4СветланаИванова1993-08-0623w
5ОлегКовалев2002-02-0815m
6АлексейИванов1993-08-0523m
7АленаПроцук1997-02-2818w

Давайте добавим вывод столбца sex и оставим только мужчин. Для этого в блоке условий, который начинается со слова WHERE нужно добавить AND sex = 'm':

SELECT last_name, first_name, birthday, sex
FROM users 
WHERE age >= 18 AND sex = 'm'

После выполнения SQL запроса получиться такая таблица:

Результат выполнения SQL-запроса
idlast_namefirst_namebirthdaysex
1ИвановДмитрий1996-12-11m
3ШевченкоТимур1998-04-27m
6ИвановАлексей1993-08-05m

Посмотрим на 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-запроса
idlast_namefirst_namebirthday
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
idlast_namefirst_namebirthdaysexage
1ИвановДмитрий1996-12-11m20
2ЛебедевОлег2000-02-07m17
3ШевченкоТимур1998-04-27m19
4ИвановаСветлана1993-08-06w23
5КовалевОлег2002-02-08m15
6ИвановАлексей1993-08-05m23
7ПроцукАлена1997-02-28w18

Получили всех мужчин, а также женщин, которым исполнилось 18 лет. В частности в SQL-таблице две женщины старше 18 лет и все мужчины, даже те, которым меньше 18. Всё это соответствует условию ИЛИ. ИЛИ возраст от 18 лет, ИЛИ мужской пол.

Теперь переключимся на таблицу products. В ней появилось поле country, которое содержит данные о стране производителе:

Таблица products
idnamecountpricecountry
1Телевизор343200.00RU
2Микроволновая печь43200.00RU
3Холодильник312000.00UA
4Роутер11340.00US
5Компьютер026150.00US
6Утюг63200.00BL
7Пылесос114500.00UA

Давайте выберем товары, произведененные в России, Белоруссии и на Украине. Напишем SQL-запрос:

SELECT * FROM products 
WHERE country = "RU" OR country = "UA" OR country = "BL"

После выполнения запроса мы получим следующую таблицу:

Результат выполнения запроса
idnamecountpricecountry
1Телевизор343200.00RU
2Микроволновая печь43200.00RU
3Холодильник312000.00UA
6Утюг63200.00BL
7Пылесос114500.00UA

Разберем запрос: в блоке 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-запроса
idnamecountpricecountry
2Микроволновая печь43200.00RU
6Утюг63200.00BL
7Пылесос114500.00UA

Получили новую таблицу с тремя записями, которые удовлетовряют новому условию. И в этом условии мы совместили AND и IN. То есть в SQL-запросах можно совмещать логические операции AND и OR с оператором IN. Что делает их очень гибкими.

Теперь давай попробуем выбрать товары, стоимостью от 10000 до 20000.

Условие с country уберем и напишем:

SELECT * FROM products
WHERE price >= 10000 AND price <= 20000

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

Таблица products
idnamecountpricecountry
3Холодильник312000.00UA

Выполним — получили 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-запросах с несколькими условиями.

Посмотреть

Закрепляй SQL-запросы на практике в специальном тренажере

Регистрация

или
Письмо со ссылкой для доступа отправлено.
Проверьте почту.

Письмо не пришло? Посмотрите в спаме.
Регистрируясь, вы соглашаетесь с условиями предоставления услуг (пользовательское соглашение).