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
相关推荐
小Mie不吃饭1 天前
Oracle vs MySQL 全面对比分析
数据库·mysql·oracle
扶尔魔ocy1 天前
【linux C】在mysql中增加自定义的C动态库
linux·运维·mysql
kabcko1 天前
CentOS安装Mysql
mysql·adb·centos
ruleslol1 天前
MySQL 工具使用指南
mysql
爱学java的ptt1 天前
mysql的存储引擎
数据库·mysql
龘龍龙1 天前
Python基础学习(十一)
python·学习·mysql
不屈的铝合金1 天前
SQL 语言概述与数据库核心前置配置了解
数据库·sql·mysql·约束·sql 语句分类·字符集配置·校对规则
萧曵 丶1 天前
可重复读(Repeatable Read)隔离级别下幻读产生的原因
数据库·sql·mysql
Antoine-zxt1 天前
MySQL宕机日志迷局破解指南:从前台启动到精准排错
数据库·mysql·adb
·云扬·1 天前
MySQL运维效率提升:实用SQL语句合集
运维·sql·mysql