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
.
При использовании оператора BETWEEN
со значениями даты или времени нужно использовать функцию CAST()
, чтобы явно преобразовать значения к нужному типу данных. Например, если вы используете строку типа '2016-12-31'
в сравнении с типом данных DATE
, приведите строку к 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 | +--------+--------------+------------+--------+---------+