news 2026/3/20 18:03:26

SQL学习应用工作场景(2)--执行优先级+语法顺序+保留2位小数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL学习应用工作场景(2)--执行优先级+语法顺序+保留2位小数

前言:

我们先看需求,拆解分析思考。然后再实操写SQL。然后分析我中途写的时候遇到的问题以及解决方法,最后在此基础上优化扩展~~~~想看哪个部分的根据目录跳转吧(*^▽^*)


一、需求描述:

我们需要计算在'2025-12-24'之后的2条listing的净利润,即111和222。

已知:我们现在手上有2张表:

  • 一张是aaa库里面的销售数据统计表snap
  • 一张是bbb库里面的listing的产品花费统计表cost

计算公式:

  • 净利润=净销售额-采购成本;
  • 采购成本=采购价*发货数量/7.18------>(因为得到的是¥,所以还需要除7.18汇率得到$)

(真实工作不是这么短的计算公式,但这里只是模拟,不用在乎)


二、实操:

思考:

由已知的计算公式我们可以得到:

  • 净利润=净销售额-(采购价*发货数量/7.18)

我们在snap表得到对应的净销售额net_sales发货数量delivery_quantity

但是采购价purchase_pricecost表,需要拿过来,那么说明---->需要联表,使用到join on

最终得到:

SELECT ( IFNULL(snap.net_sales, 0) - IFNULL(ROUND((cost.purchase_price * snap.delivery_quantity) / 7.18, 2), 0) ) AS 手动计算的纯利润 FROM `aaa`.snap AS snap -- 第一步:先JOIN关联cost表 JOIN `bbb`.cost AS cost ON snap.listing = cost.listing -- 第二步:WHERE筛选条件(必须在JOIN之后) WHERE snap.`date` >= '2025-12-24' AND snap.listing IN ('111', '222') GROUP BY snap.listing ORDER BY snap.date DESC;

三、讲解:

这里讲解2个我写错的地方,记录!!!

(1)SQL优先级执行--AND的优先级高于OR:

首先第一个关键:在'2025-12-24'之后的2条listing

即我们需要的是:「2025-12-24 及以后」且「listing_id 是 111 或 222」

其实我自己一开始写的是:

WHERE `date` >= '2025-12-24' AND `listing` = '111' OR `listing` = '222'

查询的结果是一大堆,根本不是我们想要的。为什么?

因为存在一个问题:逻辑运算符优先级问题AND的优先级高于OR

即:原 SQL 的执行逻辑是:

(date >= '2025-12-24' AND listing = '111') OR (listing = '222')

导致查询条件被错误拆解。

正确写法

WHERE `date` >= '2025-12-24' AND (`listing` = '111' OR `listing` = '222') -- 括号强制先算OR

或者更简洁的,使用in

WHERE `date` >= '2025-12-24' AND `listing` IN ('111', '222') -- IN等价于多个OR,更易读

额外的学习:

  • 如果listing是数值类型(而非字符串),可以去掉单引号(listing IN (111, 222)),避免隐式类型转换影响性能;
  • date字段包含时分秒(如2025-12-24 10:00:00),>= '2025-12-24'会包含 24 日及之后的所有数据;

(2)SQL语法顺序错误--先join后where

其次第二个关键,也是我写错的地方:

先看看我写的是:

FROM `aaa`.snap AS snap WHERE snap.`date` >= '2025-12-24' AND snap.listing IN ('111', '222') JOIN `bbb`.cost AS cost ON snap.listing = cost.listing

错误点:语法顺序错误,要先关联表,再筛选

SQL 的执行顺序:FROM/JOINWHERESELECTORDER BY

我把WHERE写在JOIN前面,数据库会直接报错!

其他注意点:

1、空值处理(避免纯利润为 NULL)

IFNULL(字段, 0)包裹参与计算的字段,防止某一字段为空导致整个纯利润计算结果为 NULL

2、如果cost中一个listing对应多条采购价记录(多对多),会导致结果重复,需根据业务加GROUP BY或取最新采购价(比如MAX(cost.purchase_price));

3、如果想保留snap中所有符合条件的记录(即使没有采购价),把JOIN改为LEFT JOIN,此时无采购价的记录采购价部分会按 0 计算。


四、优化点:

(1)sql之保留2位小数:

外层嵌套ROUND()函数----->可实现保留 2 位小数

ROUND(计算式, 2)第二个参数2表示保留 2 位小数,会自动四舍五入

因此我们可以优化成:

IFNULL(ROUND((cost.purchase_price * snap.delivery_quantity) / 7.18, 2), 0)

(2)其他保留小数的函数

  • TRUNCATE(计算式, 2)直接截断 2 位小数(不四舍五入,比如 123.456 → 123.45),适合不需要四舍五入的场景;
IFNULL(TRUNCATE((cost.purchase_price * snap.delivery_quantity) / 7.18, 2), 0)

五、尾声-碎碎念

感觉问题都是很基础的.....说明主包的SQL基础不牢固,在工作中一点点撞壁学习、学习撞壁.....好在有AI,其实都不是什么大问题了。

还是建议学习SQL要把基础抓牢固!还是很有意思的~

如果对你有启发和学习,记得给我点赞Thanks♪(・ω・)ノ

下期撞壁再见~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 2:20:37

数据交易中的数据基础设施与云服务

数据交易中的数据基础设施与云服务 关键词:数据交易、数据基础设施、云服务、数据安全、数据流通 摘要:本文深入探讨了数据交易中数据基础设施与云服务的相关内容。首先介绍了数据交易的背景以及数据基础设施和云服务在其中的重要性,接着详细解释了数据基础设施和云服务的核…

作者头像 李华
网站建设 2026/3/13 20:05:50

2025下半年软考纸质证书领取时间表来啦!

2025年下半年计算机技术与专业技术资格考试纸质证书各地领取时间已出炉!部分地区有领取时间限制,通过考试了的同学们抓紧时间领取~一、各地软考纸质证书领取时间汇总1.上海现场领取时间:12月29日快递邮寄时间:12月22日开始2.重庆现…

作者头像 李华
网站建设 2026/3/15 7:35:39

C156D飞腾加固计算机在国产化计算体系中的应用定位

在国产化计算平台逐步落地的过程中,移动计算设备既需要满足自主可控要求,也需要具备在复杂环境中稳定运行的能力。 C156D飞腾加固计算机,正是在这一应用背景下形成的国产化加固计算设备方案。一、产品定位:面向国产化应用的加固计…

作者头像 李华
网站建设 2026/3/13 21:07:13

KAIST AI团队革命性突破:无需深度估计也能让视频自由变换视角

这项由韩国科学技术院(KAIST)人工智能实验室的金敏晶、金正豪、陈昊英、郑俊河以及朱在乙教授团队完成的研究,于2025年12月18日发表在计算机视觉顶级会议arXiv上,论文编号为arXiv:2512.17040v1。有兴趣深入了解的读者可以通过该编…

作者头像 李华
网站建设 2026/3/19 4:09:04

CRMEB WxJava,微信生态开发外挂来袭!

“CRMEB技术圈大事件”——CRMEB多商户系统Java版接入WxJava,实现微信生态开发升级!🚀 用户体验,丝滑到飞起~ ✅ 快速登录不卡壳:告别登录转圈圈/授权失败,将复杂技术验证流程打包简化,丝滑登录…

作者头像 李华