📜  SQL删除联接(1)

📅  最后修改于: 2023-12-03 15:05:20.841000             🧑  作者: Mango

SQL删除联接

在SQL中,我们可以使用DELETE语句来删除一行或多行数据。但当我们需要删除涉及到多个表的数据时,就需要使用到联接(JOIN)操作。

联接操作

联接操作表示将两个或多个表中的行按照指定的关联条件连接在一起,形成一个虚拟的表。联接操作常用的有内联接、左联接、右联接和全联接等。

  • 内联接:只返回两个表中都有匹配的行。
  • 左联接:返回左表中所有行和右表中匹配的行。
  • 右联接:返回右表中的所有行和左表中匹配的行。
  • 全联接:返回所有匹配的行,包括左表中未匹配的行和右表中未匹配的行。
DELETE语句删除联接

在使用DELETE语句删除联接时,我们需要使用到子查询。子查询中包含联接表和要删除的条件,外层DELETE语句对子查询返回的数据进行删除操作。

内联接

以删除订单表(orders)和订单详情表(order_details)中金额小于100的订单为例,删除联接语句如下:

DELETE orders, order_details 
FROM orders 
JOIN order_details 
ON orders.order_id = order_details.order_id 
WHERE order_details.amount < 100;

解释:

  1. 使用DELETE语句删除两张表中符合条件的行。
  2. 联接orders表和order_details表,按照order_id列进行匹配。
  3. 对于匹配到的表,只保留order_details表中amount列小于100的行。
  4. 删除匹配到的行。
左联接

以删除订单表(orders)和订单详情表(order_details)中金额小于100的订单为例,左联接删除联接语句如下:

DELETE orders, order_details
FROM orders 
LEFT JOIN order_details 
ON orders.order_id = order_details.order_id 
WHERE order_details.amount < 100;

解释:

  1. 使用DELETE语句删除两张表中符合条件的行。
  2. 左联接orders表和order_details表,按照order_id列进行匹配。
  3. 对于左表中匹配到的行,只保留order_details表中amount列小于100的行。
  4. 删除匹配到的行。如果某个订单的订单详情中没有小于100元的,则order_details表中对应的字段为NULL,即该记录被删除。
右联接

以删除订单表(orders)和订单详情表(order_details)中金额小于100的订单为例,右联接删除联接语句如下:

DELETE orders, order_details
FROM orders 
RIGHT JOIN order_details 
ON orders.order_id = order_details.order_id 
WHERE order_details.amount < 100;

解释:

  1. 使用DELETE语句删除两张表中符合条件的行。
  2. 右联接orders表和order_details表,按照order_id列进行匹配。
  3. 对于右表中匹配到的行,只保留orders表中匹配到的记录,且order_details表中amount列小于100。
  4. 删除匹配到的行。如果某个订单的订单详情中没有小于100元的,则order_details表中该记录不会被删除。
全联接

以删除订单表(orders)和订单详情表(order_details)中金额小于100的订单为例,全联接删除联接语句如下:

DELETE orders, order_details
FROM orders 
FULL JOIN order_details 
ON orders.order_id = order_details.order_id 
WHERE order_details.amount < 100;

解释:

  1. 使用DELETE语句删除两张表中符合条件的行。
  2. 全联接orders表和order_details表,按照order_id列进行匹配。
  3. 对于匹配到的记录,保留有内容的那一张表中匹配到的行。
  4. 删除匹配到的行。如果某个订单的订单详情中没有小于100元的,则order_details表中该记录不会被删除。如果某个订单的订单详情记录在orders表中没有对应的记录,则该记录不会被删除。
总结

使用DELETE语句删除联接时,需要使用到子查询,将联接条件和要删除的条件写在子查询中。内联接、左联接、右联接和全联接删除语句的区别在联接方式上,但使用的子查询语句是相同的。注意联接后保留的表是要删除的表和被保留表的交集,满足条件的行在该交集中才被删除,其他行都不受影响。