首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SELECT* vs SELECT *

SELECT* vs SELECT *
EN

Stack Overflow用户
提问于 2011-08-07 00:16:43
回答 3查看 312关注 0票数 5

昨天,一位同事向我展示了以下postgres查询。我们都对它的工作感到惊讶:

代码语言:javascript
复制
SELECT* FROM mytable;

因为我最近为另一种语言编写了一个解析器,所以我试图更深入地理解为什么这个查询“编译”并返回与SELECT * FROM mytable;相同的结果。

假设这是一个有效的查询,因为在词法分析期间,postgres从输入中读取SELECT作为令牌,然后搜索下一个令牌,它找到的是*,依此类推-这是或多或少这里发生的事情吗?

另外,postgres词法分析器/解析器是否恰好足够健壮,可以理解这个查询,或者其他数据库是否可以理解类似的SELECT*查询?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-07 00:22:07

通常,lexer会将字符添加到当前标记中,直到找到不属于当前标记的字符,然后退出并从以前无法继续的位置重新开始。

这里发生的事情是,lexer吞噬了SELECT,并发现下一个字符是一个*,因为它收集的是一个单词,不能属于SELECT。因此,它停止,分析原来是关键字的SELECT,并从它识别的*重新开始,以此类推。这与在其他编程语言中从2*22 * 2获得4的原因相同。

至于它是否适用于其他数据库,这完全取决于词法分析器的细节和语法规则。

票数 5
EN

Stack Overflow用户

发布于 2011-08-07 00:26:52

显然,标记器在空格和算术中使用的特殊字符上进行标记。

下面是SELECT语句的BNF:h2database.com

代码语言:javascript
复制
SELECT [ TOP term ] [ DISTINCT | ALL ] selectExpression [,...]
FROM tableExpression [,...] [ WHERE expression ]
[ GROUP BY expression [,...] ] [ HAVING expression ]
[ { UNION [ ALL ] | MINUS | EXCEPT | INTERSECT } select ] [ ORDER BY order [,...] ]
[ LIMIT expression [ OFFSET expression ] [ SAMPLE_SIZE rowCountInt ] ]
[ FOR UPDATE ]
票数 3
EN

Stack Overflow用户

发布于 2011-08-07 00:23:27

据我所知,SQL会跳过对空格的解析,所以你可以使用SELECT*FROM or SELECT * FROM,它基本上是一样的。

它还使用`'来理解什么是什么。所以SELECT * FROM myTable WHERE id = my string将是一个无效的查询,因为和处的“字符串”是不能理解的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6968084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档