文章目录
环境
- MySQL 8.0.28
- MySQL Workbench 8.0
背景
我想查询一张表里的记录,由于表里的字段可能非常多,或者我也不确定表里包含了哪些字段,所以需要用 *
来通配所有字段。与此同时,我想要重点关注某一个或几个字段(这些字段名是已知的),因此,想要把这些字段放在查询结果的最前面。
例如:已知表 t1
和 字段 c1
,想要查询该表的所有字段,并把 c1
放在最前面。
看下面的SQL语句:
sql
select c1, * from t1
注:事实上 *
也包含了 c1
,所以 c1
会在结果里出现两次,这是OK的,在生产环境里我们一般不会这么用,这里只是测试一下。
但是,该SQL语句在MySQL里运行报错:
powershell
mysql> select c1, * from t1;
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 t1' at line 1
在MySQL Workbench里也是一样报错:

注:在Db2里,这样写SQL是没问题的,可以正常运行。
解决办法
在MySQL的官方文档( https://dev.mysql.com/doc/refman/8.0/en/select.html
)里提到:
Use of an unqualified * with other items in the select list may
produce a parse error. For example:
sqlSELECT id, * FROM t1
To avoid this problem, use a qualified tbl_name.* reference:
sqlSELECT id, t1.* FROM t1
可见,解决办法是写成:
sql
SELECT id, t1.* FROM t1
也就是在 *
前面加上表名。
分析
官方文档给出了解决办法,但是并没有说明原因。
事实上,经过测试,我发现,在SQL语句里使用 *
时,貌似只有以下情况会报错:
*
前面不带表名,而且*
左边还有其它的字段
只有这两个条件都满足,才会报错。如果只满足一个条件,或者两个条件都不满足,则不会报错。比如,下面的SQL语句都是OK的:
sql
select * from t1; -- 不满足 2
sql
select *, c1 from t1; -- 不满足 2
sql
select c1, t1.* from t1; -- 不满足 1
sql
select *, t1.* from t1; -- 第一个 * 不满足 2,第二个 * 不满足 1
总结
在MySQL的SQL语句里,要把 *
和字段名混用的话:
- 要么把
*
前面带上表名,比如:select ..., t1.*, ... from ...
- 要么把
*
放在最左边,比如:select *, ... from ...
看起来,把 *
前面带上表名是一个比较不错的方法。
参考
https://dev.mysql.com/doc/refman/8.0/en/select.html