首页/新闻资讯/正文详情

50个SQL查询实战案例:从基础到高级应用

发布时间:2026/11/4 20:53:41 来源:云帆数科 栏目:资讯中心
50个SQL查询实战案例:从基础到高级应用
1. SQL查询技能提升的必要性在数据驱动的时代SQL作为关系型数据库的标准查询语言其重要性不言而喻。无论是数据分析师、后端开发工程师还是产品经理掌握SQL查询技能都能极大提升工作效率。我见过太多职场新人因为SQL基础薄弱而影响工作进度也见证过SQL高手如何通过一个精妙的查询节省数小时的人工分析时间。SQL学习最难的不是语法本身而是如何将业务需求转化为有效的查询语句。很多教程只讲解语法规则却缺少真实场景的案例演示。这正是我整理这50个常用查询案例的初衷——通过实际问题带大家理解SQL的思维方式。2. 基础查询案例解析2.1 单表基础查询我们从最简单的单表查询开始这是所有复杂查询的基础。假设我们有一个员工表employees-- 案例1查询所有员工信息 SELECT * FROM employees; -- 案例2查询特定列避免SELECT * 的生产环境实践 SELECT employee_id, first_name, last_name FROM employees; -- 案例3使用WHERE条件过滤 SELECT * FROM employees WHERE department IT; -- 案例4使用ORDER BY排序 SELECT * FROM employees ORDER BY hire_date DESC;注意在生产环境中尽量避免使用SELECT *明确列出需要的字段能减少网络传输和提高查询效率。2.2 条件查询进阶条件查询是SQL中最常用的功能之一掌握各种条件表达式至关重要-- 案例5多条件组合(AND/OR) SELECT * FROM employees WHERE department IT AND salary 8000; -- 案例6BETWEEN范围查询 SELECT * FROM employees WHERE salary BETWEEN 5000 AND 10000; -- 案例7IN操作符 SELECT * FROM employees WHERE department IN (IT, HR, Finance); -- 案例8LIKE模糊查询 SELECT * FROM employees WHERE last_name LIKE 张%;实操心得LIKE查询特别是前导通配符(%)会导致全表扫描大数据量表应考虑全文索引。3. 多表连接查询实战3.1 各种JOIN的区别与应用理解不同类型的JOIN是SQL进阶的关键-- 案例9INNER JOIN只返回匹配的记录 SELECT e.employee_id, e.last_name, d.department_name FROM employees e INNER JOIN departments d ON e.department_id d.department_id; -- 案例10LEFT JOIN保留左表所有记录 SELECT e.employee_id, e.last_name, d.department_name FROM employees e LEFT JOIN departments d ON e.department_id d.department_id; -- 案例11RIGHT JOIN保留右表所有记录 SELECT e.employee_id, e.last_name, d.department_name FROM employees e RIGHT JOIN departments d ON e.department_id d.department_id; -- 案例12FULL OUTER JOIN返回所有记录 SELECT e.employee_id, e.last_name, d.department_name FROM employees e FULL OUTER JOIN departments d ON e.department_id d.department_id;注意事项实际工作中LEFT JOIN使用频率最高RIGHT JOIN较少见FULL OUTER JOIN部分数据库不支持。3.2 多表连接复杂案例-- 案例13三表连接查询 SELECT e.employee_id, e.last_name, d.department_name, l.city FROM employees e JOIN departments d ON e.department_id d.department_id JOIN locations l ON d.location_id l.location_id; -- 案例14自连接查询查询员工及其经理 SELECT e.employee_id, e.last_name, m.last_name AS manager_name FROM employees e LEFT JOIN employees m ON e.manager_id m.employee_id;4. 聚合函数与分组查询4.1 常用聚合函数-- 案例15基本聚合函数 SELECT COUNT(*) AS employee_count, AVG(salary) AS avg_salary, MAX(salary) AS max_salary, MIN(salary) AS min_salary, SUM(salary) AS total_salary FROM employees; -- 案例16GROUP BY分组 SELECT department, COUNT(*) AS employee_count, AVG(salary) FROM employees GROUP BY department; -- 案例17HAVING过滤分组 SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) 5;关键区别WHERE过滤行HAVING过滤分组。4.2 高级分组技巧-- 案例18GROUPING SETS多维度分组 SELECT department, job_title, COUNT(*) FROM employees GROUP BY GROUPING SETS ( (department, job_title), (department), (job_title), () ); -- 案例19ROLLUP层级分组 SELECT department, job_title, COUNT(*) FROM employees GROUP BY ROLLUP (department, job_title); -- 案例20CUBE所有组合分组 SELECT department, job_title, COUNT(*) FROM employees GROUP BY CUBE (department, job_title);5. 子查询与CTE应用5.1 各种子查询类型-- 案例21WHERE子句中的子查询 SELECT * FROM employees WHERE salary (SELECT AVG(salary) FROM employees); -- 案例22FROM子句中的子查询 SELECT dept_avg.department, dept_avg.avg_salary FROM ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) dept_avg WHERE dept_avg.avg_salary 8000; -- 案例23SELECT子句中的子查询 SELECT employee_id, last_name, salary, (SELECT AVG(salary) FROM employees) AS company_avg FROM employees;5.2 公共表表达式(CTE)-- 案例24简单CTE WITH dept_stats AS ( SELECT department, AVG(salary) AS avg_salary FROM employees GROUP BY department ) SELECT * FROM dept_stats WHERE avg_salary 8000; -- 案例25递归CTE查询组织架构 WITH RECURSIVE org_chart AS ( -- 基础查询找出所有没有经理的员工顶级管理者 SELECT employee_id, last_name, manager_id, 1 AS level FROM employees WHERE manager_id IS NULL UNION ALL -- 递归查询找出每个员工的下属 SELECT e.employee_id, e.last_name, e.manager_id, oc.level 1 FROM employees e JOIN org_chart oc ON e.manager_id oc.employee_id ) SELECT * FROM org_chart ORDER BY level, employee_id;6. 窗口函数高级应用6.1 排名函数-- 案例26ROW_NUMBER连续排名 SELECT employee_id, last_name, salary, ROW_NUMBER() OVER (ORDER BY salary DESC) AS salary_rank FROM employees; -- 案例27RANK并列排名会跳过名次 SELECT employee_id, last_name, salary, RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees; -- 案例28DENSE_RANK并列排名不跳过名次 SELECT employee_id, last_name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS salary_rank FROM employees;6.2 分析函数-- 案例29部门内薪资排名 SELECT employee_id, last_name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank FROM employees; -- 案例30计算移动平均 SELECT order_date, amount, AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg FROM sales; -- 案例31计算累计和 SELECT employee_id, month, sales, SUM(sales) OVER (PARTITION BY employee_id ORDER BY month) AS cumulative_sales FROM employee_sales;7. 数据修改操作7.1 插入数据-- 案例32基本INSERT INSERT INTO employees (employee_id, first_name, last_name, email) VALUES (1001, John, Doe, john.doeexample.com); -- 案例33插入多行数据 INSERT INTO employees (employee_id, first_name, last_name, email) VALUES (1002, Jane, Smith, jane.smithexample.com), (1003, Robert, Johnson, robert.johnsonexample.com); -- 案例34从查询结果插入 INSERT INTO employee_archive SELECT * FROM employees WHERE hire_date 2010-01-01;7.2 更新与删除-- 案例35基本UPDATE UPDATE employees SET salary salary * 1.05 WHERE department IT; -- 案例36使用JOIN更新 UPDATE employees e SET e.salary e.salary * 1.1 FROM departments d WHERE e.department_id d.department_id AND d.location New York; -- 案例37条件DELETE DELETE FROM employees WHERE hire_date 2000-01-01 AND performance_rating 3;8. 事务与并发控制8.1 事务基本操作-- 案例38显式事务 BEGIN TRANSACTION; UPDATE accounts SET balance balance - 1000 WHERE account_id 123; UPDATE accounts SET balance balance 1000 WHERE account_id 456; -- 如果执行到这里没有错误 COMMIT; -- 如果出现错误 -- ROLLBACK;8.2 隔离级别与锁-- 案例39设置隔离级别 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 案例40显式加锁 SELECT * FROM orders WHERE order_date 2023-01-01 FOR UPDATE; -- 排他锁9. 索引优化与查询性能9.1 索引创建与使用-- 案例41创建索引 CREATE INDEX idx_employees_department ON employees(department); -- 案例42复合索引 CREATE INDEX idx_employees_name ON employees(last_name, first_name); -- 案例43查看查询执行计划 EXPLAIN SELECT * FROM employees WHERE last_name Smith;9.2 查询优化技巧-- 案例44避免全表扫描 -- 不好的写法 SELECT * FROM employees WHERE YEAR(hire_date) 2020; -- 优化写法 SELECT * FROM employees WHERE hire_date BETWEEN 2020-01-01 AND 2020-12-31; -- 案例45LIMIT分页优化 -- 低效写法偏移量大时 SELECT * FROM employees ORDER BY employee_id LIMIT 10000, 20; -- 高效写法使用WHERE替代OFFSET SELECT * FROM employees WHERE employee_id 10000 ORDER BY employee_id LIMIT 20;10. 高级SQL特性10.1 存储过程与函数-- 案例46创建存储过程 DELIMITER // CREATE PROCEDURE raise_salary(IN dept VARCHAR(50), IN percent DECIMAL(5,2)) BEGIN UPDATE employees SET salary salary * (1 percent/100) WHERE department dept; END // DELIMITER ; -- 调用存储过程 CALL raise_salary(IT, 5.0); -- 案例47创建函数 CREATE FUNCTION get_employee_count(dept VARCHAR(50)) RETURNS INT BEGIN DECLARE emp_count INT; SELECT COUNT(*) INTO emp_count FROM employees WHERE department dept; RETURN emp_count; END; -- 使用函数 SELECT get_employee_count(IT);10.2 触发器应用-- 案例48创建触发器 CREATE TRIGGER before_employee_update BEFORE UPDATE ON employees FOR EACH ROW BEGIN IF NEW.salary OLD.salary THEN SIGNAL SQLSTATE 45000 SET MESSAGE_TEXT Salary cannot be decreased; END IF; END;10.3 视图与物化视图-- 案例49创建视图 CREATE VIEW employee_details AS SELECT e.employee_id, e.last_name, d.department_name, l.city FROM employees e JOIN departments d ON e.department_id d.department_id JOIN locations l ON d.location_id l.location_id; -- 使用视图 SELECT * FROM employee_details WHERE city New York; -- 案例50物化视图不同数据库实现不同 -- MySQL示例 CREATE TABLE employee_details_mv AS SELECT e.employee_id, e.last_name, d.department_name, l.city FROM employees e JOIN departments d ON e.department_id d.department_id JOIN locations l ON d.location_id l.location_id; -- 定期刷新 TRUNCATE TABLE employee_details_mv; INSERT INTO employee_details_mv SELECT e.employee_id, e.last_name, d.department_name, l.city FROM employees e JOIN departments d ON e.department_id d.department_id JOIN locations l ON d.location_id l.location_id;11. SQL实战经验分享在实际工作中我发现有几个常见的SQL陷阱需要特别注意NULL值处理NULL与任何值的比较结果都是NULL而非FALSE这经常导致查询结果不符合预期。正确的做法是使用IS NULL或IS NOT NULL判断或者使用COALESCE函数提供默认值。-- 错误写法 SELECT * FROM employees WHERE commission_pct NULL; -- 不会返回任何结果 -- 正确写法 SELECT * FROM employees WHERE commission_pct IS NULL;日期时间处理不同数据库的日期函数差异很大建议使用标准SQL的日期函数避免数据库特定的函数。-- 标准SQL写法大多数数据库支持 SELECT * FROM orders WHERE order_date CURRENT_DATE - INTERVAL 30 DAY; -- 避免使用数据库特定函数如MySQL的DATE_SUB()JOIN性能优化多表JOIN时应该从小表驱动大表并确保JOIN条件上有适当的索引。EXPLAIN命令是分析查询性能的利器。批量操作当需要处理大量数据时批量操作比单条操作效率高得多。例如批量INSERT可以显著减少I/O操作。-- 低效 INSERT INTO table VALUES (1, A); INSERT INTO table VALUES (2, B); INSERT INTO table VALUES (3, C); -- 高效 INSERT INTO table VALUES (1, A), (2, B), (3, C);事务粒度事务不应该过长应该尽快提交释放锁资源。但同时也要确保事务包含完整的业务逻辑单元。最后SQL技能需要通过大量实践来掌握。建议读者在自己的数据库环境里运行这些案例尝试修改参数观察结果变化并针对自己的业务数据设计类似的查询。记住写出能工作的SQL只是第一步写出高效、可维护的SQL才是专业水准。

