SQL NOT IN 命令详解
什么是 SQL NOT IN 命令?
SQL NOT IN 命令用于从一个结果集中排除另一个结果集中的值。该命令返回不在指定结果集中的所有行。
常见的 SQL 命令有 SELECT、INSERT、UPDATE 和 DELETE,而 NOT IN 则是其中的一个逻辑运算符,用于筛选数据。通常,我们使用 NOT IN 命令来筛选不符合某个条件的数据。
该命令的基本语法如下:
SELECT column_name(s)
FROM table_name
WHERE column_name NOT IN (value1, value2, ...);
NOT IN 与 IN 的区别
在详细讨论 SQL NOT IN 命令之前,我们先来了解一下它与 IN 命令的异同。
1. IN 命令
IN 命令用于从一个结果集中选取与指定值匹配的数据行。例如,我们要找到所有城市为“北京”或“上海”的客户:
SELECT *
FROM customers
WHERE city IN ('北京', '上海');
这个查询将返回城市为“北京”或“上海”的客户。
2. NOT IN 命令
与 IN 命令相反,NOT IN 命令返回不在指定结果集中的所有行。继续以上面的示例为例,我们要找到城市不是“北京”或“上海”的客户:
SELECT *
FROM customers
WHERE city NOT IN ('北京', '上海');
这个查询将返回城市不是“北京”或“上海”的客户。
可以看到,NOT IN 命令通过在 IN 的括号前面加上 NOT 关键字来实现对结果集的排除。
3. 区别总结
- IN 命令返回符合指定值的数据行。
- NOT IN 命令返回不符合指定值的数据行。
使用 SQL NOT IN 命令的示例
下面我们通过几个实际的示例来说明如何使用 SQL NOT IN 命令。
1. 筛选不在指定列表中的行
假设我们有一个 students 表,其中有以下数据:
+------+--------+
| name | score |
+------+--------+
| Amy | 95 |
| Bob | 80 |
| Jack | 75 |
| Tom | 85 |
+------+--------+
我们想要找到分数不在 80 和 85 之间的学生。这时,我们可以使用以下 SQL 查询语句:
SELECT *
FROM students
WHERE score NOT IN (80, 85);
运行以上查询,将返回以下结果:
+------+--------+
| name | score |
+------+--------+
| Amy | 95 |
| Jack | 75 |
+------+--------+
从结果中可以看出,只有分数不在 80 和 85 之间的学生被返回。
2. 使用子查询
除了直接指定值列表外,我们还可以使用子查询来动态生成需要排除的结果集。
假设我们有一个 orders 表,其中有以下数据:
+---------+------------+
| order_id | customer |
+---------+------------+
| 1 | Amy |
| 2 | Bob |
| 3 | Jack |
| 4 | Tom |
+---------+------------+
同时,我们还有一个 customers 表,其中有以下数据:
+------------+-------------+
| customer | blacklist |
+------------+-------------+
| Amy | 1 |
| Bob | 0 |
| Jack | 1 |
| Tom | 1 |
+------------+-------------+
我们想要找到在 blacklist 表中被标记为 1 的客户的订单。这时,我们可以使用以下 SQL 查询语句:
SELECT *
FROM orders
WHERE customer NOT IN (SELECT customer FROM blacklist WHERE blacklist = 1);
运行以上查询,将返回以下结果:
+---------+------------+
| order_id | customer |
+---------+------------+
| 2 | Bob |
+---------+------------+
从结果中可以看出,只有在 blacklist 表中未被标记为 1 的客户的订单被返回。
总结
本文详细介绍了 SQL NOT IN 命令的使用方法。NOT IN 命令用于从一个结果集中排除另一个结果集中的值,它返回不在指定结果集中的所有行。
与 IN 命令相比,NOT IN 命令正好相反,用于筛选不符合某个条件的数据行。通过在 IN 的括号前面加上 NOT 关键字,我们可以实现对结果集的排除。
在使用 NOT IN 命令时,可以直接指定值列表,也可以使用子查询动态生成结果集。根据具体的需求,我们可以灵活地应用 NOT IN 命令来筛选数据。