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

多表删除的时候使用左连接?

        我知道前面好多人问了这个问题,我也去全部翻阅了,然后还是没能得到答案。实在是不理解~

        在这节课4:45处,老师要删除表1内有重复的记录,重复记录里面删掉ID较高的。他的代码是这样的。

******************************************************************

DELETE t1 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 WHERE t1.goods_id > t2.goods_id;

************************************************************************

        按照我的理解,左连接,是显示左表的全部和右表内符合条件的。在这里如果不加where条件的话,应该是删除了t1整个表的吧。

        那加了  WHERE t1.goods_id > t2.goods_id; 之后,对结果进行了筛选。符合条件的应该是,id=20/21/22/23这四条记录,那删除应该也是删除这四条,为什么会变成是只删除了两条呢?

*************************************************************************

        如果想要达成结果集内是18/19/21/22的话,应该使用内连接才对,因为内连接仅仅显示符合连接条件的记录。我测试使用内连接,结果也是和老师的一样的。

http://img1.sycdn.imooc.com//58d13c410001afad08760059.jpg

        所以我的问题是:为什么在这里使用左连接 ?为什么使用了左连接的话不是删除了20/21/22/23这四条记录,而是只删除了21和22?

求大神指点!( >﹏<。)~

正在回答

4 回答

这里我换了一个简单的表来演示,这是原表:http://img1.sycdn.imooc.com//58fac43d00013c5c02280206.jpg有两个字段

对其使用SELECT....GROUP BY..HAVING..后,如图表2:http://img1.sycdn.imooc.com//58fac5830001998801910102.jpg(证明原表中这两条信息有重复记录,即8,9行)

将这两个表格进行内连接后:http://img1.sycdn.imooc.com//58fac5e40001ae3e03580128.jpg根据连接条件,原表有4条记录匹配,而表2只有两条记录匹配,所以在显示时多加了几条与原表对应,只显示匹配成功的记录。然后经过where子句过滤将左表中id大于右表id的记录删除。

左外连接,结果如图:http://img1.sycdn.imooc.com//58fac6ee00019f3e03960202.jpg根据连接条件,显示左表全部记录,右表中没有的用NULL显示,然后where过滤


我可能说的不清楚,大家看图就可以~~大家可以动手试一下,我看完视频也是一脸懵逼,自己动手试了一下就明白了

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

1、这里左连接和内连接都可以的,因为后面有where约束。

2、查询显示的结果可以各种定制,你用t1.* 相当于查询所有t1 字段,和t2无关了。

3、select t1.goods_id,t2.goods_id as id2...运行一下你就明白了。

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

http://img1.sycdn.imooc.com//58d1672f0001350d17120626.jpg

我重新加了两条数据进去测试。并且只是展示,没有删除。

不加where的情况下,左连接,显示了t1表的全部行。

加了where,是对结果集进行筛选,按照常理我认为应该是20/23/24/25,但是结果只显示24和25,不明白为什么是这样~ 

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

记不记得在 5-12中老师讲的对外链接的注意事项中有一条:

“如果数据表A的某条记录符合WHERE条件,但是在数据表B不存在符合连接条件的记录,将生成一个所有列为空的额外的B行”

在A表中22/23符合WHERE条件,但是不在B表的连接结果集中,所以经WHERE筛选后实际返回的是20/21/NULL/NULL

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

Gemma_Tong 提问者

谢谢你的答复,我记得老师是说过这句话,但是当其时我是不理解这句话的。为什么会生成一个空行?左连接我单独试了,不加where的情况下是把t1表全部都显示出来了,加了where之后就只出现21和22,没有出现另外两个NULL哇
2017-03-22 回复 有任何疑惑可以回复我~
#2

痕六 回复 Gemma_Tong 提问者

都是NULL的话应该就不显示了。往原理上说我也不懂了,可能是这两个NULL在WHERE的结果是存在的,但是如果对它进行操作,比如SELECT,DELETE,全是NULL行的就自动抛弃了,SELECT出空行是不可能的。
2017-03-22 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

多表删除的时候使用左连接?

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