相关推荐

零基础强化学习数学入门:从状态动作奖励到贝尔曼方程
零基础强化学习数学入门:从状态动作奖励到贝尔曼方程

简介:《强化学习的数学原理》是西湖大学赵世钰教授撰写的纯英文专著,面向具备一定数学基础、希望从零系统理解强化学习理论的学习者与研究人员。全书以数学推导为主线,结合网格世界等示例,依次讲解基本概念、状态值与贝尔曼方程、… · 2026/11/4 20:53:41

Garmin数据大屏实战:Marvis+微信云开发搭建指南
Garmin数据大屏实战:Marvis+微信云开发搭建指南

1. Marvis 是什么,它凭什么能驱动佳明数据大屏?Marvis 不是某个开源库、不是某款商业BI工具,更不是微信生态里的标准组件——它是 Garmin(佳明)用户圈里自发沉淀出来的一套非官方数据解析与可视化协议栈。准确说&#… · 2026/11/4 20:52:39

残差流与J-Space:LLM可解释性的向量几何基础
残差流与J-Space:LLM可解释性的向量几何基础

1. 为什么“残差流”成了打开 LLM 黑箱的第一把钥匙?你有没有试过把一个训练好的大语言模型像拆解一台精密钟表一样,一层层拨开它的内部结构,去看它到底在哪个位置、以什么方式“想”出了那句回答?不是靠事后归因、不是靠扰动测试… · 2026/11/4 20:52:39

