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 |
+--------+--------------+------------+--------+---------+
codechick

СodeСhick.io - простой и эффективный способ изучения программирования.

2024 ©