本教程将讨论使用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运算符,使查询更可读,更容易管理。