这 10 个 MySQL 高级用法,能让你的 SQL 更高效、更优雅
在日常开发中,很多 MySQL 查询**“能跑就行”,但在数据量变大、逻辑变复杂后,SQL 的可读性、性能和可维护性**就会迅速成为瓶颈。
本文结合真实业务场景,总结10 个 MySQL 高级用法,不仅能显著提升查询效率,还能让 SQL 看起来更像“工程代码”而不是“脚本拼接”。
⚠️ 说明:以下示例默认基于MySQL 8.0+(窗口函数、CTE 等特性需 8.0)
1️⃣ CTE(WITH 子句)—— 让复杂查询变得清晰可维护
问题场景:
多层子查询嵌套,SQL 可读性极差,维护成本高。
❌ 传统写法(嵌套地狱)
SELECT * FROM ( SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ) t JOIN users u ON t.user_id = u.id WHERE order_count > 5;✅ CTE 写法(推荐)
WITH user_order_counts AS ( SELECT user_id, COUNT(*) AS order_count FROM orders GROUP BY user_id ) SELECT u.name, u.email, uoc.order_count FROM users u JOIN user_order_counts uoc ON u.id = uoc.user_id WHERE uoc.order_count > 5;优势总结:
- 逻辑分层清晰
- 子查询可复用
- 更适合复杂统计和报表 SQL
2️⃣ 窗口函数 —— 不分组也能做统计与排名
窗口函数解决了一个经典痛点:
👉“既要统计,又要保留原始行”
SELECT name, department, salary, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank, AVG(salary) OVER (PARTITION BY department) AS dept_avg_salary, salary / SUM(salary) OVER (PARTITION BY department) * 100 AS salary_percentage FROM employees;典型应用:
- 排名(Top N)
- 同比 / 环比(LAG / LEAD)
- 占比分析
3️⃣ 条件聚合 —— 一条 SQL 搞定多种统计
SELECT COUNT(*) AS total_users, SUM(status = 'active') AS active_users, SUM(status = 'inactive') AS inactive_users, AVG(age) AS avg_age, MAX(CASE WHEN gender = 'M' THEN age END) AS max_male_age, MIN(CASE WHEN gender = 'F' THEN age END) AS min_female_age FROM users;✅比多次查询更高效
✅适合报表 & 运营统计
4️⃣ 自连接 —— 一张表表达层级与关系
同部门员工
SELECT e1.name AS employee1, e2.name AS employee2, e1.department FROM employees e1 JOIN employees e2 ON e1.department = e2.department AND e1.id < e2.id;