返回信息流最近在看丁奇的MySQL极客时间,这是其中一道思考题,一条SQL语句
select * from T where k=1
k是个不存在的列,报错应该是在哪个阶段呢?
评论里面有人说分析器阶段也有人说执行器阶段,蹲个大佬讲解一下
这是一条镜像帖。来源:北邮人论坛 / java / #64819同步于 2020/12/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】“不存在这个列”在哪个阶段报出来的?
zhaijiayu
2020/12/22镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
mysql不清楚,只看过postgresql,不过关系型数据库应该都差不多,一条sql要先经过解析器parser生成语法解析树,这一步只检查语法不检查语义;然后经过分析器analyzer生成查询树,这里会进行语义检查,所以lz这个问题报错应该是出现在分析器;分析器会生成一个逻辑查询树丢给优化器,优化器有重写和优化,最后会生成一颗物理查询树;最后执行器用这个物理查询树才能真正进行查询
谢谢解答,也就是说分析器阶段的语义分析也会校验表中是否存在该字段
【 在 Lmzzzzz1 的大作中提到: 】
: mysql不清楚,只看过postgresql,不过关系型数据库应该都差不多,一条sql要先经过解析器parser生成语法解析树,这一步只检查语法不检查语义;然后经过分析器analyzer生成查询树,这里会进行语义检查,所以lz这个问题报错应该是出现在分析器;分析器会生成一个逻辑查询树丢给优化器,优化器有重写和优化,最后会生成一颗物理查询树;最后执行器用这个物理查询树才能真正进行查询
对,会用元信息来校验语法树,包括表,字段这些
【 在 zhaijiayu 的大作中提到: 】
: 谢谢解答,也就是说分析器阶段的语义分析也会校验表中是否存在该字段
表格的元数据完全可以加载到内存 语意分析一下 有啥难的
【 在 zhaijiayu 的大作中提到: 】
: 最近在看丁奇的MySQL极客时间,这是其中一道思考题,一条SQL语句
: select * from T where k=1
: ............