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

319

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


1
什么类型/供应商的Sql? - MSIS
7个回答

209

单引号用于在SQL中表示字符串的开始和结束。通常不使用双引号,但这可能因数据库而异。

坚持使用单引号。

这是主要的使用方式。您可以使用单引号替换列别名,其中您希望应用程序代码中引用的列名称与数据库中实际称为的列名称不同。例如:PRODUCT.id更容易理解为product_id,因此您可以使用以下任一方法:

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

这两种方法都适用于Oracle、SQL Server和MySQL... 但我知道有些人说使用单引号的方法在TOAD IDE中似乎会有些麻烦。

当列别名包含空格字符时必须使用单引号,例如product id,但不建议使用多个单词作为列别名。


45
双引号通常用于表示对象名称(例如,列名为“First name”)。这是 SQL-92 标准的一部分。 - LukLed
24
不,我是指列名,但别名也有影响。我建议对于带有不寻常字符的别名和名称使用双引号,因为这符合SQL-92标准。在SQL Server中,“SELECT * FROM USERS 'Users'”无法正常工作,但“SELECT * FROM USERS"Users"”可以。 - LukLed
176
直到我意识到一个简单的规则,我总是在这方面搞错:[S]ingle quote用于表示[字符串],[D]ouble quote用于表示[数据库]中的内容。 - Spacedman
4
标识符应使用双引号。单引号不符合标准。 - Erwin Brandstetter
8
在Oracle中,“SELECT PRODUCT.id 'product_id'”将不起作用。单引号用于字符字面量,不能用于标识符在(标准)SQL中(尽管某些DBMS在引用标识符时会忽略SQL标准)。 - user330315
显示剩余4条评论

181

我们需要记住用什么引号来表示哪种情况:

  • 单引号用于字符串字面量(日期字面量也是字符串)[S];
  • 双引号用于数据库标识符[D];

示例:

INSERT INTO "USERS" ("LOGIN", "PASSWORD", "DT_BIRTH") VALUES ('EDUARDO', '12345678', '1980-09-06');
在MySQL和MariaDB中,`(反引号)符号与"符号相同。请注意,当您的SQL_MODE启用了ANSI_QUOTES时,不能将"用于字面字符串。

7
澄清一下,反引号(`)可用于界定标识符,无论ANSI_QUOTES是否启用,但如果启用了ANSI_QUOTES,则“您不能使用双引号引用文本字符串,因为它会被解释为标识符。”(来源)。 (前提是您谈论的是MySQL。) - Sam
3
但是单引号也可以用于表示日期字面量。:-/ - Bill Karwin

75

单引号用于界定字符串常量或日期/时间常量。

双引号用于标识符,例如表名或列名。一般只有在你的标识符不符合简单标识符规则时才需要使用。

另请参见:

您可以使MySQL使用双引号来符合ANSI标准:

SET GLOBAL SQL_MODE=ANSI_QUOTES

您可以使Microsoft SQL Server按照ANSI标准使用双引号:

SET QUOTED_IDENTIFIER ON

46

在 ANSI SQL 中,双引号用于引用对象名称(如表),允许它们包含其他情况下不允许的字符,或者与保留字相同(但请避免这样做)。

单引号则用于字符串。

然而,MySQL 忽略了标准(除非修改了其 SQL_MODE),并允许将双引号和单引号互换使用来表示字符串。

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

因此,这有点取决于具体的数据库厂商。

其他数据库,如 Postgres 和 IBM 实际上遵循 ANSI 标准 :)


4
MySQL 使用反引号 ` 来引用标识符。(仅供完整性) - dar7yl
1
如果您想将Postgres列命名为“date”(该名称已被保留),则需要使用双引号。 - fny

12

我使用这个助记法:

  • 单引号用于字符串(一个东西)
  • 双引号用于表名和列名(两个东西)

根据规范,这不是100%正确的,但是这个助记法对我(人类)很有帮助。


4
人类。与使用SQL的其他动物不同。 :D - m4heshd
在用作表的替代名称时,应使用什么引号?(例如,在连接查询中,我们写成.... from "table_name" as t1 JOIN ......)t1应该用什么括起来? - Eric Garcia
每个字符串都需要引号吗? - MSIS

3

两件事需要记住:

单引号('):字符串文本

select * from employees where room_name = 'RobinCapRed';

RobinCapRed是一个字符串文本

双引号("):列名表名

select "first_name" from "employees";

其中 first_Name 是 员工表 中的一个列名


1

区别在于它们的用法。单引号主要用于WHERE、HAVING以及一些内置SQL函数(如CONCAT、STRPOS、POSITION)中引用字符串。

当您想要使用带有空格的别名时,可以使用双引号来引用该别名。

例如

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

这是一个来自订单表的子查询,其中account_id作为外键,我正在聚合以了解每个账户下有多少订单。在此,我将一个列命名为“计数”,仅供参考。
现在,让我们编写一个外部查询,以显示“计数”大于20的行。
select "count of" from 
(select account_id,count(*) "count of" from orders group by 1)sub where "count of" >20;

你也可以将相同的情况应用于公共表达式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接