news 2026/7/17 10:51:22

SQL核心语法总结:从基础操作到高级窗口函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL核心语法总结:从基础操作到高级窗口函数

目录

  • SQL核心语法总结:从基础操作到高级窗口函数
    • 一、数据插入:INSERT IGNORE INTO & REPLACE INTO
    • 二、字符串处理函数
      • 1. 基础长度与替换
      • 2. 字符串截取
        • (1)通用截取:SUBSTRING
        • (2)定向截取:LEFT/RIGHT
    • 三、条件判断:CASE表达式
      • 1. 简单CASE表达式(匹配字段值)
      • 2. 搜索CASE表达式(更灵活,匹配条件)
    • 四、存在性查询:EXISTS/NOT EXISTS
      • 基本语法
    • 五、高级分析:窗口函数OVER()
      • 1. 基本语法
      • 2. 三大核心组件
      • 3. 常见窗口函数分类
        • (1)聚合窗口函数
        • (2)排名窗口函数
        • (3)取值窗口函数
      • 4. 窗口函数经典场景
        • (1)累计占比计算
        • (2)移动窗口计算(如7天移动平均)
        • (3)获取每组最新记录
    • 六、易混淆点:SUM() OVER(ORDER BY) vs SUM() + GROUP BY + ORDER BY
    • 七、补充:GROUP_CONCAT() 语法注意
    • 总结

SQL核心语法总结:从基础操作到高级窗口函数

SQL作为数据处理的核心语言,掌握其常用语法和高级特性是数据分析、开发的必备技能。本文将系统梳理SQL高频语法,涵盖数据插入、字符串处理、条件判断、存在性查询、窗口函数等核心知识点,结合示例帮你快速理解和应用。

一、数据插入:INSERT IGNORE INTO & REPLACE INTO

在数据插入场景中,针对“重复数据”的处理有两种常用语法,核心差异如下:

语法逻辑
INSERT IGNORE INTO插入数据时,若记录已存在(主键/唯一索引冲突)则忽略,不存在则正常插入
REPLACE INTO插入数据时,若记录已存在则先删除原有记录,再插入新记录;不存在则正常插入

二、字符串处理函数

SQL提供丰富的字符串操作函数,以下是高频使用的几个:

1. 基础长度与替换

  • LENGTH(string):获取字符串的长度
  • REPLACE(string, 'old_value', 'new_value'):替换字符串内容
    示例:REPLACE(col, ',', ' ')将字段中的英文逗号替换为空格

2. 字符串截取

(1)通用截取:SUBSTRING
-- 两种标准语法SUBSTRING(string,start,length)SUBSTRING(stringFROMstartFORlength)
(2)定向截取:LEFT/RIGHT
-- 从左侧提取指定数量字符LEFT(string,number_of_chars)-- 从右侧提取指定数量字符RIGHT(string,number_of_chars)

三、条件判断:CASE表达式

CASE表达式是SQL中的条件判断语句,类比编程语言的if-else/switch-case,分两种语法形式:

1. 简单CASE表达式(匹配字段值)

CASEcolumn_nameWHENvalue1THENresult1WHENvalue2THENresult2...ELSEdefault_resultEND

2. 搜索CASE表达式(更灵活,匹配条件)

CASEWHENcondition1THENresult1WHENcondition2THENresult2...ELSEdefault_resultEND

示例:根据分数分级

SELECTscore,CASEWHENscore>=90THEN'优秀'WHENscore>=80THEN'良好'ELSE'及格'ENDASgradeFROMstudent;

四、存在性查询:EXISTS/NOT EXISTS

EXISTS是逻辑运算符,用于检查子查询是否至少返回一行数据,常用来替代IN提升查询效率(尤其大数据量)。

基本语法

-- 存在匹配结果则返回主查询数据SELECTcolumn1,column2FROMtable1WHEREEXISTS(subquery);-- 无匹配结果则返回主查询数据SELECTcolumn1,column2FROMtable1WHERENOTEXISTS(subquery);

示例:查询未关联部门的员工

SELECT*FROMemployeesWHERENOTEXISTS(SELECTemp_noFROMdept_empWHEREdept_emp.emp_no=employees.emp_no);

五、高级分析:窗口函数OVER()

OVER()是窗口函数的核心,用于在一组行(窗口)上执行计算,且保留原始行数据(区别于GROUP BY的汇总折叠),是SQL高级分析的核心工具。

1. 基本语法

聚合函数/窗口函数OVER([PARTITIONBY分区字段]-- 按字段分组,组内独立计算[ORDERBY排序字段]-- 窗口内行的排序规则[ROWS/RANGE 框架子句]-- 定义窗口的具体行范围)

2. 三大核心组件

组件作用
PARTITION BY分区:将数据按指定字段分组,每个分组独立计算(类比GROUP BY,但不折叠行)
ORDER BY排序:确定窗口内行的顺序,用于累计计算、排名等
ROWS/RANGE窗口框架:限定计算的行范围(如“最近3行”“前N行到当前行”)

3. 常见窗口函数分类

(1)聚合窗口函数

基于窗口计算聚合值,保留原始行:

-- 示例:计算每个部门的平均薪资,保留员工明细SELECTname,department,salary,AVG(salary)OVER(PARTITIONBYdepartment)ASdept_avg_salaryFROMemployees;

常用聚合窗口函数:SUM() OVER()AVG() OVER()COUNT() OVER()MAX() OVER()MIN() OVER()

(2)排名窗口函数

用于分组内排序,核心差异如下:

函数名特性示例结果(分数:95、90、90、85)
ROW_NUMBER()分组内生成唯一连续行号,无并列1、2、3、4
RANK()并列名次重复,后续名次跳号(如1、2、2、4)1、2、2、4
DENSE_RANK()并列名次重复,后续名次连续(如1、2、2、3)1、2、2、3
PERCENT_RANK按公式(rank-1)/(rows-1)计算相对排名,结果0~10.0、0.33、0.33、1.0
CUME_DIST分组内≤当前值的行数/总行数,结果0~10.25、0.75、0.75、1.0

示例:薪资排名

SELECTemp_name,salary,ROW_NUMBER()OVER(ORDERBYsalaryDESC)ASrow_num,RANK()OVER(ORDERBYsalaryDESC)ASrankFROMemployees;
(3)取值窗口函数

用于获取窗口内指定位置的行数据:

  • LAG(column, n):获取当前行前n行的字段值
  • LEAD(column, n):获取当前行后n行的字段值
  • FIRST_VALUE(column):窗口内第一个值
  • LAST_VALUE(column):窗口内最后一个值

示例:对比每日销售额与前一日

SELECTdate,sales,LAG(sales,1)OVER(ORDERBYdate)ASprev_day_sales,sales-LAG(sales,1)OVER(ORDERBYdate)ASdaily_changeFROMdaily_sales;

4. 窗口函数经典场景

(1)累计占比计算
SELECTdate,sales,SUM(sales)OVER(ORDERBYdate)ASrunning_total,-- 累计销售额ROUND(100.0*SUM(sales)OVER(ORDERBYdate)/SUM(sales)OVER(),2)AScum_percentage-- 累计占比FROMdaily_sales;
(2)移动窗口计算(如7天移动平均)
SELECTdate,sales,AVG(sales)OVER(ORDERBYdateROWSBETWEEN6PRECEDINGANDCURRENTROW-- 包含当前行及前6行)ASmoving_avg_7dFROMdaily_sales;
(3)获取每组最新记录
-- 示例:获取每个用户最后一次登录的客户端信息SELECTu_n,c_n,dateFROM(SELECTu.nameasu_n,c.nameasc_n,l.date,row_number()over(partitionbyu.idorderbydatedesc)asrk-- 按用户分区,按时间降序排名FROMlogin ljoinuseruonl.user_id=u.idjoinclient conc.id=l.client_id)sWHERErk=1-- 取排名1(最新)的记录ORDERBYu_n;

