MySQL 查询不在另一张表的数据
在实际开发中,有时候我们需要查询某张表中存在的数据,但是在另一张表中不存在的数据。这种场景通常需要使用NOT IN
或者LEFT JOIN
的方式来实现,本文将详细介绍这两种方法的使用。
使用 NOT IN
NOT IN
是一个常用的关键字,它可以用来查询不在指定列表中的数据。下面以一个实际的示例来演示如何使用NOT IN
来查询不在另一张表中的数据。
假设我们有两张表,一张是users
表,另一张是orders
表。现在我们需要查询出所有在users
表中存在,但在orders
表中不存在的用户。我们可以使用以下SQL语句来实现:
SELECT * FROM users
WHERE user_id NOT IN (SELECT user_id FROM orders);
上面的SQL语句中,首先从orders
表中查询出所有的user_id
,然后将这个结果用作users
表的查询条件,即查询在users
表中存在,但在orders
表中不存在的用户。
使用 LEFT JOIN
除了NOT IN
外,我们还可以使用LEFT JOIN
来实现同样的功能。一般来说,使用LEFT JOIN
的性能会比NOT IN
更好,特别是当数据量较大时。下面是同样的示例,使用LEFT JOIN
来查询不在另一张表中的数据:
SELECT u.* FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.user_id IS NULL;
上面的SQL语句中,我们首先使用LEFT JOIN
连接users
表和orders
表,关联条件为user_id
相等。然后通过WHERE o.user_id IS NULL
来筛选出orders
表中不存在的用户。
示例代码及运行结果
创建测试数据
首先我们需要创建users
表和orders
表,并向其中插入一些数据,用于后续查询:
CREATE TABLE users (
user_id INT PRIMARY KEY,
username VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
user_id INT,
order_date DATE
);
INSERT INTO users VALUES (1, 'Alice');
INSERT INTO users VALUES (2, 'Bob');
INSERT INTO users VALUES (3, 'Carol');
INSERT INTO orders VALUES (1, 1, '2022-01-01');
INSERT INTO orders VALUES (2, 3, '2022-01-02');
使用 NOT IN 查询
接下来,我们使用NOT IN
来查询不在orders
表中的用户:
SELECT * FROM users
WHERE user_id NOT IN (SELECT user_id FROM orders);
运行结果如下:
user_id | username
--------|---------
2 | Bob
使用 LEFT JOIN 查询
接着,我们使用LEFT JOIN
来查询不在orders
表中的用户:
SELECT u.* FROM users u
LEFT JOIN orders o ON u.user_id = o.user_id
WHERE o.user_id IS NULL;
运行结果如下:
user_id | username
--------|---------
2 | Bob
总结
在实际开发中,我们经常会遇到需要查询不在另一张表中的数据的情况。在这种情况下,我们可以使用NOT IN
或者LEFT JOIN
来实现。一般来说,性能较好的方式是使用LEFT JOIN
。