当前位置: 首页 > news >正文

MySQL查询语句的通配符*

文章目录

  • 环境
  • 背景
  • 解决办法
  • 分析
  • 总结
  • 参考

环境

  • MySQL 8.0.28
  • MySQL Workbench 8.0

背景

我想查询一张表里的记录,由于表里的字段可能非常多,或者我也不确定表里包含了哪些字段,所以需要用 * 来通配所有字段。与此同时,我想要重点关注某一个或几个字段(这些字段名是已知的),因此,想要把这些字段放在查询结果的最前面。

例如:已知表 t1 和 字段 c1 ,想要查询该表的所有字段,并把 c1 放在最前面。

看下面的SQL语句:

select c1, * from t1

注:事实上 * 也包含了 c1 ,所以 c1 会在结果里出现两次,这是OK的,在生产环境里我们一般不会这么用,这里只是测试一下。

但是,该SQL语句在MySQL里运行报错:

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:

SELECT id, * FROM t1

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

SELECT id, t1.* FROM t1

可见,解决办法是写成:

SELECT id, t1.* FROM t1

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

分析

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

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

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

只有这两个条件都满足,才会报错。如果只满足一个条件,或者两个条件都不满足,则不会报错。比如,下面的SQL语句都是OK的:

select * from t1; -- 不满足 2
select *, c1 from t1; -- 不满足 2
select c1, t1.* from t1; -- 不满足 1
select *, t1.* from t1; -- 第一个 * 不满足 2,第二个 * 不满足 1

总结

在MySQL的SQL语句里,要把 * 和字段名混用的话:

  • 要么把 * 前面带上表名,比如: select ..., t1.*, ... from ...
  • 要么把 * 放在最左边,比如: select *, ... from ...

看起来,把 * 前面带上表名是一个比较不错的方法。

参考

  • https://dev.mysql.com/doc/refman/8.0/en/select.html
http://www.lryc.cn/news/572686.html

相关文章:

  • 组态王工程运行时间显示
  • 【案例拆解】米客方德 SD NAND 在车联网中(有方模块)的应用:破解传统 TF 卡振动脱落与寿命短板
  • 在VTK中捕捉体绘制图像进阶(同步操作)
  • 零基础入门PCB设计 一实践项目篇 第三章(STM32开发板原理图设计)
  • 云计算处理器选哪款?性能与能效的平衡艺术
  • 【网络安全】文件上传型XSS攻击解析
  • 特征金字塔在Vision Transformer中的创新应用:原理、优势与实现分析
  • AS32系列MCU芯片I2C模块性能解析与调试
  • 408第二季 - 组成原理 - 流水线
  • Linux之线程同步与互斥
  • Rust 学习笔记:Unsafe Rust
  • 使用 .NET Core 8.0 和 SignalR 构建实时聊天服务
  • OPENPPP2 VMUX 技术探秘(高级指南)
  • 北京京东,看看难度
  • 解锁决策树:数据挖掘的智慧引擎
  • ffmpeg 给视频画圆圈
  • Electron (02)集成 SpringBoot:服务与桌面程序协同启动方案
  • 大白话说目标检测中的IOU(Intersection over Union)
  • Maven并行构建
  • 单点登录进阶:基于芋道(yudao)授权码模式的单点登录流程、代码实现与安全设计
  • SAP-ABAP:LOOP ... ASSIGNING高效处理内表数据详解
  • pandas polars 数据类型转换
  • 【pdf】Java代码生成PDF
  • lingma(阿里云Ai)结合idea使用
  • uni-app-配合iOS App项目开发apple watch app
  • Python按钮点击事件快速入门
  • vue3 reactive重新赋值
  • VSCode1.101.1Win多语言语言编辑器便携版安装教程
  • 【Dify精讲】第14章:部署架构与DevOps实践
  • 字符编码(UTF-8,16,32 和GBK和ASCLL码)