在 MySQL 中使用 Join 删除

Raymond Peter 2024年2月15日
  1. 在 MySQL 中使用 DELETE FROM 语句的限制
  2. 在 MySQL 中使用 INNER JOIN 方法
  3. 使用 JOIN 删除 MySQL 的最终结果
在 MySQL 中使用 Join 删除

本教程文章将向你展示如何使用 MySQL JOIN 方法删除多个表中的数据。当你同时删除一个表中与另一个表中的特定记录相关的记录时,这很有用。

在 MySQL 中使用 DELETE FROM 语句的限制

DELETE FROM 语句用于删除表中的行。你可以应用 WHERE 来指定删除时要满足的行和条件。

以下代码包含两个表,第一个记录供应商商品及其位置,第二个记录销售这些商品的店主列表:

Create Table supplier (
    suppId INTEGER PRIMARY KEY,
    category TEXT NOT NULL,
    location TEXT NOT NULL
);
Create Table shops (
    owner TEXT NOT NULL,
    shptype TEXT NOT NULL,
    area TEXT NOT NULL
);

INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');

INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');

表中的所有商店都位于市中心,因此在这种情况下,维护 Uptown 地区的供应商记录是没有意义的。

使用 DELETE 一次只能用于一张表。你可以从 shops 表中获取数据,指定条件,然后删除 supplier 表中与所有条件匹配的所有记录。

在这种情况下,我们将使用 JOINsupplier 表中删除 Uptown 的所有记录。

在 MySQL 中使用 INNER JOIN 方法

使用 INNER JOIN 方法将允许你合并两个或多个表并一次删除多行。

还有其他选择,例如使用子查询,但这是完成工作的更实用的方法。使用上面的示例表,你可以删除两个表中具有 Uptown 值的所有行。

以下代码将查找商店的位置并将供应商保留在 Downtown 区域,同时删除注册为 Uptown 的供应商:

DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;

表的连接基于共享相似数据的字段。类别字段显示了在这种情况下供应商提供了什么以及销售了哪些商店。

合并这两个表将允许你只定义一个删除条件。在这种情况下,供应商的位置将决定要删除的行。

你也可以通过在 DELETE 后添加表名来同时删除两个表。如果你在多个表中有多个记录,这将起作用。

DELETE supplier, shops FROM supplier
...

使用 JOIN 删除 MySQL 的最终结果

结果将使你的表格保持完整,同时删除不符合上述标准的供应商的所有记录。

Create Table supplier (
    suppId INTEGER PRIMARY KEY,
    category TEXT NOT NULL,
    location TEXT NOT NULL
);
Create Table shops (
    owner TEXT NOT NULL,
    shptype TEXT NOT NULL,
    location TEXT NOT NULL
);

INSERT INTO supplier VALUES (0001, 'Veggies', 'Downtown');
INSERT INTO supplier VALUES (0002, 'Fruits', 'Downtown');
INSERT INTO supplier VALUES (0003, 'Dairy', 'Downtown');
INSERT INTO supplier VALUES (0004, 'Veggies', 'Uptown');
INSERT INTO supplier VALUES (0005, 'Fruits', 'Uptown');
INSERT INTO supplier VALUES (0006, 'Dairy', 'Uptown');

INSERT INTO shops VALUES ('Mark', 'Veggies', 'Downtown');
INSERT INTO shops VALUES ('Mark', 'Fruits', 'Downtown');
INSERT INTO shops VALUES ('Susan', 'Dairy', 'Downtown');
-- delete function 
DELETE supplier FROM supplier
INNER JOIN shops ON supplier.category = shops.shptype
WHERE supplier.location != shops.location;

上面将所有供应商按位置匹配到商店,在这种情况下为 Downtown,并从供应商表中删除所有与条件不匹配的行。

从下面的 SELECT 试验中,我们可以看到 supplier 表现在只包含列为 Downtown 的供应商:

SELECT * FROM supplier

结果:

在 mysql 中加入删除

相关文章 - MySQL Join