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 小时前
mysql是怎样运行的(梳理)
数据库·mysql
weixin_456588153 小时前
【java面试day19】mysql-优化
java·mysql·面试
TT哇4 小时前
@[TOC](MySQL)MySQL经典练习题(详解)
数据库·mysql
小李飞刀李寻欢4 小时前
MongoDB /redis/mysql 界面化的数据查看页面App
redis·mysql·mongodb
Pure_Eyes5 小时前
mysql 执行sql流程概述
数据库·sql·mysql
满目8287 小时前
【Ubuntu系统实战】一站式部署与管理MySQL、MongoDB、Redis三大数据库
数据库·redis·mysql·mongodb·ubuntu·数据库布置
DemonAvenger10 小时前
MySQL性能调优实战:慢查询分析与SQL优化全攻略
数据库·mysql·性能优化
维他奶糖6112 小时前
mysql数据库和redis数据库的安装
数据库·mysql
余衫马21 小时前
Mysql 5.7 与 SqlSugar 5.X 整合开发实战
mysql·c#·orm·sqlsugar
北极糊的狐1 天前
MySQL常见报错分析及解决方案总结(1)---Can‘t connect to MySQL server on ‘localhost‘(10061)
数据库·mysql