SQL语句规范书写

news/2025/3/12 12:42:09/文章来源:https://www.cnblogs.com/liyiyang/p/18717917

 SQL 编写规范核心原则

  1. 清晰易读:代码是给人看的,其次才是机器执行。

  2. 性能优先:避免低效语法,减少数据库负担。

  3. 安全可靠:防范 SQL 注入等风险。

  4. 统一风格:团队协作时保持格式一致。


✨ 格式规范

1. 关键字统一大写

-- 正确 ✅
SELECT id, name FROM users WHERE age > 18;-- 错误 ❌
select Id, Name from Users where age > 18;

2. 缩进与换行

  • 多行对齐:复杂语句换行缩进,用 2/4 空格(避免 Tab)

  • 子句换行SELECTFROMWHEREJOIN 等独立一行

 
SELECT u.id, u.name, o.order_date
FROM users AS u
INNER JOIN orders AS o ON u.id = o.user_id
WHERE u.status = 'active'AND o.total > 1000;

3. 表名与字段名

  • 表名:复数形式(如 users),小写 + 下划线(如 order_details

  • 字段名:小写 + 下划线(如 created_at


🔍 命名与别名规范

1. 别名明确性

  • 使用 AS 显式定义别名,避免歧义

 
-- 正确 ✅
SELECT u.id AS user_id,o.id AS order_id
FROM users AS u;-- 错误 ❌
SELECT u.id uid, o.id oid FROM users u;

2. 避免保留字

  • 不要用 nameordergroup 等保留字作为字段名(用 user_name 代替 name


⚡ 语法规范

1. 避免 SELECT *

-- 正确 ✅
SELECT id, name, email FROM users;-- 错误 ❌
SELECT * FROM users;

2. 显式 JOIN 代替隐式

-- 正确 ✅(显式 JOIN)
SELECT u.name, o.total
FROM users AS u
INNER JOIN orders AS o ON u.id = o.user_id;-- 错误 ❌(隐式 JOIN)
SELECT u.name, o.total
FROM users u, orders o
WHERE u.id = o.user_id;

3. 使用 IN 代替多个 OR

-- 正确 ✅
SELECT id FROM products WHERE category_id IN (1, 3, 5);-- 错误 ❌
SELECT id FROM products WHERE category_id = 1 OR category_id = 3 OR category_id = 5;

🚀 性能优化规范

1. 索引友好写法

  • 避免对索引列使用函数或运算:

 
-- 错误 ❌(索引失效)
SELECT * FROM users WHERE YEAR(created_at) = 2023;-- 正确 ✅
SELECT * FROM users WHERE created_at >= '2023-01-01' AND created_at < '2024-01-01';

2. 分页优化

  • 大数据分页用 WHERE + LIMIT 代替 OFFSET

 
-- 高效 ✅
SELECT * FROM orders 
WHERE id > 1000  -- 基于上次查询的最后一个 ID
ORDER BY id 
LIMIT 10;

3. 避免嵌套过深

  • 用 JOIN 或 WITH(CTE)代替多层子查询:

 
-- 正确 ✅(使用 CTE)
WITH active_users AS (SELECT id FROM users WHERE status = 'active'
)
SELECT * FROM orders 
WHERE user_id IN (SELECT id FROM active_users);

🔒 安全规范

  1. 参数化查询

    • 永远不要拼接 SQL 字符串,用预编译语句(如 MyBatis 的 #{}):

     
    -- MyBatis 示例 ✅
    SELECT * FROM users WHERE name = #{userName};

     

  2. 权限最小化

    • 禁止为应用账号分配 DROPGRANT 等高危权限。


📌 注释与文档

1. 关键逻辑注释

-- 统计每日活跃用户(排除测试账号)
SELECT DATE(login_time) AS day,COUNT(DISTINCT user_id) AS active_users
FROM user_logs
WHERE user_id NOT IN (SELECT id FROM test_users)  -- 过滤测试用户
GROUP BY day;

2. 复杂逻辑用 CTE 拆分

WITH 
monthly_sales AS (SELECT user_id,SUM(amount) AS total_amountFROM ordersWHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'GROUP BY user_id
)
SELECT u.name,ms.total_amount
FROM users AS u
INNER JOIN monthly_sales AS ms ON u.id = ms.user_id;

🛠️ 工具推荐

  1. SQL 格式化工具

    • SQL Formatter:在线美化 SQL 语句

    • Prettier(插件版):集成到 IDE 自动格式化

  2. 性能分析工具

    • EXPLAIN 命令(MySQL/PostgreSQL)

    • pgAdmin(PostgreSQL 性能监控)


🌟 总结

  • 格式统一:团队使用同一套规范(可配置 ESLint 或 EditorConfig)。

  • 性能敏感:关键查询必须通过 EXPLAIN 分析执行计划。

  • 安全第一:参数化查询 + 最小权限原则。

  • 持续优化:定期 Review SQL 代码,删除冗余或低效语句。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/884647.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Drasi Sources SDK

什么是Drasi数据源(Source)?Source提供了与系统的连接,Drasi 可以将这些系统视为变化源。source 在 Drasi 中执行三个重要功能:处理源系统生成的更改日志/源,并将这些更改推送到使用该源作为输入的每个连续查询。 将源更改数据转换为一致的属性图数据模型,以便订阅的 Co…

【每日一题】20250216

人生就是这样,不经历鲜血淋漓的疼痛,就不会明白那些曾经让我们厌烦的说教其实是受用一生的信条。【每日一题】(多选)如图所示,在竖直半面内有一半径为 \(R\) 的圆弧轨道.半径 \(OA\) 木平、\(OB\) 竖直,一个质量为 \(m\) 的小球自 \(A\) 的正上方 \(P\) 点由静止开始自由…

数据团队必读:智能数据分析文档(DataV Note)五种高效工作模式

数据项目,无论是数据分析、可视化,还是数据科学和机器学习相关的项目,通常都非常复杂,涉及多个组成部分,比如代码、数据、运行环境、SQL脚本以及分析报告等;与此同时,随着AI时代的到来,数据科学领域正经历重大变革。这对于数据科学团队来说,如何保持高效地工作模式一直…

SU镜像:缩放s

su没有镜像,可用:缩放s 选中要镜像的对象——复制一个——s——找到中间的点——向右拉动——输入 -1

LGP1377 [TJTS 2011] 树的序 学习笔记

LGP1377 [TJTS 2011] 树的序 学习笔记 Luogu Link 题意简述 给一个生成序列 \(p\),简单起见 \(p\) 是一个长为 \(n\) 的排列。按照这样的步骤生成一棵二叉搜索树:往空树中插入 \(p_i\),则 \(p_i\) 成为当前二叉搜索树的根。 往非空树 \(u\) 中插入 \(p_i\),若 \(p_i\) 小于…

vxe-input绑定keyup事件传递的参数

一、VUE3中 Input输入框绑定keyup事件传递的$event 代码一:<script setup>function judgeIsEnterToSerach(event){console.log(event,1111);console.log(event.key,2222);console.log(event.target,230923);console.log(event.target.value,3333);console.log(event.tar…

清华大学推出第二讲 DeepSeek 如何赋能职场应用?从提示语技巧到多场景应用!

前言 清华大学第二讲《DeepSeek如何赋能职场应用》是一份35页的专业文档,详细探讨了DeepSeek在职场中的多场景应用及其赋能作用,从提示语技巧到多场景应用,咱们打工人有福啦!DeepSeek访问地址:https://chat.deepseek.com 清华大学推出的 DeepSeek 从入门到精通(104页)免…

信创

概念 “信创“ (全称“信息技术应用创新”)是国家基于国产芯片和操作系统的PC、服务器、网络设备、存储设备、数据库、中间件等基础设施的技术创新。 信创CPU概览

LGP5854 [LG TPLT] 笛卡尔树 学习笔记

LGP5854 [LG TPLT] 笛卡尔树 学习笔记 Luogu Link 题意简述 给定一个长为 \(n\) 的排列 \(p\),以 \(i\) 为键,\(p_i\) 为值构建 \(p\) 中所有元素的笛卡尔树。 做法解析 定义“右链”为从根开始一直往右儿子走形成的一条链。 因为我们照键从小到大的顺序插入每一个元素,所以…

11.4.3 凸目标的收敛性分析

式\((11.47)\)应该有误,不等号左边还应该有一个项\(-E[||x_T-x^{*}||^2]\),之所以没写估计是因为认为\(x_T\)非常接近\(x^{*}\),所以可以忽略;另外不等号右边的括号打错了,应该是 \[2\underset{t=1}{\overset{T}{\sum}}\eta_tE[R(x_t)]-2S_1R^*-S_2L^2 \],其中\(S_1=\und…

AGC053C 题解

Solution 前面部分略,相信别的题解写得很详细。 本题解集中解释 \(p(d)\) 的计算。 \(p(d)\) 表示对于 \(\forall A_i\),\(B_1\cdots B_{i+d}\) 中有比它大的数。 那么这么考虑,已经加入 \(A_1 \cdots A_{i-1}\)。对于 \(A_i\) ,如果大于 \(\min(A_1 \cdots A_{i-1},B_1 \c…

使用word模板的科研论文编写

编写SCD论文等的时候,可能出现官网的论文模板不够全面.一般我们使用latex作为论文编写模板,格式等都方便控制和编写,而word模板操作起来较为复杂.但是官网有些时候可能找不到latex的模板内容,不得不使用word模板.word的样式模板等功能十分好用,但是官网的模板不一定有那么好的格…