MySQL Delete Join删除连接

DELETE 查询是用于从表中删除行的数据操作语言的子部分。MySQL中如何删除join是面试中非常热门的问题。在 MySQL 中使用 delete join 语句不是一个简单的过程。在本节中,我们将描述如何在 DELETE 查询中使用 INNER JOIN 或 LEFT JOIN 从多个表中删除记录。

一、MySQL Delete Join 语法

Inner Join 查询可与 Delete 查询一起使用,以从一个表中删除行,并从另一个表中删除满足指定条件的匹配行。

DELETE target table   
FROM    table1    
INNER JOIN table2  
ON table1.joining_column= table2.joining_column  
WHERE   condition

在这里,target是一个表名,我们希望通过匹配指定的条件从该表中删除行。假设要从表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;  

在上述语法中,target表(T1 和 T2)写在 DELETE 和 FROM 关键字之间。如果我们从那里省略任何表名,那么删除语句仅从单个表中删除行。用ON关键字编写的表达式是与要删除的表中的行匹配的条件。

二、MySQL Delete Join 示例

假设我们有两个表students和contacts,其中包含以下数据:

students表:

contacts表:

执行以下查询以了解Delete 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的行被删除了。

 

三、MySQL  LEFT JOIN 和 Delete 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;  

在上面的SQL中,请注意我们将只使用带有 DELETE 关键字的 Table1,而不是像 INNER JOIN 语句中那样使用两者。

示例

让我们在包含以下数据的数据库中创建一个表“ contacts ”和“ customers ”:

contacts表:

customers表:

执行以下语句,删除没有手机号码的客户:

DELETE customers FROM customers  
LEFT JOIN contacts ON customers.customer_id = contacts.contact_id   
WHERE cellphone IS NULL;  

执行成功后会提示如下信息:

现在,运行以下SQL以验证成功删除的行。

mysql> SELECT * FROM customers;  

可以看到没有手机号的客户的行被删除了。

热门文章

优秀文章