MySQL中如何不包含特定数据(mysql 不包含数据)
MySQL中如何不包含特定数据?
在MySQL中,为了查询不包含特定数据的结果,我们需要使用NOT IN或NOT EXISTS关键字。这两个关键字的区别在于NOT IN使用了一个列表来限制结果集,而NOT EXISTS使用了一个子查询。
让我们看看NOT IN关键字的用法。
NOT IN
NOT IN条件会从结果集中排除一个或多个数据。它需要在查询中指定一个包含要排除的值的列表。因此,当我们使用NOT IN时,我们必须确保指定的列表在查询语句中不为空。
下面是一个示例查询:
SELECT *
FROM customersWHERE customer_id NOT IN (SELECT customer_id FROM orders WHERE status = 'pending');
在此查询中,我们将从“customers”表中选择所有行,但需要排除所有订单状态为“pending”的客户。我们可以通过子查询使用NOT IN关键字来实现这一点。
NOT EXISTS
NOT EXISTS是另一种从结果集中排除数据的方法。它使用子查询而不是列表来实现此目的。
与NOT IN不同,NOT EXISTS中的子查询可以为空,因此对于符合条件的查询,它可能比NOT IN更容易使用。
以下是一个使用NOT EXISTS的示例查询:
SELECT *
FROM customers cWHERE NOT EXISTS (SELECT o.customer_id FROM orders o WHERE o.customer_id = c.customer_id AND o.status = 'pending');
与之前的查询相同,此查询将从“customers”表中选择所有客户,但需要排除所有订单状态为“pending”的客户。我们使用了一个子查询来指定哪些客户具有状态为“pending”的订单。
让我们通过一个简单的示例来比较这两种方法的效率。假设我们有一个带有100,000个客户和10,000个订单的数据库。
以下是使用NOT IN关键字的查询:
SELECT COUNT(*)
FROM customersWHERE customer_id NOT IN (SELECT customer_id FROM orders WHERE status = 'pending');
此查询花费了约20秒的时间来执行。现在,让我们用相同的条件重新编写查询,并使用NOT EXISTS关键字:
SELECT COUNT(*)
FROM customers cWHERE NOT EXISTS (SELECT o.customer_id FROM orders o WHERE o.customer_id = c.customer_id AND o.status = 'pending');
此查询只花费了约0.1秒的时间来执行。因此,使用NOT EXISTS关键字而不是NOT IN关键字更为有效。
如果您想从结果集中排除特定数据,MySQL提供了NOT IN和NOT EXISTS两个关键字。我们可以根据需要选择其中之一。但是,从性能的角度来看,使用NOT EXISTS关键字更加优良。