博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
子查询中有个不存在的列居然不报错是bug吗?
阅读量:6902 次
发布时间:2019-06-27

本文共 1256 字,大约阅读时间需要 4 分钟。

问题描述

有开发问我这样一个问题:

mysql> select * from aaa;+----+---------------------+----------+---------------------+| id | dt                  | name     | dtt                 |+----+---------------------+----------+---------------------+|  1 | 2019-01-14 18:15:39 | aaaaaaaa | 2019-01-30 17:14:08 |+----+---------------------+----------+---------------------+1 row in set (0.00 sec)mysql> select * from bbb;+----+---------------------+----------+| id | dt                  | name     |+----+---------------------+----------+|  1 | 2019-01-14 18:19:19 | aaaaaaaa ||  2 | 2019-01-14 18:20:49 | aaaaaaaa |+----+---------------------+----------+2 rows in set (0.00 sec)mysql> select * from aaa where id in (select id from bbb where dtt

上面内容里dtt这个字段在bbb表中并不存在,但是在外表中存在,但是为什么不报错反而查出来结果了呢?

原因

我请PostgreSQL的同事也做了同样的操作,也是不报错的;

这个在SQLServer和Oracle里面同样成立,why?
一般规则是,语句中的列名由FROM子句中引用的表隐式地限定在同一级别。如果子查询的FROM子句中引用的表中不存在列,则由外部查询的FROM子句中引用的表隐式地限定列。
即:在块结构语言计算子查询时,它开始在本地查找以解析列名。如果失败,则转到外部范围,直到找到具有该名称的列或失败为止。

风险

如果有开发这样执行delete语句,可能会导致全表被误删!

mysql> delete from aaa where id in (select id from bbb where dtt

正确又安全的写法

带上表名

mysql> select aaa.* from aaa where aaa.id in (select bbb.id from bbb where bbb.dtt
ERROR 1054 (42S22): Unknown column 'bbb.dtt' in 'where clause'

参考

转载地址:http://ikvdl.baihongyu.com/

你可能感兴趣的文章
linux驱动开发---导出内核符号
查看>>
php多语言截取字符串函数
查看>>
android项目 之 记事本(12) ----- 图片的等比例缩放及给图片加入边框
查看>>
C#创建自己的扩展方法
查看>>
业务模型的价值(程序员的另外一条出路)
查看>>
TI 28335和AD采集
查看>>
各国语言简写代码 (转)
查看>>
JAVA CyclicBarrier类详解
查看>>
判断字符串解析是JsonObject或者JsonArray
查看>>
Django中的分页
查看>>
Windows XP/Windows 7/Windows 8/Windows 10系统封装的另类教程和思路
查看>>
根据URL获取参数值得出json结果集,对外给一个接口让别人调用
查看>>
aptana eclipse plugin install on sts
查看>>
网友对网秦公司的真实评价
查看>>
windows下基于apache的SVN启动失败修改
查看>>
[九度][何海涛] 乐透之猜数游戏
查看>>
nw.js作者Roger:找到正确方向比怎么做更重要
查看>>
阿里巴巴参与研发的量子计算机已超越早期经典计算机
查看>>
向技术的长征:一家中国互联网巨头从商业驱动转向技术驱动的努力
查看>>
淘宝奇葩店铺:一个人的皇冠店|视频
查看>>