在旧客户端脚本的再现过程中,我遇到了一个问题。 他们在数据库中有两个表,名为“content.articles”和“content.categories”
SELECT content.articles.*, content.categories.id as category_id
FROM `content.articles`
INNER JOIN `content.categories`
ON content.articles.category=content.articles.id
我知道问题是表名中的点。 我该如何正确选择?
我试过了:
SELECT content.articles.*
SELECT `content.articles`.*
SELECT `content.articles.*`
这些选项都不起作用。
非常感谢你的帮助。
答案 0 :(得分:2)
SQL允许在表名中包含点或其他标点或甚至空格,但只要在查询中使用它们,就必须“分隔”标识符。
这是不寻常的,不建议在表名中使用点,因为很容易将其与databasename.tablename
syntax for qualified tables混淆。
如果你在C ++中有一个名为Foo::Bar
的变量就好了。阅读代码的人会是这样的:等等,是类中的Bar Foo?或者它是一个字面上称为Foo :: Bar的变量?为什么在这个世界上你会做这样的事情!?!
您可以使用标识符分隔符来解决此类奇怪的表名。并且每次引用那种表名时,必须使用分隔符。
答案 1 :(得分:1)
如果FROM
子句中的表引用是正确的,那么您尝试的第二个表单应该是有效的...将整个标识符括在反引号中。 e.g。
SELECT `content.articles`.*
FROM `content.articles`
反引号允许许多不稳定的字符,否则这些字符将被解释为SQL文本的一部分并抛出错误。
SELECT `ab.d@ AND '0'`.*
FROM `ab.d@ AND '0'`
^ ^
我对FROM子句中的表引用有点怀疑。点分隔符用于数据库名称和表名称之间。如果表名为articles
且位于content
数据库中,则不应将标识符组合在反引号内。在这种情况下,我们从SELECT列表中的列名中省略了数据库限定符。
如果articles
是content
数据库中的表格,那么我们就是这样做的
SELECT `articles`.*
FROM `content`.`articles`
^ ^ ^ ^
一个方便的模式是为表分配一个别名,并使用它来限定列引用。下面是一个为表引用分配别名ca
的示例,并使用ca.
限定SELECT列表中的列引用:
SELECT ca.*
FROM `content`.`articles` ca
^ ^ ^ ^