电商推荐系统AI技术应用与工程实践
电商推荐系统AI技术应用与工程实践

1. 电商推荐系统的现状与挑战 去年双十一期间,某头部电商平台的推荐系统崩溃事件引发了行业广泛讨论。当时系统在流量峰值时出现响应延迟,导致个性化推荐失效,直接影响了数亿用户的购物体验。这个案例暴露出传统推荐系统在面对海量用户时的局… · 2026/11/4 21:35:20

认知雷达中的贝叶斯非参数学习与主动探测策略
认知雷达中的贝叶斯非参数学习与主动探测策略

1. 项目背景与核心概念解析 认知雷达贝叶斯非参数学习是一个融合了信号处理、机器学习与决策理论的交叉领域研究方向。这个标题中提到的"狄利克雷过程驱动的感知-行动循环深化"听起来很学术,但拆解开来其实描述的是一个动态调整的智能感知系统。就像人类在… · 2026/11/4 21:35:20

Three.js+Vue大屏架构重构:从二维看板到三维空间操作系统
Three.js+Vue大屏架构重构:从二维看板到三维空间操作系统

1. 这不是传统大屏开发,而是一次渲染架构的重新定义最近在给一个省级智慧园区项目做可视化系统时,我彻底放弃了沿用五年的“Vue ECharts 百度地图”老三件套。不是它们不好,而是当需求从“展示10个指标卡片3张折线图”升级为“实时加载20万… · 2026/11/4 21:35:20

