在 MySQL 中,这段代码运行良好:
select f, blegg.* from blegg limit 1;
+------+------+------+------+
| f | f | g | h |
+------+------+------+------+
| 17 | 17 | 2 | 17 |
+------+------+------+------+
1 row in set (0.00 sec)
那么为什么这段代码会导致语法错误呢?
select f, * from blegg limit 1;
-- * is unqualified
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near '*
from blegg limit 1' at line 1
我翻阅了手册,但没有真正找到任何东西。为什么select <field>, * ...
失败在哪里select <field>, <table>.* ...
and select * ...
and select *, <field> ...
成功?
MySQL 手册在以下部分中非常清楚地列出了所有这些内容SELECT syntax:
-
仅包含单个不合格的选择列表*
可以用作
从所有表中选择所有列的简写:
SELECT * FROM t1 INNER JOIN t2 ...
-
tbl_name.*
可以用作
从指定表中选择所有列的限定简写:
SELECT t1.*, t2.* FROM t1 INNER JOIN t2 ...
-
使用不合格的*
与选择列表中的其他项目可能会产生解析错误。到
避免这个问题,使用合格的tbl_name.*
参考
SELECT AVG(score), t1.* FROM t1 ...
该文档似乎表明*
其本身仅在特殊情况下有效,即它是选择列表中的唯一内容。然而,它只说使用不合格的*
与其他物品may产生解析错误。
除了 MySQL 之外,SQL-92标准(旧的,但可链接)说的是:
7.9 <query specification>
Format
<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>
<select list> ::=
<asterisk>
| <select sublist> [ { <comma> <select sublist> }... ]
<select sublist> ::=
<derived column>
| <qualifier> <period> <asterisk>
<derived column> ::= <value expression> [ <as clause> ]
<as clause> ::= [ AS ] <column name>
<select list>
可以是<asterisk>
通过它自己or“正常”选择列表。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)