sql语句中方括号[]有啥用?

Posted

技术标签:

【中文标题】sql语句中方括号[]有啥用?【英文标题】:What is the use of the square brackets [] in sql statements?sql语句中方括号[]有什么用? 【发布时间】:2008-09-09 21:02:24 【问题描述】:

我注意到 Visual Studio 2008 将方括号放在 sql 中的列名周围。括号有什么好处吗?当我手动编写 T-SQL 代码时,我从不理会它们。

例子:

视觉工作室:

SELECT [column1], [column2] etc...

我自己的方式:

SELECT column1, column2 etc...

【问题讨论】:

您的手工编写的 SQL 从来不需要括号,这是一件好事,您的数据库命名约定应该排除需要括号的名称。 相关答案讨论 QUOTED_IDENTIFIER 设置:***.com/questions/19657101/… 我可能会补充一点,括号是微软的怪癖。 SQL 标准实际上使用双引号 ("),Microsoft 支持。如果 Microsoft 觉得有必要对所有内容进行分隔,那么使用标准双引号会是更好的形式。但我想这会使移植到另一个 DBMS 变得太容易了,而且那永远不会...... 当您使用 GUI 时会自动添加它们,而不是输入名称,而是将表格拖到代码窗口。这样,无论名称中是否包含不受欢迎的字符,它都可以正常工作。 【参考方案1】:

如果您在列名或标识符中使用关键字或特殊字符,则需要括号。您可以将一列命名为 [First Name](带空格),但每次引用该列时都需要使用方括号。

新的工具将它们添加到任何地方以防万一或保持一致性。

【讨论】:

这是方括号的唯一用途吗? 相关问:***.com/questions/9917196/… sql 还在选择查询的 like 运算符中使用方括号来限制使用正则表达式的结果。 codeproject.com/Articles/33941/SQL-LIKE-Operator 您也可以定义一个名为select 的列名,但select select from mytable 会抛出错误,因此select [select] from mytable 会使其成为有效查询。无论您的 SQL 管理工作室中变得丰富多彩的单词,如果您想将它们用作列/表/sp/等名称,都应该用括号括起来。在 mysql 中,单引号 ```` 相当于这个。 我知道自动生成的查询在所有内容周围都使用方括号。但那是因为微软太懒了,检查它是否真的需要。仅在绝对需要时才应使用方括号。【参考方案2】:

如果您的列与 SQL 关键字具有相同的名称,或者其中包含空格,它们会很方便。

例子:

create table test ( id int, user varchar(20) )

哦不!关键字“用户”附近的语法不正确。 但是这个:

create table test ( id int, [user] varchar(20) )

工作正常。

【讨论】:

@Blordbeard 这是 Microsoft SQL Server 特有的东西,还是方括号对 Oracle、mySQL、PostgreSQL 等也同样有效? 括号不是标准 SQL,不确定所有数据库引擎使用什么字符。例如:MySQL 使用反引号:***.com/questions/2889871/…【参考方案3】:

如果您(出于某种原因)使用包含某些字符的列名,它们会很有用。

Select First Name From People

不起作用,但在列名周围加上方括号会起作用

Select [First Name] From People

简而言之,它是一种显式声明对象名称的方式;列、表、数据库、用户或服务器。

【讨论】:

【参考方案4】:

无论遵循避免使用保留字的命名约定,Microsoft 都会添加新的保留字。使用方括号可以将您的代码升级到新的 SQL Server 版本,而无需首先从您的客户端代码中编辑 Microsoft 的新保留字。这种编辑可能是一个重大问题。这可能会导致您的项目提前退役......

当您想在脚本中全部替换时,括号也很有用。如果您的批处理包含一个名为@String 的变量和一个名为[String] 的列,您可以将该列重命名为[NewString],而无需将@String 重命名为@NewString。

【讨论】:

替换所有解决方法:将@String重命名为$PreserveMe$,然后将String重命名为NewString,然后将$PreserveMe$重命名为@String【参考方案5】:

列名可能包含会混淆查询执行引擎的字符和保留字,因此始终在它们周围放置方括号可以防止这种情况发生。我想比检查问题然后处理它更容易。

【讨论】:

【参考方案6】:

在 1990 年代 SQL 的黑暗时代,这是一个很好的实践,因为 SQL 设计者试图将字典中的每个单词作为关键字添加到无休止的新功能雪崩中,他们将其称为 SQL3 草案。

所以它保持向前兼容性。

我发现它还有另一个很好的副作用,当您在代码审查和重构中使用 grep 时,它会很有帮助。

【讨论】:

【参考方案7】:

当列名是保留字时,可以使用方括号。

如果您以编程方式从您无法控制的列名集合生成 SQL 语句,则始终使用方括号可以避免问题。

【讨论】:

【参考方案8】:

另外 一些 Sharepoint 数据库的名称中包含连字符。在 SQL 语句中使用方括号可以正确解析名称。

【讨论】:

【参考方案9】:

我相信它会在此处添加它们以保持一致性...仅当列名中有空格或特殊字符时才需要它们,但在 IDE 生成 SQL 时始终包含它们会更简洁。

【讨论】:

【参考方案10】:

它们有助于识别 SQL 中的每个元素。

例如:

CREATE TABLE SchemaName.TableName (

这实际上会在默认 dbo 架构下创建一个名称为 SchemaName.TableName 的表,即使其意图可能是在 SchemaName 架构内创建表。

正确的方法如下:

CREATE TABLE [SchemaName].[TableName] (

现在它知道表名是什么以及应该在哪个架构中创建它(正确地在 SchemaName 架构中,而不是在默认的 dbo 架构中)

【讨论】:

谢谢。我遇到过这种用法。但是,您能否详细说明it knows what is the table name and in which schema should it be created in 的方式? SchemaNameTableName参数怎么传入? @alexlomba87 已经有一段时间了,但我认为我的回答是基于我的测试。 Microsoft 的 SQL 课程书说“您应该使用两部分名称来引用 SQL Server 数据库中的表,例如 Sales.Customer”,因此他们不会要求用方括号括起命名空间,但如果我没记错的话,将它们括起来把它放在正确的命名空间中。

以上是关于sql语句中方括号[]有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

spring注解@service括号中的service有啥用

matlab中的eval有啥用?

python中构建了一个类,在定义了一个函数时为啥括号第一个self有啥用,为啥不能给他赋值

犰狳库中方括号[]和圆括号()的区别

删除 r 中方括号内的任何文本

用括号括住 JavaScript 语句有啥意义?