📜  MySQL删除联接

📅  最后修改于: 2020-11-18 03:20:56             🧑  作者: Mango

MySQL删除联接

DELETE查询是数据操作语言的一部分,用于从表中删除行。在访谈中,如何删除MySQL中的join是一个非常受欢迎的问题。在MySQL中使用delete join语句并非易事。在本节中,我们将描述如何在DELETE查询中使用INNER JOIN或LEFT 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关键字编写的表达式是与要删除的表中的行匹配的条件。

假设我们有两个表学生和联系人,其中包含以下数据:

表:学生

表:联系人

执行以下查询以了解使用内部联接删除联接。该语句删除两个表中具有相同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子句,该子句返回left(first)表中的所有行以及另一个表中的匹配或不匹配行。类似地,我们还可以将LEFT JOIN子句与DELETE关键字一起使用,以从左(第一)表中删除行,而该表没有从右(第二)表中匹配的行。

以下查询更清楚地说明了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”:

表:联系人

表:客户

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

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

成功执行后,它将给出以下消息:

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

mysql> SELECT * FROM customers;

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