MySQL查询语句的通配符*

文章目录

环境

  • 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:

sql 复制代码
SELECT id, * FROM t1

To avoid this problem, use a qualified tbl_name.* reference:

sql 复制代码
SELECT id, t1.* FROM t1

可见,解决办法是写成:

sql 复制代码
SELECT id, t1.* FROM t1

也就是在 * 前面加上表名。

分析

官方文档给出了解决办法,但是并没有说明原因。

事实上,经过测试,我发现,在SQL语句里使用 * 时,貌似只有以下情况会报错:

  1. * 前面不带表名,而且
  2. * 左边还有其它的字段

只有这两个条件都满足,才会报错。如果只满足一个条件,或者两个条件都不满足,则不会报错。比如,下面的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
相关推荐
苏琢玉1 天前
收藏版:Phinx 数据库迁移完全指南
数据库·mysql·php
七分小魔女1 天前
MySQL查看服务器/客户端版本
服务器·数据库·mysql
fusugongzi1 天前
mysql管理语句
数据库·mysql
猫梦www1 天前
关于Mysql的学习三(事务)
学习·mysql
寒山李白1 天前
MySQL 下载、安装及配置教程(Msi安装)
数据库·mysql·msi
会飞的架狗师1 天前
【MySQL体系】第7篇:MySQL锁机制深度解析与实战
数据库·mysql
凉栀お_1 天前
MySQL相关知识查询表中的内容(第三次作业)
数据库·mysql
狂盗一枝梅1 天前
MySql8.0公共表表达式『CTE』
mysql·cte
凡间客1 天前
MySQL Galera Cluster部署
数据库·mysql
siriuuus1 天前
MySQL 的 MyISAM 与 InnoDB 存储引擎的核心区别
mysql·1024程序员节