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 小时前
Go基础:正则表达式 regexp 库详解
开发语言·mysql·golang·正则表达式·go语言
2301_7720935612 小时前
tuchuang_后端_前端_注册登录
数据库·后端·网络协议·mysql·wireshark
K_i13412 小时前
中国电信用户行为实时分析系统运维实战
hadoop·mysql
武子康12 小时前
Java-141 深入浅出 MySQL Spring事务失效的常见场景与解决方案详解(3)
java·数据库·mysql·spring·性能优化·系统架构·事务
努力学习的小廉16 小时前
初识MYSQL —— 数据类型
android·数据库·mysql
William_cl16 小时前
【连载3】MySQL 的 MVCC 机制剖析
数据库·mysql
2351617 小时前
【MySQL】MVCC:从核心原理到幻读解决方案
java·数据库·后端·sql·mysql·缓存
Raymond运维19 小时前
MySQL包安装 -- RHEL系列(Yum资源库安装MySQL)
linux·数据库·mysql
菲兹园长1 天前
MySql(SQL)
数据库·sql·mysql
一只小bit1 天前
MySQL表的操作:创建—修改—删除流程解析
数据库·mysql·oracle