SQL中的单引号和双引号有什么区别?


Answers:


153

单引号用于指示SQL中字符串的开头和结尾。在SQL中通常不使用双引号,但是每个数据库的双引号可能会有所不同。

坚持使用单引号。

无论如何,这是主要用途。您可以为列别名使用单引号-您希望在应用程序代码中引用的列名与数据库中实际调用的列不同。例如:的PRODUCT.id可读性更高product_id,因此您可以使用以下两种方式之一:

  • SELECT PRODUCT.id AS product_id
  • SELECT PRODUCT.id 'product_id'

两者都可以在Oracle,SQL Server,MySQL中工作……但是我知道有些人说过,在使用单引号方法时,TOAD IDE似乎会带来一些麻烦。

如果列别名包含空格字符(例如),则必须使用单引号product id,但是不建议将列别名超过一个单词。


31
双引号通常用于对象名称(例如,列名“ First name”)。这是SQL-92标准的一部分。
LukLed 2010年

19
不,我指的是列名,但它也涉及别名。由于SQL-92标准,我建议对带不寻常字符的别名和名称使用双引号。SELECT * FROM USERS 'Users'在SQL Server中SELECT * FROM USERS "Users"不起作用,但可以。
LukLed 2010年

122
在意识到一个简单的规则之前,我总是会犯错:[S] trings的单引号,[D] atabase中事物的单引号
Spacedman 2012年

4
您应该使用双引号作为标识符。单引号违反了标准。
欧文·布兰德斯特

6
SELECT PRODUCT.id 'product_id'不会在甲骨文工作。单引号用于字符文字。它们不能用于(标准)SQL中的标识符(尽管某些DBMS在涉及带引号的标识符时只是忽略了SQL标准)
a_horse_with_no_name 2014年

80

我们记住在这种情况下使用什么的简单规则:

  • [ S ]单引号用于[ S ]曲调; [ D ]双引号用于[ D ]数据库标识符;

在MySQL和MariaDB的,在`(反引号)符号是一样的符号,你可以用当你的SQL_MODE已经ANSI_QUOTES启用。


4
为了明确起见,无论是否启用了ANSI_QUOTES,都可以使用反引号(`)来分隔标识符,但是如果启用了ANSI_QUOTES,则“您不能使用双引号将文字字符串引起引用,因为它被解释为标识符。” (来源)。(记住,所有这些都假设您在谈论MySQL。)
Sam Sam

哇!很棒的备忘录!
亚历克斯于

但是[ S ]单引号也适用于[ D ] ate文字。:-/
Bill Karwin,

日期字面量在大多数DBMS中都算作字符串
Please_Dont_Bully_Me_SO_Lords '19

64

单引号分隔字符串常量或日期/时间常量。

双引号分隔标识符,例如表名或列名。通常,只有在您的标识符不符合简单标识符的规则时,才需要这样做。

也可以看看:

您可以按照ANSI标准使MySQL使用双引号:

SET GLOBAL SQL_MODE=ANSI_QUOTES

您可以使Microsoft SQL Server根据ANSI标准使用双引号:

SET QUOTED_IDENTIFIER ON

36

在ANSI SQL中,双引号引起了对象名(例如表)的引用,这使它们可以包含其他不允许的字符,或者与保留字相同(实际上请避免使用)。

单引号用于字符串。

但是,MySQL遗忘了该标准(除非更改了SQL_MODE),并允许将它们互换地用于字符串。

此外,Sybase和Microsoft还使用方括号来标识标识符。

因此,这是特定于供应商的。

其他数据库(例如Postgres和IBM)实际上遵守ansi标准:)


4
MySql使用反引号`来引用标识符。(仅用于完成)
dar7yl 2010年

1
示例:如果要命名Postgres列“日期”(保留),则需要用双引号将其引起来。
fny 2014年

9

我使用以下助记符:

  • 单引号用于字符串(一件事)
  • 双引号用于表名和列名(两件事)

根据规格,这不是100%正确的,但是这种助记符可以帮助我(人类)。


1

不同之处在于它们的用法。单引号通常用于在WHERE,HAVING和一些内置SQL函数(例如CONCAT,STRPOS,POSITION等)中引用字符串。

如果要使用介于两者之间有空格的别名,则可以使用双引号引用该别名。

例如

(select account_id,count(*) "count of" from orders group by 1)sub 

这是来自一个具有account_id作为外键的订单表的子查询,我正在汇总这些查询以了解每个帐户下了多少个订单。在这里,为了方便起见,我在任一栏中给了一个随机名称作为“ count of”。

现在,让我们编写一个外部查询来显示“ count of”大于20的行。

select "count of" from 
(select account_id,count(*) "count of" from orders group by 1)sub where "count of" >20;

您也可以将相同的情况应用于通用表表达式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.