IN и BETWEEN в SQL
В этой статье вы научитесь использовать операторы IN и BETWEEN с конструкцией WHERE.
В предыдущей статье мы узнали, как объединять несколько условий с помощью операторов AND и OR. Однако иногда этого недостаточно. Например, если вам нужно проверить значения, находящиеся в некотором диапазоне.
В таких случаях на помощь приходят операторы IN и BETWEEN, которые позволяют не объединять отдельные условия, а определить допустимый диапазон или набор значений.
Оператор IN
Оператор IN проверяет, существует ли определенное значение в наборе значений или нет.
Синтаксис
SELECT список_столбцов FROM имя_таблицы
WHERE имя_столбца IN (значени1, значение2,...);
Пример
Представьте, что у нас есть таблица с данными сотрудников employees, в которой содержатся следующие записи:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | +--------+--------------+------------+--------+---------+
Последний столбец dept_id обозначет номер отдела, в котором работает сотрудник.
Допустим, нам нужно получить информацию только о сотрудниках из отделов 1 и 3. То есть нам нужны записи, у которых в столбце dept_id записано значение 1 или 3.
Для этого можно использовать такую SQL-инструкцию:
SELECT * FROM employees
WHERE dept_id IN (1, 3);
После выполнения запроса вы получите результат в таком виде:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+
Аналогично можно использовать оператор NOT IN, прямую противоположность оператора IN.
Допустим, теперь нам нужны данные о сотрудниках из всех отделов, кроме 1 и 3.
Для этого можно использовать такую SQL-инструкцию:
SELECT * FROM employees
WHERE dept_id NOT IN (1, 3);
После выполнения запроса на этот раз вы получите такой результат:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 1 | Ethan Hunt | 2001-05-01 | 5000 | 4 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | +--------+--------------+------------+--------+---------+
Оператор BETWEEN
Иногда требуется выбрать запись, у которой значение в определенной столбце попадает в какой-то диапазон. Такой тип условия часто встречается при работе с числовыми данными.
Для выполнения запроса на основе такого условия можно использовать оператор BETWEEN. Это логический оператор, который позволяет указать диапазон допустимых значений для определенного столбца.
Синтаксис
SELECT список_столбцов FROM имя_таблицы WHERE имя_столбца BETWEEN мин_значение AND макс_значение;
Пример с числами
Используем оператор BETWEEN на датасете из предыдущих статей. Если еще не работали с ним, скачайте и установите в свою СУБД таблицу Austin_Animal_Center_Intakes.csv (Google Disc →).
Допустим, нам нужно узнать, в какие месяцы приют для животных принимал от 900 до 1000 животных.
Это можно сделать с помощью такого SQL-запроса:
SELECT year,
month,
animal_type,
COUNT
FROM austin_animal_center_intakes_by_month
WHERE count BETWEEN 900 AND 2000
Результат:
| year | month | animal_type | COUNT |
|---|---|---|---|
| 2014 | 5 | Cat | 901 |
| 2014 | 5 | Dog | 966 |
| 2015 | 5 | Cat | 1009 |
| 2015 | 5 | Dog | 988 |
| 2016 | 5 | Cat | 921 |
| 2016 | 5 | Dog | 1020 |
| 2017 | 5 | Cat | 914 |
| 2015 | 6 | Cat | 1103 |
| 2015 | 6 | Dog | 1014 |
| 2014 | 7 | Dog | 926 |
| 2014 | 9 | Dog | 917 |
| 2017 | 9 | Dog | 943 |
| 2013 | 10 | Dog | 965 |
Примечание.BETWEENвозвращает все, что находится между двумя значениями, включая указанные значения.
Пример с датами
Для этого примера мы будем использовать таблицу employees.
При сравнении значений даты или времени MySQL, PostgreSQL и SQLite принимают строки в формате 'YYYY-MM-DD' напрямую, поэтому CAST() обычно не обязателен. Тем не менее явное приведение строки к типу DATE через CAST() делает запрос однозначнее и переносимее. Например, строку '2016-12-31' можно явно привести к DATE, как показано в примере ниже:
Давайте выберем всех сотрудников, принятых на работу в период с 1 января 2006 года (т.е. '2006-01-01') по 31 декабря 2016 года (т.е. '2016-12-31'):
SELECT * FROM employees WHERE hire_date
BETWEEN CAST('2006-01-01' AS DATE) AND CAST('2016-12-31' AS DATE);
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | NULL | +--------+--------------+------------+--------+---------+
Пример со строками
Наиболее распространены диапазоны дат и чисел, но вы также можете создавать условия для диапазонов строк.
Давайте выберем всех сотрудников, чье имя начинается с любой буквы от 'O' до 'Z':
SELECT * FROM employees
WHERE emp_name BETWEEN 'O' AND 'Z';
После выполнения запроса вы получите такой результат:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 2 | Tony Montana | 2002-07-15 | 6500 | 1 | | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+