引号(双引号)将表名框起来有什么作用?
引号中的表名在SQL查询中起到了什么作用?
在SQL查询中,引号(quotation marks)用于标识表名或列名中包含特殊字符的情况。比如,如果表名或列名中含有空格、连字符或句点等特殊字符,那么就需要使用引号将其包裹起来,以确保查询语句的正确执行。举个例子,"a-b c.d"就是一个合法的标识符,如果没有使用引号将其包裹起来,在查询中就会被解析为三个不同的标识符。
在SQL中,表名或列名通常是由字母、数字和下划线组成的,不包含特殊字符。这样可以直接在查询语句中使用它们而无需引号。然而,当表名或列名中包含特殊字符时,就必须使用引号来确保SQL解析器能够正确识别它们。
解决方法就是使用引号将包含特殊字符的表名或列名包裹起来。在大多数数据库管理系统中,使用双引号(")或方括号([])来表示引号。具体使用哪种引号取决于数据库管理系统的不同。例如,在Oracle数据库中,使用双引号,而在SQL Server数据库中,使用方括号。
以下是一个示例查询,使用了引号来标识表名中包含特殊字符的情况:
SELECT * FROM "a-b c.d"
通过使用引号,SQL解析器可以正确识别表名,并执行相应的查询操作。这样就确保了查询的准确性和完整性,避免了因为特殊字符而导致的错误解析。
双引号在Oracle中用于将标识符视为区分大小写的,而不是使用默认的不区分大小写。如果你在表名(或列名)周围加上双引号,你必须始终使用双引号引用该标识符,并正确指定大小写(除了全部都是大写的标识符,双引号没有意义)。
在底层,Oracle始终进行区分大小写的标识符匹配。但是在进行匹配之前,它会将没有双引号的标识符转换为大写。如果在标识符周围加上双引号,Oracle将跳过转换为大写的步骤。
所以如果你做了这样的事情:
CREATE TABLE my_table(
col1 number,
col2 number
)
你可以这样写查询语句:
SELECT * FROM my_table
SELECT * FROM MY_TABLE
SELECT * FROM My_Table
SELECT * FROM "MY_TABLE"
但是这样的查询将失败:
SELECT * FROM "my_table"
另一方面,如果你做了这样的事情:
CREATE TABLE "my_other_table"(
col1 number,
col2 number
)
你将无法进行这样的查询:
SELECT * FROM my_other_table
SELECT * FROM MY_OTHER_TABLE
SELECT * FROM My_Other_Table
SELECT * FROM "MY_OTHER_TABLE"
但是这样的查询将成功:
SELECT * FROM "my_other_table"
这个答案没有提到的事实是,它还允许标识符包含其他情况下非法的字符,例如空格字符。最好的做法可能是只使用大写字母、数字和下划线。这样做将使每个人的生活更轻松。
这个答案还没有提到的事实是,它还允许标识符以非字母字符(即数字)开头。完整的列表可以在Oracle的文档中找到。