为了账号安全,请及时绑定邮箱和手机立即绑定

多表删除的理解

 首先,通过以下代码对tdb_goods表进行查询,得到一个临时的参照表。

 

   查询代码如下:

http://img1.sycdn.imooc.com//591bd5f90001eb0f06500157.jpg

    这段代码的意思是:

        1、查询的字段是:tdb_goods表中的good_id, goods_name。

        2、查询的对象是: count(goods_name) >= 2。即,查询tdb_goods表中 goods_name这一列存在重复的记录。

        3、对查询到的记录进行分组。GROUP BY goods_name意思是:如果goods_name列存在多条重复的记录,则只显示查找到的第一条记录,并过滤掉后面重复的记录。由于事先并没有使用ORDER BY对记录排序,默认的查找顺序应该是记录插入的顺序。即此时查询到的第一条记录,就是最先插入的记录。

 

然后,以上面查询得到的表为参照,对原表(即tdb_goods)进行删除操作:

代码如下:

http://img1.sycdn.imooc.com//591be1680001d17106400111.jpg

这段代码我是这样理解的:

    1、DELETE t1     表示要在t1表中删除记录,t1 即 tdb_goods。

    2、t1 LEFT JOIN t2     将t1与t2(即上面的参照表)连接起来,连接方式是LEFT JOIN。当然这里也可以用别的连接方式,比如:INNER JOIN/ RIGHT JOIN 结果都是一样的。

    3、ON t1.goods_name = t2.goods_name     连接的条件

    4、WHERE t1.goods_id > t2.goods_id;    这里表示的是:删除t1中 t1.goods_id > t2.goods_id 且 t1.goods_name=t2.goods_name的所有记录。

正在回答

2 回答

分析的很不错!

0 回复 有任何疑惑可以回复我~

很有启发,这段代码应该分成三点分析,

 1、DELETE t1     表示要在t1表中删除记录,t1 即 tdb_goods。

 2、t1 LEFT JOIN t2     将t1与t2(即上面的参照表)连接起来,(形成一个新的虚拟的表)连接方式是LEFT JOIN。当然这里也可以用别的连接方式,比如:INNER JOIN/ RIGHT JOIN 结果都是一样的。ON t1.goods_name = t2.goods_name     连接的条件

大家可以把这个左连接的表单独显示出来,用如下语句:

 select * from  tdb_goods AS t1 LEFT JOIN 
 (SELECT goods_id,goods_name FROM tdb_goods GROUP BY goods_name HAVING count(goods_name) >= 2 ) AS t2
 ON t1.goods_name = t2.goods_name;

得到的结构

https://img1.sycdn.imooc.com//5ca599be000102ca14160420.jpg

3 、WHERE t1.goods_id > t2.goods_id;   这里表示的是:删除t1中 t1.goods_id > t2.goods_id的所有记录。


0 回复 有任何疑惑可以回复我~
#1

Silent_Walke

from之后的是where的作用空间 为什么要用左连接,因为是删除左表中部分数据,所以用左连接把左表全部显示出来比较好,整体逻辑上。 为什么内连接和右连接也行,因为要删除的部分在两个表的公共部分,而内连接和右连接也有公共部分,所以也可以!
2019-04-04 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
与MySQL的零距离接触
  • 参与学习       396886    人
  • 解答问题       3353    个

本课程涵盖全部MySQL数据库的基础,学习MySQL数据库的基础知识

进入课程

多表删除的理解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信