使用MySQL的IN查询来检查一个特定的值是否在一组值内

157 阅读4分钟

本教程将讨论使用MySQL的IN查询来检查一个特定的值是否在一组值内,这在替换一组OR运算符时很有用。

基本语法

MySQL的IN运算符很简单。它的工作原理是检查一个集合是否有指定值的匹配。

查询的一般语法是

SELECT col_names FROM table_name WHERE expression IN (value_sets);

在上面的语法中,我们指定要执行的函数。它可以是一个SELECT、INSERT、DELETE、UPDATE等。

接下来,我们指定要执行上述指定动作的表的名称。

下一个部分是WHERE子句,在这里我们指定要评估的表达式或值。这就是我们在IN子句右边的值集合中测试的值。

在子句的右边,我们指定了要从中搜索匹配表达式的值。

如果IN子句在指定的值集上找到匹配,它将返回1,表示真,返回0,表示假。

MySQL IN子句示例

下面是说明IN子句的例子。

例1

IN操作符的一个简单用例是在一个集合中检查一个单一的值。例如,我们可以检查字符**'A'**是否在一个字符集中。

SELECT 'A' IN ('A', 'B', 'C', 'D');

在上面的例子中,我们检查字符 'A'是否在一个ABCD字符集中

上面的查询如果为真,应该返回1,如下面的输出所示。

+-----------------------------+
| 'A' IN ('A', 'B', 'C', 'D') |
+-----------------------------+
|                           1 |
+-----------------------------+
1 row in set (0.00 sec)

例2

如果数值不在一个数值集合中,也有类似的情况。例如,下面的查询将返回0或false。

SELECT 'Z' IN ('A', 'B', 'C', 'D');

由于Z不在集合中,该语句返回错误,如图所示。

+-----------------------------+
| 'Z' IN ('A', 'B', 'C', 'D') |
+-----------------------------+
|                           0 |
+-----------------------------+

例3

让我们用一个更实际的例子来说明IN查询。让我们从样本sakila数据库中抽取一个actor表。

SELECT * FROM actor LIMIT 10;
+----------+------------+--------------+---------------------+
| actor_id | first_name | last_name    | last_update         |
+----------+------------+--------------+---------------------+
|        1 | PENELOPE   | GUINESS      | 2006-02-15 04:34:33 |
|        2 | NICK       | WAHLBERG     | 2006-02-15 04:34:33 |
|        3 | ED         | CHASE        | 2006-02-15 04:34:33 |
|        4 | JENNIFER   | DAVIS        | 2006-02-15 04:34:33 |
|        5 | JOHNNY     | LOLLOBRIGIDA | 2006-02-15 04:34:33 |
|        6 | BETTE      | NICHOLSON    | 2006-02-15 04:34:33 |
|        7 | GRACE      | MOSTEL       | 2006-02-15 04:34:33 |
|        8 | MATTHEW    | JOHANSSON    | 2006-02-15 04:34:33 |
|        9 | JOE        | SWANK        | 2006-02-15 04:34:33 |
|       10 | CHRISTIAN  | GABLE        | 2006-02-15 04:34:33 |
+----------+------------+--------------+---------------------+

在上面的示例表中,我们有actor_id、first_name、last_name和last_update这几个列。

我们可以使用IN查询,只获得名字是一组值的列。

考虑一下下面的查询。

SELECT * FROM actor WHERE first_name IN ('ED', 'BETTE', 'GRACE', 'JOHN', 'NICK');

上面的查询应该只返回指定演员的列。下面是一个示例结果。

+----------+------------+-----------+---------------------+
| actor_id | first_name | last_name | last_update         |
+----------+------------+-----------+---------------------+
|        2 | NICK       | WAHLBERG  | 2006-02-15 04:34:33 |
|        3 | ED         | CHASE     | 2006-02-15 04:34:33 |
|        6 | BETTE      | NICHOLSON | 2006-02-15 04:34:33 |
|        7 | GRACE      | MOSTEL    | 2006-02-15 04:34:33 |
|       44 | NICK       | STALLONE  | 2006-02-15 04:34:33 |
|      136 | ED         | MANSFIELD | 2006-02-15 04:34:33 |
|      166 | NICK       | DEGENERES | 2006-02-15 04:34:33 |
|      179 | ED         | GUINESS   | 2006-02-15 04:34:33 |
|      192 | JOHN       | SUVARI    | 2006-02-15 04:34:33 |
+----------+------------+-----------+---------------------+

例4

我们也可以使用IN操作符来检查数值。让我们改变一下,使用sakila数据库中的电影表。

假设我们只想得到租期为7的电影。

SELECT film_id, title, rental_duration FROM film WHERE rental_duration IN (7) LIMIT 5;

上面的查询例子应该返回租期等于7的列。

+---------+------------------+-----------------+
| film_id | title            | rental_duration |
+---------+------------------+-----------------+
|       3 | ADAPTATION HOLES |               7 |
|      27 | ANONYMOUS HUMAN  |               7 |
|      36 | ARGONAUTS TOWN   |               7 |
|      70 | BIKINI BORROWERS |               7 |
|      78 | BLACKOUT PRIVATE |               7 |
+---------+------------------+-----------------+
5 rows in set (0.00 sec)

例5 否定法

MySQL还为IN操作符提供了一个否定。要使用它,请在IN之前添加NOT关键字,如。

SELECT * FROM table_name WHERE expression NOT IN (values);

例如,让我们得到标题中不包括字母S的电影。

SELECT film_id, title, rental_duration FROM film WHERE 'S' NOT IN (title) LIMIT 5;
下面是一个输出的例子。
+---------+------------------+-----------------+
| film_id | title            | rental_duration |
+---------+------------------+-----------------+
|       1 | ACADEMY DINOSAUR |               6 |
|       2 | ACE GOLDFINGER   |               3 |
|       3 | ADAPTATION HOLES |               7 |
|       4 | AFFAIR PREJUDICE |               5 |
|       5 | AFRICAN EGG      |               6 |
+---------+------------------+-----------------+
5 rows in set (0.00 sec)

在结束时

在这篇文章中,我们集中讨论了使用MySQL IN操作符来确定一个值是否在一组值中。这可以帮助取代连锁的OR运算符,使查询更可读,更容易管理。