在 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
表中与所有条件匹配的所有记录。
在这种情况下,我们将使用 JOIN
从 supplier
表中删除 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
结果: