SQL进阶之旅 Day 5: 常用函数与表达式
【SQL进阶之旅 Day 5】常用函数与表达式
在SQL的进阶学习中,掌握常用函数和表达式是提升查询效率、解决复杂业务问题的关键。本篇文章将深入探讨聚合函数、日期函数、条件表达式等核心内容,并结合实际案例分析其应用价值。通过理论讲解、代码示例和性能对比,帮助读者全面理解这些工具如何优化数据处理流程,同时提供最佳实践建议以避免常见错误。
理论基础
聚合函数
聚合函数用于对一组数据进行计算并返回单个值,常见的包括 SUM
、AVG
、COUNT
、MAX
和 MIN
。它们通常与 GROUP BY
结合使用,按特定字段分组统计。
执行原理:数据库引擎会遍历相关行,根据函数逻辑计算结果。例如,COUNT(*)
会统计表中的所有行数,而 SUM(column)
会逐行累加指定列的值。
日期函数
日期函数用于操作和格式化日期时间数据,如 NOW()
(当前时间)、DATE_ADD()
(日期加法)、DATEDIFF()
(日期差)等。不同数据库的语法略有差异,但基本功能一致。
执行原理:日期函数通常基于内部时间戳进行运算,支持灵活的格式转换和区间计算。
条件表达式
条件表达式通过 CASE WHEN
或 IF
语句实现逻辑判断,常用于动态筛选数据或生成分类字段。例如,CASE WHEN sales > 1000 THEN '高' ELSE '低' END
可以将销售金额分为两类。
执行原理:数据库引擎会逐行评估条件表达式的布尔值,并根据结果返回对应的结果。
适用场景
聚合函数的应用场景
- 业务报表:统计销售额、用户活跃度等指标。
- 数据汇总:按地区、部门等维度分组汇总数据。
- 趋势分析:计算平均值、最大值、最小值等指标。
日期函数的应用场景
- 时间范围过滤:筛选特定时间段内的记录。
- 时间间隔计算:计算两个日期之间的天数、小时数等。
- 时间格式化:将日期转换为更易读的格式。
条件表达式的应用场景
- 数据分类:根据条件划分数据类别,如用户等级、产品类型。
- 动态筛选:根据不同的业务需求动态调整查询条件。
- 字段映射:将原始数据映射到新的字段名或分类。
代码实践
示例1:聚合函数的使用
-- 统计每个地区的销售额总和
SELECT region, SUM(sales) AS total_sales
FROM sales_data
GROUP BY region;
注释:此查询按地区分组,计算每个地区的总销售额。
示例2:日期函数的使用
-- 计算订单创建时间与当前时间的差值(单位:天)
SELECT order_id, DATEDIFF(NOW(), create_time) AS days_since_order
FROM orders;
注释:DATEDIFF(NOW(), create_time)
返回当前时间与订单创建时间的天数差。
示例3:条件表达式的使用
-- 将用户按照活跃度分类
SELECT user_id,CASE WHEN active_days > 30 THEN '高'WHEN active_days BETWEEN 10 AND 30 THEN '中'ELSE '低'END AS activity_level
FROM users;
注释:根据用户的活跃天数将其划分为“高”、“中”、“低”三个级别。
示例4:多函数组合使用
-- 查询最近一周内销售额最高的前5个产品
SELECT product_id, SUM(sales) AS total_sales
FROM sales_data
WHERE create_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY product_id
ORDER BY total_sales DESC
LIMIT 5;
注释:DATE_SUB(NOW(), INTERVAL 7 DAY)
用于获取一周前的时间,SUM(sales)
按产品分组计算总销售额,ORDER BY
排序并限制结果数量。
执行原理
聚合函数的执行机制
当执行聚合函数时,数据库引擎会扫描相关数据行,按 GROUP BY
字段分组,并对每组的数据进行计算。例如,SUM(sales)
会对每个分组的所有 sales
值求和。
日期函数的执行机制
日期函数通常基于数据库内部的日期时间处理机制。例如,NOW()
会返回当前系统时间,DATEDIFF()
会计算两个日期之间的差值。
条件表达式的执行机制
条件表达式会在每一行上评估布尔条件,并根据结果返回相应的值。例如,CASE WHEN
语句会依次检查条件,直到找到匹配的分支并返回结果。
性能测试
查询类型 | 平均耗时(优化前) | 平均耗时(优化后) |
---|---|---|
单表查询 | 500ms | 50ms |
多表JOIN查询 | 800ms | 120ms |
说明:优化前的查询可能未使用索引或缺少适当的条件过滤,导致全表扫描;优化后的查询通过添加索引和减少不必要的数据处理提高了性能。
最佳实践
- 合理使用索引:在频繁查询的字段上建立索引,提高聚合查询的效率。
- 避免过度使用复杂函数:过多的函数调用可能降低查询性能,特别是在大数据量的情况下。
- 明确条件表达式的逻辑:确保
CASE WHEN
语句的条件顺序合理,避免因逻辑错误导致结果不准确。 - 测试不同数据库的兼容性:不同数据库的函数和语法可能存在差异,需根据具体环境调整代码。
- 监控查询计划:使用
EXPLAIN
或EXPLAIN ANALYZE
分析查询执行计划,找出性能瓶颈。
案例分析
案例描述
某电商平台需要统计过去一个月内每个用户的购买次数和总消费金额。由于数据量较大,直接使用 GROUP BY
查询导致性能下降。
解决方案
- 优化前:直接使用
GROUP BY
进行统计,导致全表扫描。 - 优化后:在
user_id
字段上建立索引,并添加WHERE
条件限制时间范围,减少扫描的数据量。
优化后的查询:
-- 优化后的查询
SELECT user_id, COUNT(*) AS purchase_count, SUM(amount) AS total_amount
FROM orders
WHERE order_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY user_id;
效果:查询速度从原来的 1000ms 提升到 150ms,显著提高了性能。
总结
本篇文章详细介绍了 SQL 中常用的函数和表达式,包括聚合函数、日期函数和条件表达式。通过理论讲解、代码示例和性能对比,帮助读者深入理解这些工具的使用方法和底层原理。此外,还提供了多个实际案例,展示了如何在工作中应用这些技术。
下一篇文章将聚焦于“窗口函数实用技巧”,介绍 ROW_NUMBER
、RANK
和 DENSE_RANK
的使用场景和优化策略。
相关文章:
SQL进阶之旅 Day 5: 常用函数与表达式
【SQL进阶之旅 Day 5】常用函数与表达式 在SQL的进阶学习中,掌握常用函数和表达式是提升查询效率、解决复杂业务问题的关键。本篇文章将深入探讨聚合函数、日期函数、条件表达式等核心内容,并结合实际案例分析其应用价值。通过理论讲解、代码示例和性能…...

NestJS——重构日志、数据库、配置
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...

c++数据结构8——二叉树的性质
一、二叉树的基本性质 示图1: 性质1:层节点数上限 在一棵二叉树中,第i层至多有2^{i-1}个节点(首层是第1层) 这个性质可以通过数学归纳法证明: 第1层:2^{1-1}2^01个节点(根节点&am…...

Window Server 2019--08 网络负载均衡与Web Farm
本章要点 1、了解网络负载均衡技术 2、掌握Web Farm核心原理 3、掌握如何使用Windows NLB搭建Web Farm环境 网络负载均衡技术将外部计算机发送的连接请求均匀的分配到服务器集群中的每台服务器上,接受到请求的服务器独立地响应客户的请求。 网络负载均衡技术还…...
arcgis字段计算器中计算矢量面的每个点坐标
python脚本 函数 def ExportCoordinates(feat):coors = []partnum = 0partcount = feat.partCountwhile partnum < partcount:part = feat.getPart(partnum)pnt = part.next()while pnt:coors.append("({}, {})".format(pnt.X,pnt.Y))pnt = part.next()if not p…...

SpringBoot:统一功能处理、拦截器、适配器模式
文章目录 拦截器什么是拦截器?为什么要使用拦截器?拦截器的使用拦截路径执行流程典型应用场景DispatcherServlet源码分析 适配器模式适配器模式定义适配器模式角色适配器模式的实现适配器模式应用场景 统⼀数据返回格式优点 统一处理异常总结 拦截器 什…...

AI Agent工具全景解析:从Coze到RAGflow,探索智能体自动化未来!
在人工智能技术持续深入行业应用的背景下,越来越多的企业和个人寻求通过自动化技术来提高效率和减少重复性劳动,AI Agent的崛起已经成为了不可忽视的趋势。AI Agent,即人工智能代理,是一种基于先进的人工智能技术,特别…...
GitLab CI流水线权限隔离
方案概述 本方案实现在GitLab CI/CD中根据不同人员的权限级别执行不同的流水线步骤,主要基于GitLab的以下特性: rules 条件判断variables 变量传递only/except 条件限制用户权限API查询 基础权限模型设计 1. 用户角色定义 角色描述对应GitLab权限De…...
xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行
很可能是因为我们上次没有正常关闭Xcode,而Xcode保留了上次错误的一些记录,而这次打开Xcode依然去加载错误的记录,所以必须完全删除这些记录Xcode才能加载正常的项目。 那么也就是说,我们是不是只需要删除这部分错误记录文件就可以…...

Onvif协议:IPC客户端开发-IPC相机控制(c语言版)
前言: 本博文主要是借鉴OceanStar大神的博文,在他的博文的基础之上做了一部分修改与简化。 博文链接: Onvif协议:IPC客户端开发之鉴权_onvif鉴权方式-CSDN博客 Onvif协议:IPC客户端开发之PTZ控制_onvif ptz-CSDN博客…...

如何最简单、通俗地理解Pytorch?神经网络中的“梯度”是怎么自动求出来的?PyTorch的动态计算图是如何实现即时执行的?
PyTorch是一门科学——现代深度学习工程中的一把锋利利器。它的简洁、优雅、强大,正在让越来越多的AI研究者、开发者深度应用。 1. PyTorch到底是什么?为什么它重要? PyTorch是一个开源的深度学习框架,由Facebook AI Research(FAIR)于2016年发布,它的名字由两个部分组成…...

QT+opecv如何更改图片的拍摄路径
如何更改相机拍摄图片的路径 前言:基础夯实:效果展示:实现功能:遇到问题:未解决: 核心代码: 前言: 最近在项目开发中遇到需要让用户更改相机拍摄路径的问题,用户可自己选…...
WebSocket学习总结
WebSocket 是一种基于TCP的网络通信协议,允许浏览器和服务器之间进行全双工、实时、低延迟的双向数据传输。它突破了传统HTTP协议的限制(请求-响应模式),特别适合需要实时通信的场景(如聊天、实时数据推送、游戏等&…...

秋招Day11 - JVM - 类加载机制
了解类的加载机制吗? JVM是运行Java字节码,也就是运行.class文件的虚拟机,JVM把.class文件中描述类的数据结构加载到内存中,并对数据进行校验,解析和初始化,最终转化为JVM可以使用的类型(Klass…...

Webug4.0靶场通关笔记03- 第3关SQL注入之时间盲注(手注法+脚本法 两种方法)
目录 一、源码分析 1.分析闭合 2.分析输出 (1)查询成功 (2)查询失败 (3)SQL语句执行报错 二、第03关 延时注入 1.打开靶场 2.SQL手注 (1)盲注分析 (2…...
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums PostgreSQL 提供了两种重要的数据完整性检查机制:amcheck 扩展和 pg_checksums 工具。它们在功能定位、检查层次和使用场景上有显著区别。 核心对比概览 特性amcheckpg_checksums检查对象…...

Vert.x学习笔记-什么是Handler
Vert.x学习笔记 在Vert.x中,Handler是一个核心概念,用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一,通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口,定义如下&#…...
浏览器游戏的次世代革命:WebAssembly 3.0 实战指南
破局开篇:开发者必须跨越的性能鸿沟 在2025年,WebAssembly(WASM)技术已经成为高性能Web应用的核心驱动力。特别是WASM3引擎的广泛应用,使得在浏览器中实现主机级游戏画质成为可能。本文将深入探讨WASM3的关键特性、性…...
Java设计模式之工厂模式与策略模式简单案例学习
目录 1.前言2.工厂模式2.1 简单工厂方法2.2 静态工厂方法2.3 抽象工厂方法 3.策略模式4.区别与联系4.1定义与核心意图4.2 UML 结构对比4.3 关键组成对比4.4 应用场景对比 1.前言 最近接手的项目真的是太无语了,经历了多数人的编写,什么牛马鬼神写法都有&…...

【Echarts】象形图
目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…...
git 本地合并怎么撤回
在Git中,如果你已经执行了合并(merge)操作,但发现合并的结果不符合预期,你可以通过以下几种方式来撤销这次合并: 1. 使用git merge --abort 如果你在合并过程中还没有完成合并的提交(即合并冲…...

集星云推短视频矩阵系统的定制化与私有化部署方案
在当今数字化营销时代,短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性,为企业提供了全方位的解决方案。 一、API接口定制:无缝对接自有系统 集星云推短视频矩…...
npm run build 报错:Some chunks are larger than 500 KB after minification
当我们的 Vue 项目太大,使用 npm run build 打包项目的时候,就有可能会遇到以下报错: (!) Some chunks are larger than 500 kB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollup…...

XCTF-web-file_include
解析 <?php highlight_file(__FILE__); // 高亮显示当前PHP文件源代码 include("./check.php"); // 包含检查文件(可能包含安全过滤逻辑)if(isset($_GET[filename])) { // 检查是否传入filename参数$filename $_GET[f…...

5.28 后端面经
为什么golang在并发环境下更有优势 Go语言(Golang)在并发环境下的优势主要源自其设计哲学和内置的并发机制,这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析: 1. Goroutine:轻量…...

CPP中CAS std::chrono 信号量与Any类的手动实现
前言 CAS(Compare and Swap) 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数:内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时,CAS才会将内存位…...

PHP生成pdf方法
1:第一种方法: 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1:NPM【版本:9.2.0】 1.2:NODE【版本:v18.19.1】 1.3:puppeteer【npm in…...

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)
写在前面的话,为了保持Sceneform-EQR始终是采用最新的filament,每隔一段时间我都会编译filament,并根据新增内容完善Sceneform-EQR。 现由于更换电脑,环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…...

C#中的BeginInvoke和EndInvoke:异步编程的双剑客
文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…...

告别延迟!modbus tcp转profine网关助力改造电厂改造升级
发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电,您都需要提高运营效率,并在资产老化、资源萎缩的情况下,紧跟不断变化的法规。如今,智能系统和技术能够帮助您实现运营转型,提高可视性并实现关键流程自动…...