六、易混淆点:SUM() OVER(ORDER BY) vs SUM() + GROUP BY + ORDER BY

初学者常混淆累计求和与分组求和,核心差异如下:

特性SUM() OVER(ORDER BY date)SUM(sales) GROUP BY date ORDER BY date
返回行数原始行数(保留明细)分组行数(仅汇总行)
计算逻辑累计求和(运行总和)分组求和(单组独立值)
结果示例100、250、450(累计)100、150、200(每日单独值)
适用场景趋势分析、累计占比分组汇总、单维度统计

七、补充:GROUP_CONCAT() 语法注意

MySQL中使用GROUP_CONCAT()时,别名尽量避免直接使用引号(部分版本/配置会报错),优先使用无引号或反引号(`)包裹别名。

总结

  1. 数据插入优先根据“重复数据处理逻辑”选择INSERT IGNORE INTOREPLACE INTO
  2. 字符串处理掌握LENGTH/REPLACE/SUBSTRING/LEFT/RIGHT即可覆盖大部分场景;
  3. 条件判断用CASE表达式,灵活处理多分支逻辑;
  4. 存在性查询优先用EXISTS替代IN,提升大数据量查询效率;
  5. 窗口函数OVER()是高级分析核心,掌握PARTITION BY/ORDER BY/ROWS三大组件,可实现累计、排名、移动计算等复杂分析;
  6. 区分SUM() OVER(ORDER BY)(累计)与GROUP BY(分组汇总)的核心差异,避免用错场景。

掌握以上语法,可覆盖从基础数据操作到高级数据分析的绝大部分SQL使用场景,建议结合实际业务场景多练习,加深理解。

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

Langchain-Chatchat实现财务制度智能问答机器人

Langchain-Chatchat实现财务制度智能问答机器人 在企业日常运营中,员工频繁面临诸如“差旅住宿标准是多少?”“海外预支款如何申请?”这类看似简单却难以快速定位答案的问题。传统做法是翻阅冗长的PDF文件、查阅内部邮件或反复咨询财务人员&a…

作者头像 李华
网站建设 2026/7/14 11:39:17

Langchain-Chatchat冷启动阶段的知识库构建建议

Langchain-Chatchat冷启动阶段的知识库构建建议 在企业数字化转型的浪潮中,知识不再只是文档的堆砌,而是驱动效率的核心资产。然而,现实往往令人沮丧:员工翻遍共享盘也找不到一份报销标准,新入职的同事反复询问年假政策…

作者头像 李华
网站建设 2026/7/16 11:02:07

Langchain-Chatchat支持多轮对话吗?会话状态管理实现方法

Langchain-Chatchat 的多轮对话能力与会话状态管理实践 在企业级 AI 应用日益普及的今天,一个智能问答系统是否“聪明”,早已不再仅看它能否准确回答单个问题,而是更关注它能不能像人一样理解上下文、记住前面对话内容,并在此基础…

作者头像 李华
网站建设 2026/7/16 3:53:44

FaceFusion如何处理眼镜反光影响识别准确率?

FaceFusion如何处理眼镜反光影响识别准确率?在机场安检通道前,一位戴着眼镜的旅客正对准人脸识别摄像头。突然,头顶的环形灯在镜片上打出一圈刺眼的高光——眼睛区域几乎完全被白色亮斑覆盖。传统系统大概率会提示“识别失败”,要…

作者头像 李华
网站建设 2026/7/16 22:28:58

【课程设计/毕业设计】基于Java+springboot小学学生托管管理系统基于springboot的中小学生课后服务管理系统【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/7/17 7:28:44

37、半群短时渐近性与官僚化世界困境解析

半群短时渐近性与官僚化世界困境解析 在科学研究领域,半群的短时渐近性研究有着重要的理论价值,而在社会层面,官僚化问题正深刻影响着各个领域的发展。下面我们将深入探讨这两方面的内容。 半群核的短时渐近性 核 $𝐺_0(𝑥 - 𝑦, 𝑡)$ 在 $𝑡↓0$ 时会呈指数衰…

作者头像 李华