1. 问题描述
今天在执行一个SQL语句的时候,在我本地数据库一直报语法错误,仔细检查了下,发现有个别名使用了groups,之前在博客园写过一篇关于MySQL关键字的文章,我记得保留字里面没有这个GROUPS啊,只有个GROUP,难道保留字的复数也不能直接使用(需要加撇号,一般是键盘上位于数字键1左边那个键)?然后就去MySQL官网上看了下,还真找到了相关说明。GROUPS是MySQL 8.0版本新增的保留关键字。
下面是我的SQL语句:
其中name是非保留关键字,不需要加撇号,groups是保留关键字,需要加撇号,否则报语法错误。
SELECT `groups`.name, COUNT(*) num_customers FROM (
SELECT SUM(a.avail_balance) cust_balance FROM account a
INNER JOIN product p ON a.product_cd = p.product_cd
WHERE p.product_type_cd = 'ACCOUNT' GROUP BY a.cust_id
) cust_rollup
INNER JOIN (
SELECT 'Small Fry' name, 0 low_limit, 4999.99 high_limit
UNION ALL
SELECT 'Average Joes' name, 5000 low_limit, 9999.99 high_limit
UNION ALL
SELECT 'Heavy Hitters' name, 10000 low_limit, 9999999.99 high_limit
) `groups` ON cust_rollup.cust_balance BETWEEN `groups`.low_limit AND `groups`.high_limit
GROUP BY `groups`.name;
这是我的数据库版本:
mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 8.0.11 |
+-----------+
1 row in set
mysql>
明确一个概念:关键字包括非保留关键字和保留关键字。保留关键字又简称为保留字。
2. 官方文档
关键字是在SQL中有意义的词。某些关键字(如SELECT、DELETE或BIGINT)是被保留的(被称为保留字),并且需要特殊处理才能作为表名和列名等标识符。对于内置函数的名称也是这样的。
非保留关键字不使用引号就可以作为标识符。如果按照“模式对象名称”中描述的方式引用它们,保留关键字也是可以作为标识符的:
mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax ...
near 'interval (begin INT, end INT)'
BEGIN和END是非保留关键字,因此作为标识符使用时不需要引号。INTERVAL是一个保留关键字,必须用引号括起作为标识符:
mysql> CREATE TABLE `interval` (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)
例外:限定名中跟在点号后面的单词必须是标识符,所以即使它是保留关键字,也不需要用引号括起来:
mysql> CREATE TABLE mydb.interval (begin INT, end INT);
Query OK, 0 rows affected (0.01 sec)
允许使用内置函数的名称作为标识符,但可能需要小心使用。例如,COUNT可以作为列名。但是,在默认情况下,函数名和后面的(符号之间不允许有空格。这一要求使解析器能够区分该名称是在函数调用中使用还是在非函数上下文中使用。有关函数名识别的更多细节,请参见“函数名称解析和分辨”。
INFORMATION_SCHEMA.KEYWORDS表列出了 MySQL 定义的关键字,并指出它们是否被保留。
MySQL 8.0 关键字和保留字
下面的列表显示了 MySQL 8.0 中的关键字和保留字,以及不同版本对单个字的更改。保留关键字用(R)标记。此外,_FILENAME是保留字。
在某些时候,你可能会升级到更高的版本,因此,查看将来的保留字也是一个好主意。你可以在 MySQL 更高版本的手册中找到这些。标准 SQL 禁止使用列表中的大多数保留字作为列名或表名(例如GROUP)。但有一些是可以使用的,因为 MySQL 使用yacc解析器的时候需要用到它们。
注:关键字有点多,这里就不列出了,可以直接参考对应的官方文档。
MySQL 8.0 新增关键字和保留字
下面的列表显示了与 MySQL 5.7 相比,在 MySQL 8.0 中添加的关键字和保留字。保留关键字用(R)标记。
注:关键字有点多,这里就不列出了,可以直接参考当对应的官方文档。
MySQL 8.0 删除的关键字和保留字
下面的列表显示了与 MySQL 5.7 相比,在 MySQL 8.0 中删除的关键字和保留字。保留关键字用(R)标记。
- ANALYSE
- DES_KEY_FILE
- MASTER_SERVER_ID
- PARSE_GCOL_EXPR
- REDOFILE
- SQL_CACHE