YXTS122 2019-11-26 11:56 采纳率: 100%
浏览 417
已采纳

加了id就删了全表,不加id表就保留了

图片说明

图片说明

  • 写回答

4条回答 默认 最新

  • Amo_lt 2019-11-26 14:09
    关注

    我懂楼主问的意思,不管有没有加上那个id别名,id not in的数据应该是一样的,为什么一个是删了全表而另一个有保留。
    讲道理,如果不加id别名,那个子查询 select id from (select max(num) from student group by name,age) t1 不应该报列名id不存在么。很奇怪,难道MySQL允许这样的写法?楼主可以试下单独运行这个子查询,看下是什么结果么?

    此处更正:我用Oracle试了下,单独运行子查询报错,但是整体sql运行不报错。。而且将select id from (select max(num)...的id替换成其他的列名,需要类型与max(num)一样才不会报错,不一样的类型就会报错。

    以下更新回答:

    通过查阅大佬的博客了解到,原来 NOT IN (子表结果集) ,就是等价于 WHERE ID <> B.ID, 这时如果子表结果集中含有 NULL ,也就是空的时候,就变成 <> NULL ,而由于NULL值不能参与比较运算符,所以导致条件不成立,从而查询不出来数据。

    https://blog.csdn.net/sinat_35626559/article/details/81540114

    不加别名,子查询应该是null的。然后not in null。所以条件不成立,查询不出数据,导致不会删除数据。
    加了别名id就好理解了,因为查出来实际是num的值,但是id不存在与这些最大num相同的值,所以都会删除。

    可以试下将delete from改为select * ,将结果查询出来试下。

    题主很厉害啊!又刷新了我的知识面~
    而且我试了下将语句改为 id not in (select max(num) from student group by name,age)不管max(num) 后面加不加id,结果都是一样。只有你这种写法会造成两种结果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的
  • ¥15 matlab用simulink求解一个二阶微分方程,要求截图