子查询中有个不存在的列居然不报错是bug吗?

简介: 问题描述 有开发问我这样一个问题: mysql> select * from aaa; +----+---------------------+----------+---------------------+ | id | dt | name | dtt.

问题描述

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

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<now());
+----+---------------------+----------+---------------------+
| 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)

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

原因

我请PostgreSQL的同事也做了同样的操作,也是不报错的;
这个在SQLServer和Oracle里面同样成立,why?

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

风险

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

mysql> delete from aaa where id in (select id from bbb where dtt<now());

正确又安全的写法

带上表名

mysql> select aaa.* from aaa where aaa.id in (select bbb.id from bbb where bbb.dtt<now());
mysql> ERROR 1054 (42S22): Unknown column 'bbb.dtt' in 'where clause'
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
SQL 数据库
达梦(DM) SQL查询及联合查询
继续讲解达梦(DM)数据库SQL查询操作
|
Shell Docker 容器
笔记:Docker命令自动补全
笔记:Docker命令自动补全 一 背景 作为一名 Linux 重度用户,每次敲命令总会情不自禁地按下 Tab 键。在键入 Docker 命令时也会出现类似的习惯性动作。那么是否 Docker 相关命令也能自动补全呢? 二 操作步骤 2.1 安装 bash-completion sudo yum install -y bash-completion 安装完成之后重启系统或者重新登录 shell。
22861 0
同步和异步的区别
用Python讲解同异步
|
监控 微服务 Python
微服务的故障恢复与弹性设计
【8月更文第29天】在微服务架构中,由于服务间的相互依赖,任何单点故障都可能导致整个系统崩溃。因此,设计具备高可用性和弹性的微服务系统至关重要。本文将探讨如何通过重试机制、断路器和超时设置等策略来增强系统的容错能力和恢复能力。
949 2
|
JSON Dart Java
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
flutter开发多端平台应用的探索 下 (跨模块、跨语言通信之平台通道)
vscode配置eslint保存自动修复
vscode配置eslint保存自动修复
766 1
|
弹性计算 Oracle 固态存储
阿里云ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选?
阿里云服务器ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选择?不同性能级别对应的单盘IOPS性能上限、IO和吞吐量都不同,ESSD云盘容量越大可选择的PL级别越高,性能级别PL越高价格也越贵,阿里云百科来详细说下阿里云ESSD云盘不同性能级别区别以及选择方法:
6140 0
阿里云ESSD云盘性能级别PL0、PL1、PL2和PL3怎么选?
|
机器学习/深度学习 编解码 算法
了解与对比主流背景去除工具
本文对比了几款主流的背景去除工具,包括Remove.bg、Removal.ai、RMBG 2.0、Imagga和Wondershare Pixcut,重点介绍了RMBG 2.0这款开源工具的性能、优势及挑战,适用于不同需求的用户选择。
|
存储 弹性计算 固态存储
阿里云服务器配置选择指南,2024年全解析
阿里云服务器配置选择涉及CPU、内存、带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型实例,如2核2G3M配置,适合网站和轻量应用。企业用户则应选择企业级独享型ECS,如计算型c7、通用型g7,至少2核4G起,带宽建议5M,系统盘考虑SSD云盘或ESSD云盘以保证性能。阿里云提供了多种实例类型和配置,用户需根据实际需求进行选择。
2714 0