GreatSQL数据库实验避坑指南:CentOS7环境搭建与SQL实战
GreatSQL数据库实验避坑指南:CentOS7环境搭建与SQL实战

简介:本资源是郑州大学计算机与人工智能学院《数据库系统原理》课程配套的完整实验报告,面向高校数据库初学者、课程实践者及国产数据库(GreatSQL)学习者,聚焦DBMS系统认知、国产数据库部署实操与规范实验文档撰写三大… · 2026/11/4 21:35:20

2026年Java面试题库深度拆解:从背题到构建知识网络的高分策略
2026年Java面试题库深度拆解:从背题到构建知识网络的高分策略

1. 面试题库背后的真实需求拆解每年到了招聘旺季,各类“大厂面试题库”就开始在圈子里疯传。我见过太多人把题库当成救命稻草,打印出来从头背到尾,结果一进面试间,面试官换个问法就当场卡壳。这份“2026年Java面试题库”之所以被冠… · 2026/11/4 21:35:20

AI Agent知识获取管道:RAG工程化落地的七步验证法
AI Agent知识获取管道:RAG工程化落地的七步验证法

1. 为什么“知识获取管道”是AI Agent的命脉,而不是可有可无的插件很多人刚接触AI Agent时,第一反应是:“不就是让大模型调用几个工具、写点代码、发个邮件吗?”——这恰恰踩进了最典型的认知陷阱。我带过三轮Agent开发训练营&… · 2026/11/4 21:34:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码