我见过一些人使用单引号来别名列名,例如:
select orderID 'Order No' from orders
和其他人使用方括号,例如:
select orderID [Order No] from orders
我倾向于使用方括号。有什么偏好/差异吗?
我见过一些人使用单引号来别名列名,例如:
select orderID 'Order No' from orders
和其他人使用方括号,例如:
select orderID [Order No] from orders
我倾向于使用方括号。有什么偏好/差异吗?
要回答“是否有任何偏好/差异”的问题:
是的,有多少意见就有多少偏好,但要小心你采纳了谁的偏好。
作为最佳实践,如果不需要任何额外的工作,建议编写可移植的 SQL。
对于您的特定示例,编写可移植查询同样容易......
select OrderId as "Order Id" from Orders
...因为它是写一个非便携式的:
select OrderId as [Order Id] from Orders
当存在具有相同击键次数的等效可移植形式时,最好不要编写非标准 SQL。
用于转义的 [] 的激增是由于 SQL Server Management Studio 和 MS Access 查询生成器等工具懒惰地转义一切。在 SQL Server 中度过他/她的职业生涯的开发人员可能永远不会想到,但这些年来,将 Access 和 SQL Server 应用程序移植到其他数据库平台时,括号已经造成了大量费用。引用所有内容的 Oracle 工具也是如此。未经培训的开发人员将 DDL 视为示例,然后在手写时继续使用相同的样式。在工具改进并且我们要求更好之前,这是一个很难打破的循环。在 Oracle 中,引用结合混合大小写会产生区分大小写的数据库。我见过人们引用数据库中每个标识符的项目,
如果您从一开始就使用规范化的合法标识符(使用 OrderId 或 order_Id 而不是 [Order Id])编写 DDL,您不必担心可能需要转义字符的神秘关键字;当您'已经使用了保留字。我可以指望我们曾经将应用程序从一个版本的 SQL Server 升级到另一个版本并且由于新的保留字而出现任何损坏的次数。
这通常是激烈辩论的主题,所以如果您换一种方式考虑:
C# 程序员不会使用 @ 转义所有变量,即使这样做是合法的。这将被认为是一种奇怪的做法,并且会成为 StackOverflow 上的嘲笑对象。转义应该用于边缘情况。但是编写符合 C# 标识符的开发人员并不介意在他们的 SQL 中转义每个标识符,编写非常丑陋、不可移植的 SQL“代码”。作为一名顾问,我遇到过不止一位 SQL Server 程序员,他们真诚地认为 [] 是必需的语法。我不怪开发者;我责怪工具。
'
s 是否有效取决于您的有效设置。而你错过了"
。请参阅分隔标识符:
当 QUOTED_IDENTIFIER 设置为 ON 时,SQL Server 遵循 ISO 规则在 SQL 语句中使用双引号 (") 和单引号 (')。例如:
双引号只能用于分隔标识符。它们不能用于分隔字符串。
必须使用单引号将字符串括起来。它们不能用于分隔标识符。
当 QUOTED_IDENTIFIER 设置为 OFF 时,SQL Server 对单引号和双引号使用以下规则:
引号不能用于分隔标识符。相反,必须使用括号作为分隔符。
可以使用单引号或双引号将字符串括起来。
最后:
无论 QUOTED_IDENTIFIER 的设置如何,始终可以使用括号中的分隔符
在上述所有引用中,当他们提到括号时,他们正在谈论[]
括号。
单引号更具可读性。如上所示,以红色突出显示。
MySQL 使用 `backticks` 来转义特殊字符。
MSSQL 可以使用“双引号”或 [括号] 表示标识符(表、列等)
,使用“单引号”表示字符串或别名。
方括号主要用于封装对象,以便空格、句点或连字符等特殊字符不会引发语法错误。
我建议在列别名之前使用“as”关键字 - 它更具可读性。
select [column with spaces] as 'my col' from "table with spaces" where n = 'foo'
select "column with spaces" as 'my col' from [table with spaces] where n = 'foo'
引用方法使您能够做到这一点:
SELECT 1 AS 'bla[]bla'
感谢贾斯汀格兰特在此线程的评论中 - 发布这是作为可见性的完整答案。
如果我们接受一般偏好是主观的,但一致性是可取的,那么就实际差异而言,有充分的理由不使用单引号'
。如果您需要在名称需要引用的列上使用例如聚合函数,单引号会给您带来麻烦(代码直接从贾斯汀的评论中复制/粘贴):
select sum ('foo') from (select 1 as 'foo') x
在我看来,这就是不使用单引号的充分理由——在某些情况下你不能使用它们,这会妨碍一致性。
因此,双引号"
或括号[]
是唯一的方法。这归结为您更看重哪种一致性 - 与 SQL Server 特定工具可能生成的代码保持一致,将使用括号,或遵守指定双引号的 ANSI 标准。在充分根深蒂固的 Microsoft 环境中,括号可能更有意义。如果没有这一点,双引号可能是更好的做法。