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

发布时间:2026/11/4 20:54:18

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:54:18

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

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

2026/11/4 20:54:18

生成式推荐:从打分到序列生成的排序模型新范式

从两段式打分到直接生成有序列表,推荐排序这件事正在换一套底层逻辑。我做了几年排序模型,之前一直用GBDT、DNN、双塔这一路判别式思路,直到最近系统性地梳理生成式推荐,才意识到排序模型的天花板可能不在特征和模型结构上&#x…

2026/11/4 20:54:18

SenseVoiceSmall语音合成模型本地部署实战指南

1. 项目背景与核心价值 去年在语音合成领域出现了一个很有意思的开源项目SenseVoice,这个由国内团队开发的语音模型因其轻量化和优秀的音质表现吸引了不少开发者的注意。最近他们推出了更小尺寸的SenseVoiceSmall版本,特别适合在消费级硬件上本地部署。我…

2026/11/4 21:50:23

葡萄酒质量评价完整方案:从数据清洗到分级建模的可复现流程

简介:本资源为2012年全国大学生数学建模竞赛A题《葡萄酒的评价》一等奖获奖论文全文,面向数学建模初学者、参赛学生及统计建模实践者,聚焦主观评价类问题的量化建模与理化指标驱动的质量评估方法。论文系统构建了涵盖显著性检验(K…

2026/11/4 21:50:23

AICDS 2026投稿指南:控制与AI交叉选题及实验避坑

1. 从热搜词看AICDS 2026的真实受众画像先把话说在前头:AICDS 2026这个会议标题本身信息量不大,三个词——人工智能、控制、数据科学——都是大帽子。但把热搜词摊开一看,参会和投稿的主力人群其实非常具体:一边是搞电机控制、FOC…

2026/11/4 21:50:23

大模型入门全攻略:从环境搭建到微调部署的完整路线

大模型这个词从2023年火到现在,热度不但没降,反而从“技术圈自嗨”变成了“全民都在聊”。但说实话,我接触过不少想入门的朋友,最大的问题不是不够聪明,而是一上来就被铺天盖地的名词砸晕了:Transformer、微…

2026/11/4 21:50:23

SolidWorks模型导入Unity的工程实践与优化技巧

1. 项目背景与核心价值 数字孪生技术正在彻底改变工业设计和产品开发流程。作为从业十余年的工业软件开发者,我发现将SolidWorks这类专业CAD模型无缝导入Unity引擎,已经成为智能制造、虚拟调试和产品展示领域的基础需求。不同于普通的3D模型转换&#xf…

2026/11/4 21:50:23

MiMo-V2.6双版本架构:API经济下的确定性推理工程

1. MiMo-V2.6不是“又一个大模型”,而是API经济下的精密工程重构最近刷到“小米发布并开源 MiMo-V2.6 系列,Pro 与 Flash 双版本,API 价格与前代持平”这条消息时,我第一反应不是点开看参数,而是立刻翻出上一代 MiMo-V…

2026/11/4 21:45:20

工业防护系统化:三维防御网络与动态风险评估

1. 工业防护为何需要系统化思考 在金属加工车间里,我见过太多"头痛医头"的防护案例:操作工被飞溅的铁屑划伤就加装透明挡板,设备漏油导致滑倒事故就铺防滑垫。这种碎片化的改进就像给漏水的木桶不停打补丁,看似解决了眼…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* 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 0:03:20

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

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

2026/11/4 0:03:20

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

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

2026/11/4 0:03:20

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

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

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

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

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