English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Neste tutorial, você aprenderá como usar os operadores IN e BETWEEN e usá-los juntamente com a cláusula WHERE.
No capítulo anterior, aprendemos como usar os operadores AND e OR para combinar várias condições. Mas, às vezes, isso não é suficiente, por exemplo, se você precisar verificar valores dentro de um intervalo ou grupo de valores.
Aqui surge o operador IN e BETWEEN, que permite definir um intervalo exclusivo ou um grupo de valores, em vez de combinações de condições separadas.
O operador IN é um operador lógico, usado para verificar se um valor específico existe em um grupo de valores. Sua sintaxe básica pode ser fornecida da seguinte maneira:
SELECT column_list FROM table_name WHERE column_name IN (value)1, value1,...);
在这里,column_list是要获取其值的数据库表的列/字段的名称,例如name,age,country等。好吧,让我们看看一些实例。
考虑我们在数据库中有一个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 | +--------+--------------+------------+--------+---------+
以下SQL语句将仅返回dept_id为1或3的那些雇员。
Exemplo * FROM employees WHERE dept_id IN (1, 3);
Após executar a consulta, você obterá o seguinte conjunto de resultados:
+--------+--------------+------------+--------+---------+ | 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运算符完全相反。以下SQL语句将返回除dept_id不是1或3的那些雇员以外的所有雇员。
Exemplo * 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运算符。它是一个逻辑运算符,可让您指定要测试的范围,如下所示:
SELECT column1_name, column2_name, columnN_name FROM table_name WHERE column_name BETWEEN min_value AND max_value;
让我们根据雇员(employees)表上的范围条件构建和执行查询。
以下SQL语句将仅返回employees表中薪水在7000到9000之间的那些雇员。
Exemplo * FROM employees WHERE salary BETWEEN 7000 AND 9000;
Após a execução, você receberá a seguinte saída:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 3 | Sarah Connor | 2005-10-18 | 8000 | 5 | | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | +--------+--------------+------------+--------+---------+
将BETWEEN运算符与日期或时间值一起使用时,请使用CAST()函数将这些值显式转换为所需的数据类型,以获得最佳结果。例如,如果在与DATE的比较中使用诸如“ 2016-12-31”之类的字符串,则将其转换为DATE,如下所示:
以下SQL语句选择2006年1月1日(即“ 2006-01-01”)至2016年12月31日(即“ 2016-12-31)之间雇佣的所有雇员:
Exemplo * FROM employees WHERE hire_date BETWEEN CAST('2006-01-01AS DATE) AND CAST('2016-12-31AS DATE);
Após executar a consulta, você obterá o seguinte conjunto de resultados:
+--------+--------------+------------+--------+---------+ | emp_id | emp_name | hire_date | salary | dept_id | +--------+--------------+------------+--------+---------+ | 4 | Rick Deckard | 2007-01-03 | 7200 | 3 | | 5 | Martin Blank | 2008-06-24 | 5600 | +--------+--------------+------------+--------+---------+
Definir Intervalo de String
Exemplo * FROM employees WHERE emp_name BETWEEN 'O' AND 'Z';
Após a execução, você receberá a seguinte saída:
+--------+--------------+------------+--------+---------+ | 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 | +--------+--------------+------------+--------+---------+