项目中的那些SQL语句规范,你做到了几条?

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 公司有SQL语句规范的参考文档,这里特别做个笔记。

书写风格

1. 语句关键字应全部使用小写。


2. 引用字符时应使用单引号。

如:update testable set idcol='abcd'。


3. 连接符或运算符or、in、and、=、<=、>=, +,- 等前后宜加上一个空格。否则容易导致以下类似问题。

例如

在语句select a–b from table中,a,b均为变量,拼写该语句时,如果a = 6,b = -3,则语句变为select 6--3 from table。--被视为SQL的注释,结果语句报错。


4. 不得使用“select * from …”语法,必须标明字段名。即select col1, col2,… from tablea where …


5. 严禁使用“insert into table_name values (?,?,……)”语法,统一使用“insert into table_name (col1,col2,……) values (?,?,…...)”。


6. SQL语句包含多表连接时,必须加上表的别名,对每个字段的使用都要带上表别名。

20.png


7
. 应避免显式或隐含的类型转换。例如在where子句中numeric型和int型的列的比较。


8. 在子查询中前后必须加上括号。


21.png



9. 执行SQL时一次应只执行一条,如果多条语句则应分开执行,但必须保持在一个事务中。
不得一次执行通过分号等分开的多条语句,这样处理不清晰。


10. 如果能采用or代替,则不宜使用in 语句。in语句中的元素不得超过500个,如果超过,则应拆分为多条SQL语句。严禁使用xx in(‘’,’’….) or xx in(‘’,’’,’’)。


11. or连接条件不得超过 500,超过时应拆分为多条语句。



性能优化

1. 查询时应尽量减少多余数据的读取,通过使用where子句来减少返回的记录数。


2. 如果在语句中有not in(in)操作,应尽量用not exists(exists)来代替。特别对大数据量的两者检索速度有很明显的区别。


3. 不宜使用外连接。外连接效率低。


4. 一条SQL语句中不宜使用3层以上的嵌套查询。如果超过,则应在Java等应用服务器程序中处理。


5. 一条SQL语句中不得从4个及以上表中同时取数。仅作关联或过滤条件而不涉及取数的表不参与表个数计算;如果必须关联4个或4个以上表,应在Java等应用服务器程序中处理。


6. 应尽量避免使用order by和group by排序操作,如必须使用排序操作,尽量建立在有索引的列上。因为大量的排序操作影响系统性能。


7. 对索引列的比较,应尽量避免使用not 或 !=,可拆分为几个条件。因为“not”和“!=”不会使用索引。如col1 是索引列,条件col1 !=0 可以拆分为col1 >0 or col2 <0。


8. 应尽量将数据库函数、计算表达式写在逻辑操作符右边。因为这些对列的操作会将导致表扫描,影响性能。


9. 在where子句中,如果有多个过滤条件,应将索引列或过滤记录数最多的条件放在前面。


10. 能用连接方式实现的功能,不得用子查询。

例如:

22.png

应该用如下语句代替:

23.png

24.png

(这里需要注意:使用exists的效率依赖于匹配度,inner join效率比较稳定)


11. 多表关联查询时,写法可遵循以下原则,这样做有利于建立索引,提高查询效率。

格式如下:

25.png


跨数据库支持

1. 对于跨数据库Java应用程序的VO映射数据库的数据格式建议:

1) 整型字段:字段设置保存为Integer或者Long

2) 数字型字段:若需要使用小数2位以上的精确计算,读取、插入、更新使用BigDecimal类型

3) 字符型字段:读取为String,并保存为String,插入或者更新为String

4) 时间字段:读取为String,插入或者更新时的时间格式使用中间件统一处理。


2. 字符串连接应使用“||”符号,而不应使用“+”。

“+”是SQL Server语法,Oracle和DB2支持“||”,Hibernate转化为SQL Server时,会自动将“||”转为“+”。


3. 通配符不能使用‘[a-c]%’这种形式。

应写成如:

26.png


4. 截取字符串长度函数应使用substr,起始位置为1表示从头开始。
因为db2中substr起点为1,0会报错;在SqlServer数据库中使用的是substring需要进行转换。


5. 不得通过select percent n和select top n限制查询结果集的记录数。


6. join 与on 必须严格匹配,严禁出现没有on的join。


7. join…on 后面不宜使用or,如果使用则需将or的范围用( )括起来。


8. 不得使用select into 的格式。Select into是SQL Server特有语法,因为Oracle和DB2不支持。


9. 应将Null值与空字符串(长度为零的字符串)视为不同。虽然Oracle视Null与空字符串为相同,但DB2和SQL Server却视为不同。


                                                        —End——


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
项目中遇到一张900w的数据表把原先要花费17s执行的SQL优化到300ms经验加100哈哈哈
项目中遇到一张900w的数据表把原先要花费17s执行的SQL优化到300ms经验加100哈哈哈
25 1
|
2月前
|
SQL Java 应用服务中间件
Java项目防止SQL注入的四种方案
Java项目防止SQL注入的四种方案
41 0
|
15天前
|
SQL 自然语言处理 数据挖掘
NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
NL2SQL技术方案系列(1):NL2API、NL2SQL技术路径选择;LLM选型与Prompt工程技巧,揭秘项目落地优化之道
|
7月前
flowable项目报错:java.sql.SQLSyntaxErrorException: Table ‘psr_flowable_test.act_ge_property’ doesn’t exi
flowable项目报错:java.sql.SQLSyntaxErrorException: Table ‘psr_flowable_test.act_ge_property’ doesn’t exi
|
3月前
|
SQL 存储 关系型数据库
【MySQL】七种SQL优化方式 你知道几条
【MySQL】七种SQL优化方式 你知道几条
55 0
|
4月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_54 项目员工 III
「SQL面试题库」 No_54 项目员工 III
|
4月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_53 项目员工II
「SQL面试题库」 No_53 项目员工II
|
4月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_52 项目员工 I
「SQL面试题库」 No_52 项目员工 I
|
5月前
|
XML SQL Java
springboot 项目启动报Has been loaded by XML or SqlProvider, ignoring the injection of the SQL的错误的解决方案
springboot 项目启动报Has been loaded by XML or SqlProvider, ignoring the injection of the SQL的错误的解决方案
182 0
|
6月前
|
SQL 数据库 Docker
微服务轮子项目(14) - 慢查询SQL
微服务轮子项目(14) - 慢查询SQL
37 0