📅  最后修改于: 2020-11-18 03:20:56             🧑  作者: Mango
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;
您可以看到删除了客户没有手机号的行。