ORDER BY之前没有空格 - 为什么这样做有用?

时间:2016-09-23 09:21:01

标签: sql sql-server

我在一个应用程序中遇到了一些SQL,它在“ORDER BY”子句之前没有空格。我很惊讶这甚至有效。

给定一个数字表,称为[counter],其中只有一列,counter_id是一个递增的整数列表,这个SQL在Microsoft SQL Server 2012中正常工作

select
*
FROM [counter] c
where c.counter_id = 1000ORDER by counter_id

这也适用于字符串,例如:

WHERE some_string = 'test'ORDER BY something

我的问题是,此查询是否存在任何潜在的陷阱或危险?相反,有什么好处吗?除了保存,该空白的8位网络流量(在某些应用中可能是一个考虑因素)

3 个答案:

答案 0 :(得分:4)

让我解释为什么这适用于数字和字符串。

原因是数字无法启动标识符,除非转义名称。基本上,SQL查询发生的第一件事就是标记化。也就是说,查询的组成部分分为标识符和关键字,然后进行分析。

在SQL Server中,关键字和标识符以及函数名称(等等)不能以数字开头(当然,除非转义名称)。因此,当令牌化器遇到一个数字时,它知道它有一个数字。遇到非数字字符时,数字结束。因此,1000ORDER BY等一系列字符很容易变成三个标记,1000ORDERBY

同样,第一次遇到单引号时,它总是表示字符串文字。当遇到最终单引号时,字符串文字结束。下一组字符代表另一个标记。

让我补充一点,没有理由使用这些细微差别。首先,这些规则是SQL Server标记化的属性,不一定适用于其他数据库。其次,SQL的目的是让人类能够表达查询。我们阅读它们的方式更为重要。

答案 1 :(得分:0)

正如jarlh所提到的那样,在扫描和解析令牌时可能存在差异,但是在执行计划期间它会正确创建,因此在优缺点上可能没有太大差异

enter image description here

答案 2 :(得分:0)

当解析器检查字符时,它会检查关键字,标识符,字符串常量并匹配语言的整体语义和句法结构。由于'排序'是一个关键字,sql解析器知道它在查询中可能的语法位置,它会相应地解释它而不会抛出任何错误。这就是为什么您的订单不会抛出任何错误的原因。 Parsing sql query

Parsing SQL