一、基础查询类模板
1.1 单表精确查询
-- 基础查询模板:带条件筛选的精确查询SELECTcolumn1, column2, ..., columnNFROMtable_nameWHEREcondition1 AND condition2ORDER BYcolumn_name [ASC|DESC]LIMIT [offset,] row_count;
典型场景:用户信息查询、订单状态筛选。建议对WHERE条件中的字段建立索引,特别是等值查询字段。
1.2 模糊查询优化
-- 模糊查询模板:使用LIKE与全文索引SELECTproduct_name, priceFROMproductsWHEREproduct_name LIKE '%手机%'-- 或使用全文索引(需数据库支持)-- MATCH(product_name) AGAINST('手机' IN NATURAL LANGUAGE MODE)LIMIT 100;
性能提示:当模糊查询字段数据量超过10万条时,建议改用全文索引或专用搜索引擎。
二、聚合计算类模板
2.1 基础聚合统计
-- 多维度聚合统计模板SELECTdepartment_id,COUNT(*) AS employee_count,AVG(salary) AS avg_salary,MAX(salary) AS max_salary,SUM(salary) AS total_salaryFROMemployeesGROUP BYdepartment_idHAVINGCOUNT(*) > 5; -- 分组后筛选
扩展应用:可结合ROLLUP实现多级汇总,或使用CUBE生成所有维度组合。
2.2 动态时间聚合
-- 按时间周期聚合模板(支持日/周/月)SELECTCASEWHEN DATE_TRUNC('day', order_date) = order_date THEN '日'WHEN DATE_TRUNC('week', order_date) = order_date THEN '周'WHEN DATE_TRUNC('month', order_date) = order_date THEN '月'END AS time_granularity,SUM(amount) AS total_amountFROMordersWHEREorder_date BETWEEN '2024-01-01' AND '2024-12-31'GROUP BYtime_granularity,-- 日粒度分组CASE WHEN DATE_TRUNC('day', order_date) = order_date THEN DATE_TRUNC('day', order_date) END,-- 周粒度分组CASE WHEN DATE_TRUNC('week', order_date) = order_date THEN DATE_TRUNC('week', order_date) END,-- 月粒度分组CASE WHEN DATE_TRUNC('month', order_date) = order_date THEN DATE_TRUNC('month', order_date) ENDORDER BYtime_granularity, order_date;
三、多表关联类模板
3.1 标准JOIN操作
-- 三表关联查询模板SELECTo.order_id,c.customer_name,p.product_name,o.quantity,o.unit_priceFROMorders oINNER JOINcustomers c ON o.customer_id = c.customer_idINNER JOINproducts p ON o.product_id = p.product_idWHEREo.order_date > '2024-01-01';
关联建议:对于大表关联,确保关联字段有索引,且关联顺序符合数据分布特征。
3.2 递归查询实现
-- 递归查询组织架构(支持无限层级)WITH RECURSIVE org_tree AS (-- 基础查询:获取顶级节点SELECTemployee_id,manager_id,name,1 AS levelFROMemployeesWHEREmanager_id IS NULLUNION ALL-- 递归部分:获取下级节点SELECTe.employee_id,e.manager_id,e.name,ot.level + 1FROMemployees eJOINorg_tree ot ON e.manager_id = ot.employee_id)SELECTLPAD(' ', 4*(level-1)) || name AS org_path,employee_id,levelFROMorg_treeORDER BYorg_path;
四、高级分析模板
4.1 窗口函数应用
-- 排名与移动平均计算SELECTproduct_id,sale_date,daily_sales,-- 累计销售额SUM(daily_sales) OVER (PARTITION BY product_idORDER BY sale_dateROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_sales,-- 7日移动平均AVG(daily_sales) OVER (PARTITION BY product_idORDER BY sale_dateROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS moving_avg,-- 行业排名RANK() OVER (PARTITION BY sale_dateORDER BY daily_sales DESC) AS daily_rankFROMproduct_sales;
4.2 动态SQL生成
-- 动态列查询实现(需数据库支持)-- 示例1:使用存储过程动态构建SQLCREATE PROCEDURE get_dynamic_report(IN date_range VARCHAR(100),IN metrics_list VARCHAR(1000))BEGINSET @sql = CONCAT('SELECTdate_column,', metrics_list, 'FROMsales_dataWHEREdate_column IN (', date_range, ')');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;END;-- 示例2:应用层拼接SQL(需防范注入)// Java示例代码String metrics = "SUM(sales) as total_sales, COUNT(*) as order_count";String dateFilter = "'2024-01-01','2024-01-31'";String sql = String.format("SELECT product_id, %s FROM sales WHERE date_column IN (%s) GROUP BY product_id",metrics, dateFilter);
五、性能优化模板
5.1 查询重写优化
-- 优化前:子查询导致全表扫描SELECTo.order_id,(SELECT name FROM customers WHERE customer_id = o.customer_id) AS customer_nameFROMorders oWHEREo.order_date > '2024-01-01';-- 优化后:改用JOIN提升性能SELECTo.order_id,c.name AS customer_nameFROMorders oJOINcustomers c ON o.customer_id = c.customer_idWHEREo.order_date > '2024-01-01';
5.2 分页查询优化
-- 传统LIMIT分页(大数据量时性能差)SELECT * FROM large_table ORDER BY id LIMIT 100000, 20;-- 优化方案1:使用索引覆盖+延迟关联SELECTt.*FROMlarge_table tJOIN (SELECT id FROM large_table ORDER BY id LIMIT 100000, 20) tmp ON t.id = tmp.id;-- 优化方案2:使用游标分页(适合ID连续场景)SELECT * FROM large_table WHERE id > last_seen_id ORDER BY id LIMIT 20;
六、最佳实践建议
- 模板管理:建立企业级SQL模板库,按业务领域分类管理
- 参数化设计:所有查询条件应支持参数化输入,避免SQL注入
- 版本控制:对核心查询语句进行版本管理,记录变更历史
- 性能基线:为关键查询建立性能基线,设置告警阈值
- 文档规范:每个模板需包含:
- 业务场景描述
- 输入参数说明
- 输出字段定义
- 性能注意事项
- 示例用法
通过系统化整理这20类核心查询模板,开发者可以构建起完整的数据查询知识体系。建议在实际项目中建立模板复用机制,结合代码生成工具实现查询语句的快速构建,同时通过执行计划分析持续优化查询性能。对于复杂业务场景,可考虑将多个模板组合使用,形成完整的数据处理流水线。