业务实战记录5:MySQL 字段别名导致的异常与思考

news/2024/12/28 11:30:55/

目录

    • 引言
    • 案例分析
    • 关于字段别名的利弊
    • 结论

引言

在日常实战中,数据库查询是数据分析和决策过程中的关键环节。然而,由于现有字段和字段别名之间的冲突,我们可能会遇到意外的错误和困惑。因此,为了确保查询结果的准确性和可靠性,我们必须在查询语句中仔细处理字段和别名的命名,避免出现冲突。
本文将通过一个真实案例,探讨由字段冲突引发的意外错误,并探讨字段别名的优点与缺点。

案例分析

今天收到来自业务团队的一条反馈:xxx数据出现了百分之六七百的情况。理论上这个值应该要小于100%,怎么变成了600+%!
查看相关的 MySQL 代码,逻辑如下:

# 注:由于某些原因分两步进行统计,这是抽象后的结果,实际表单数据并非如此,而且比这个复杂。
with agg_actions as(select date(action_one_time) "动作1日期",date(action_two_time)   "动作2日期",production_name         "商品",count(action_one_time)  "动作1人数",count(action_two_time)  "动作2人数"from actionsgroup by `动作1日期`,`动作2日期`,`商品`
)
select -- 按周统计date_sub(动作1日期,interval weekday(动作1日期) day) as "动作1日期",sum(动作2人数)/sum(动作1人数) as "动作转化率" 
from agg_actions
group by `动作1日期`

咋一看代码似乎没有什么问题,但是调试的时候就很容已发,是字段别名出现了bug,但是具体怎么出现 600+%,就不清楚了,盲猜就是按照每一天先统计好,再根据周求和。总之就是出现了莫名其妙的错误。
解决方案
解决方案其实特别简单,把 SQL 的第 12 行的名字改一下,然后第 15 行的名字和第 12 行保持一致即可。

关于字段别名的利弊

字段别名作为一种解决方案,其优点是显而易见的,可以帮助我们提高效率。
下面列举 4 点优点:

  • 提高代码的可读性和可理解性: 比如给字段赋予更具描述性的名称;
  • 简化复杂查询: 比如简化复杂查询中的字段引用,如上文代码的别名,大都是将复杂查询简化为一个别名,方便后文引用;
  • 消除歧义: 消除歧义则是上文例子的解决方案
  • 与应用程序集成和稳定性维护: 别名字段可以提高数据库与应用程序的集成能力,并减少由于数据库模式变化而导致的应用程序修改,这种一般比较少见,没事一般不会随意动数据库模式,只有在大迭代才会动数据库模式,所以整体上会处于一个比较稳定的情况。

当然事物总是两面性的,有好的也有不好的,字段别名也存在一些潜在的缺点:

  • 字段歧义: 如上文示例所述,由于使用不当导致统计错误;
  • 维护困难: 当代码比较长且复杂,而且别名特别多的时候,会导致维护相当困难,代码的可读性变得很差;
  • 额外的处理开销: 别名字段需要额外的处理步骤和计算资源。在处理大量数据或复杂查询时,别名字段可能会对性能产生一定影响。

所以,使用字段别名时,几点小建议:

  • 命名一致性: 确保别名字段的命名规范和命名约定与数据库设计和业务需求保持一致;
  • 避免过度使用: 只在必要的情况下使用字段别名,避免过度使用别名导致查询语句复杂化;
  • 测试和验证: 在别名名字段之后,进行充分的测试和验证,确保查询结果的准确性和性能的可接受性。
  • 文档和注释: 在查询语句中使用适当的文档和注释,解释别名字段的目的和含义,方便日后维护和理解。

结论

字段别名是解决字段和表别名冲突问题的一种有效方法。它提高了查询的可读性、简化了复杂查询,并有助于应用程序的稳定性维护。然而,合理权衡字段别名的利弊是至关重要的。通过遵循最佳实践和注意潜在的缺点,我们可以充分利用字段别名的好处,同时降低潜在的风险和困难。


http://www.ppmy.cn/news/92225.html

相关文章

华为OD机试真题 Java 实现【组合出合法最小数】【2023Q1 200分】

一、题目描述 给一个数组,数组里面都是代表非负整数的字符串,将数组里所有的数值排列组合拼接起来组成一个数字,输出拼接成的最小的数字。 二、输入描述 一个数组,数组不为空,数组里面都是代表非负整数的字符串,可以是0开头。 例如:[“13”, “045”, “09”, “56”…

Eclipse 教程Ⅱ

Eclipse 修改字符集 默认情况下 Eclipse 字符集为 GBK,但现在很多项目采用的是 UTF-8,这是我们就需要设置我们的 Eclipse 开发环境字符集为 UTF-8, 设置步骤如下: 在菜单栏选择 Window -> Preferences -> General -> W…

C语言实现一个多线程委托模型

C语言实现一个多线程委托模型 多线程委托模型将线程分为boss线程(主线程)和worker线程(工作线程)。先从一个主线程开始运行,主线程根据情况完成工作线程的创建,将创建好的工作线程放入队列中,有…

使用object.defineProperty来更新数据示例

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。 Object.defineProperty()可以为对象的属性添加特性,每一个被添加过的属性,都会拥有属于自己的…

Go完整即时通讯项目及Go的生态介绍

Go完整即时通讯项目 项目架构: 1 编写基本服务端-Server server.go package mainimport ("fmt""net" )// 定义服务端 type Server struct {ip stringport int }// 创建一个Server func NewServer(ip string, port int) *Server {return …

perl 通过 swig 调用 c++代码

Swig 是一个软件开发工具,可以简化不同语言与 C/C 的交互(直接在其它语言的代码中调用 C/C 的代码)。   记录一下成功用 perl 调用 c 代码的例子。 环境 操作系统:centos 7.9 perl: version 5.16.3 swig: version 2.0.10 g: v…

操作dom

1-获取元素 通过id、name、className属性获取,通过tagName获取; 通过id获取的是元素列表第一个;通过name属性获取的是NodeList;通过className和tagName获取的是HTMLCollection let son1 document.getElementById("son&quo…

C4D R26 渲染学习笔记(2):渲染流程介绍

往期文章 C4D R26 渲染学习笔记(1):C4D版本选择和初始UI框介绍 3D建模流程 大致流程 #mermaid-svg-eE2RXHal49sVZ34l {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-eE2RXHal4…