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 关键字之间。如果我们从那里省略任何表名,那么删除语句只会从单个表中删除行。用ON关键字编写的表达式是与您要删除的表中的行匹配的条件。
例子
假设我们有两个包含以下数据的表students和contacts :
Table: students
Table: contacts
执行以下查询以了解Delete Join with Inner Join。此语句删除两个表中具有相同 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的行被删除了。
.
使用左连接删除连接
我们已经学习了带有SELECT 语句的 LEFT JOIN 子句,该语句返回左(第一个)表中的所有行以及另一个表中匹配或不匹配的行。类似地,我们也可以使用带有 DELETE 关键字的 LEFT JOIN 子句从左(第一个)表中删除与右(第二个)表中没有匹配行的行。
下面的查询解释得更清楚,其中DELETE语句使用LEFT JOIN从删除行的表1是不具有匹配的行表2:
DELETE Table1 FROM Table1
LEFT JOIN Table2 ON Table1.key = Table2.key
WHERE Table2.key IS NULL;
在上面的查询中,请注意我们只会使用带有 DELETE 关键字的 Table1,而不是像 INNER JOIN 语句中那样同时使用。
例子
让我们在包含以下数据的数据库中创建一个表“ contacts ”和“ customers ”:
Table: contacts
Table: customers
执行以下语句,删除没有手机号码的客户:
DELETE customers FROM customers
LEFT JOIN contacts ON customers.customer_id = contacts.contact_id
WHERE cellphone IS NULL;
执行成功后,会提示如下信息:
现在,运行以下查询以验证已成功删除的行。
mysql> SELECT * FROM customers;
可以看到客户没有手机号的行被删除了。