MySQL DELETE JOIN
DELETE查询是数据处理语言的一部分,用于从表中删除行。在采访中,如何删除 MySQL 中的join是一个非常流行的问题。在MySQL中使用delete join语句并非易事。在本节中,我们将描述如何在DELETE查询中使用INNER JOIN或LEFT JOIN从多个表中删除记录。
使用INNER JOIN进行删除联接
内部联接查询可以与删除查询一起使用,以删除一个表中满足指定条件的表中的行和另一表中满足指定条件的匹配行。
语法
以下是可使用内部联接删除多个表中的行的语法。
DELETE target table
FROM table1
INNER JOIN table2
ON table1.joining_column= table2.joining_column
WHERE condition
在这里,目标是一个表名,我们要通过匹配指定条件从中删除行。假设您要从表
T1 和
T2 中删除行,其中
student_id = 2 ,则可以将其写为以下语句:
DELETE T1, T2
FROM T1
INNER JOIN T2
ON T1.student_id=T2.student.id
WHERE T1.student_id=2;
在以上语法中,目标表(T1和T2)写在DELETE和FROM关键字之间。如果我们从那里省略任何表名,那么 delete语句只会从单个表中删除行。用
ON 关键字编写的表达式是与要删除的表中的行匹配的条件。
示例
假设我们有两个表
students和
contacts,其中包含以下数据:
表: students
表: contacts
执行以下查询以了解使用内部联接删除。该语句删除两个表中具有相同ID的行。
DELETE students, contacts FROM students
INNER JOIN contacts ON students.student_id=contacts.college_id
WHERE students.student_id = 4;
成功执行后,它将给出以下消息:
现在,运行以下查询以验证已成功删除行。
mysql> SELECT * FROM students;
mysql> SELECT * FROM contacts;
您可以看到
student_id = 4 所在的行已删除。
使用左联接删除JOIN
我们已经通过 SELECT语句学习了LEFT JOIN子句,该子句从左(第一个)返回所有行表和另一个表中匹配或不匹配的行。同样,我们也可以使用带有DELETE关键字的LEFT JOIN子句从左(第一个)表中删除行,而右(第二个)表中没有匹配的行。
以下查询对此进行了解释更清楚地说明DELETE语句使用LEFT JOIN从
Table1 中删除在
Table2 中没有匹配行的行:
DELETE Table1 FROM Table1
LEFT JOIN Table2 ON Table1.key = Table2.key
WHERE Table2.key IS null;
在上面的查询中,请注意,我们将仅将Table1与DELETE关键字一起使用,而不是像INNER JOIN语句一样使用。
示例
让我们创建一个包含以下数据的数据库中的"
contacts"表和"
customers":
表: contacts
表: customers
执行以下语句,删除没有
手机号码的客户:
DELETE customers FROM customers
LEFT JOIN contacts ON customers.customer_id = contacts.contact_id
WHERE cellphone IS null;
成功执行后,它将给出以下消息:
现在,运行以下查询以验证已成功删除行。
mysql> SELECT * FROM customers;
您可以看到客户没有手机号的行已删除。