我在一个应用程序中遇到了一些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位网络流量(在某些应用中可能是一个考虑因素)
答案 0 :(得分:4)
让我解释为什么这适用于数字和字符串。
原因是数字无法启动标识符,除非转义名称。基本上,SQL查询发生的第一件事就是标记化。也就是说,查询的组成部分分为标识符和关键字,然后进行分析。
在SQL Server中,关键字和标识符以及函数名称(等等)不能以数字开头(当然,除非转义名称)。因此,当令牌化器遇到一个数字时,它知道它有一个数字。遇到非数字字符时,数字结束。因此,1000ORDER BY
等一系列字符很容易变成三个标记,1000
,ORDER
和BY
。
同样,第一次遇到单引号时,它总是表示字符串文字。当遇到最终单引号时,字符串文字结束。下一组字符代表另一个标记。
让我补充一点,没有理由使用这些细微差别。首先,这些规则是SQL Server标记化的属性,不一定适用于其他数据库。其次,SQL的目的是让人类能够表达查询。我们阅读它们的方式更为重要。
答案 1 :(得分:0)
答案 2 :(得分:0)
当解析器检查字符时,它会检查关键字,标识符,字符串常量并匹配语言的整体语义和句法结构。由于'排序'是一个关键字,sql解析器知道它在查询中可能的语法位置,它会相应地解释它而不会抛出任何错误。这就是为什么您的订单不会抛出任何错误的原因。 Parsing sql query