注: 转载NC技术部文档, 并做部分修改

一、概述

本手册侧重于代码编写过程中SQL语句的编写规范问题,内容涉及书写风格、性能优化、多数据适配等方面。

文档中用★标示的内容为必须遵守的条例,其余的可视为建议。

二、书写风格

  1. SQL语句全部使用小写。★
  2. 引用字符时用单引号。如:update testable set idcol=’abcd’。 ★
  3. 连接符或运算符or、in、and、=、<=、>=, +,- 等前后加上一个空格。
  4. 严禁使用select * …….形式的语句,必须指出select的具体字段,即select col1, col2,… from tablea where ….★
  5. 严禁使用 insert into table values(?,?,?),必须指出具体要赋值的字段,即 insert into tablea (col1, col2,…) values(?,?,…)★
  6. SQL语句包含多表连接时,建议对每个表命名别名,对每个字段的使用都要带上表别名,即 select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col5
  7. 避免隐含的类型转换。例如在where子句中numeric 型和int型的列的比较或相加。★
  8. 读取是指通过JDBC读到的数据格式,保存是指保存在VO中的数据格式,插入或者更新是指insert或者update语句中的数据格式。
    1. 整型字段:读取时根据字段设置保存为Integer或者Long。
    2. 数字型字段:读取为BigDecimal,并保存为UFDouble,插入或者更新时为BigDecimal。
    3. 字符型字段:读取为String,并保存为String,插入或者更新为String。
    4. 布尔型字段:读取为String(‘Y’ OR ‘N’),并保存为UFBoolean,插入或者更新时为String(‘Y’ OR ‘N’)。
    5. 时间字段:读取为String,并保存为UFDateTime,插入或者更新时的时间格式由中间件统一处理,有单独需求的要申请后才能决定。
  9. 在子查询中前后必须加上括号, select col1, col2 from tablea where col3 in ( select col4 from tableb where col4>0)★
  10. 避免在where使用'1=1','1=2'这种表达式作为部分条件,如 select col1, col2 from tablea where 1=1 and col1 >0。
  11. 禁止使用视图。★

三、性能优化

  1. 尽量使用prepareStatement,利用预处理功能。
  2. 在进行多条记录的增加、修改、删除时,建议使用批处理功能,批处理的次数以整个SQL语句不超过相应数据库的SQL语句大小的限制为准。
  3. 建议每条SQL 语句中in中的元素个数在500以下,如果个数超过时,应拆分为多条SQL语句。禁止使用xx in(‘’,’’….) or xx in(‘’,’’,’’)。★
  4. 禁止使用or 超过 500,如 xx =’123’ or xx=’456’。 ★
  5. 尽量不使用外连接。
  6. 禁止使用not in 语句,建议用not exists。★
  7. 禁止使用Union, 如果有业务需要,请拆分为两个查询。★
  8. 禁止在一条SQL语句中使用3层以上的嵌套查询,如果有,请考虑使用临时表或中间结果集。★
  9. 尽量避免在一条SQL语句中从>= 4个表中同时取数,对于仅是作为过滤条件关联,但不涉及取数的表,不参与表个数计算;如果必须关联4个或4个以上表,尽量采用子查询的方式。
  10. 尽量避免使用order by和group by排序操作,因为大量的排序操作影响系统性能。如必须使用排序操作,尽量建立在有索引的列上。
  11. 对索引列的比较,尽量避免使用NOT 或 !=,可以考虑拆分为几个条件。如col1 是索引列,条件col1 !=0 可以拆分为col1 >0 or col2 <0
  12. 任何对列的操作都将导致表扫描,所以应尽量将数据库函数、计算表达式写在逻辑操作符右边。
  13. 在对char类型比较时,建议不要使用rtrim()函数,应该在程序中将不足的长度补齐。
  14. 用多表连接代替EXISTS子句。
  15. 如果有多表连接时,应该有主从之分,并尽量从一个表取数, 如select a.col1, a.col2 from a join b on a.col3=b.col4 where b.col5 = ‘a’。
  16. 在where子句中,如果有多个过滤条件,应将索引列或过滤记录数最多的条件应该放在前面。
  17. 在使用Like时,建议Like 的一边是字符串,表列在一边出现。

四、多数据库的考虑

  1. 字符串连接必须用“||”符号,不使用“+”。注意:在Oracle中一个null值与非null值连接,结果为非null值,在DB2和SqlServer中相反。使用isnull()对null转换为’’ 。★
  2. 通配符不能使用‘[a-c]%’这种形式,应写成如:select col1, col2 from table_name where col1 like ‘[a]%’ OR col1 like ‘[b]%’ OR col1 like ‘[c]%’ 。★
  3. 在Case when语句中只能出现 =、>=、<= 以及is null运算符,不能出现 <、>、<>、!=、以及is not null运算符。 否则在Oracle的decode函数无法表达。★

当必须使用 <, >, != ,is not null时,建议采用如下变通方法:

1)使用 !=时:例如   case  when  A!=B  then  e,

可改为 :  case  A=b  then  e1  else  e   (间接实现 A!=B)

2)使用 < 时:例如   case  when  A<B  then  e,

可改为 :  case  A<=b  then  case A=B  then  e1  else  e  (间接实现 A<B)

或    case  A>=b  then  e1  else  e    (间接实现 A<B)

3)使用 > 时:例如   case  when  A>B  then  e,

可改为 :  case  A>=b  then  case A=B  then  e1  else  e   (间接实现 A>B)

或    case  A<=b  then  e1  else  e    (间接实现 A>B)

4)使用 is  not  null  时:例如  case  when  A  is  not  null  then  e,

可改为:  case  A   is  null  then  e1   else   e  (间接实现 A  is  not  null)

特别说明:当执行大数据量的操作时,sql  Server  对 case when 的执行效率极低,甚至可能会死机,因此希望大家尽量不要使用case when。

  1. 左连接的写法必须带“outer”关键字。例如: select f1 from t1 left outer t2 on t1.f1 = t2.f1;而不是: select f1 from t1 left t2 on t1.f1 = t2.f1。★
  2. 只能使用以下函数,如要使用新的函数必须申报,审批后才能使用。函数:coalesce, cast, len, left, replace, right, substring, lower, upper, ltrim, rtrim, abs, acos, asin, atan, cos, ceiling, exp, floor, log, power, round, sign,sin, square, sqrt, tan, count, max, min, sum, avg。★
  3. substring函数中起始位置为1,表示从头开始。★
  4. 对于一些char/varchar的字段的值,即使是0,1,2…等值,也必须表达为’0’,’1’,’2’… ★
  5. 在cast和convert语句中只支持到字符型、日期型和数字型的转换,且日期型只支持UFDate的格式,即’YYYY’-‘MM’-‘DD’ ★
  6. 不能通过来percent  n 限制查询结果集的记录数,也不能使用 select  top n 的语句★
  7. join 与on 必须严格匹配,不允许出现没有on的join。★
  8. join…on 后面慎用 or,如果用到,请把or的范围用( )括起来
  9. 不能使用select into 的格式★
  10. 给某个字符型的列赋值时,如果其值含有单引号,例如:set  col=’fsdf’fdsfdsf’sdf’…, 有两种解决方案:
    1. 使用转意字符,将单引号写成’’,即  set  col=’fsdf’’fdsfdsf’’sdf’…
    2. 通过set的方式赋值,即:set  col= ? …

然后:setString(8,” ’fsdf’fdsfdsf’sdf’”)

NCX SQL编程规范相关推荐

  1. 编程规范学习资料清单

    资料清单包括: 1.       c C软件编程规范总则.lwp 华为C编程规范 2.       c# 华为C#编码规范 3.       c++ C++编程规范 C++编程规范_1(排版) C++ ...

  2. sqL编程篇(三) 游标与存储过程

    sql编程2 游标与存储过程 sql编程中的游标的使用: 提供的一种对查询的结果集进行逐行处理的一种方式 不用游标的处理解决方式: 逐行修改工资 update salar set 工资='新工资' w ...

  3. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  4. java编程规范每行代码窄字符,wiki/0xFE_编程规范.md at master · islibra/wiki · GitHub

    0xFE_编程规范 使用UTF-8编码 使用空格缩进 命名 清晰表达意图, 少用缩写(行业通用除外, 如: request=req, response=resp, message=msg), 不应使用 ...

  5. 微软编程规范(文档)

    项目编程规范 第一章 概述. 5 术语定义. 5 Pascal 大小写. 5 Camel 大小写. 5 文件命名组织. 5 1.3.1文件命名. 5 1.3.2文件注释. 5 第二章   代码外观. ...

  6. C语言编程规范 学习笔记

    C语言编程规范 一.代码总体原则 1.清晰 2.简洁 3.选择适合的风格,与代码原有风格保持一致 二.头文件 背景 术语定义 原则 2.1 头文件中适合放置接口的声明,不适合放置实现 原则 2.2 头 ...

  7. Java 编程规范 -- 易错精简版

    Part 1 – 易错点 --  edit by liudeyu,If you have any adivice or suggestion, please participate in the di ...

  8. 编程规范(阿里巴巴)

    一.编程规范: 1.变量不可以使用下划线与美元符号开头,也不能使用下划线与美元符号结尾. 2.代码中英混合,也不可纯拼音,变量需要为名词或形容词,方法必须为动词,常量必须全部大写多个单词使用下划线分割 ...

  9. ORACLE PL/SQL编程

    PL/SQL程序设计 什么是PL/SQL PL/SQL是 Procedure Language & Structured Query Language 的缩写.PL/SQL是对SQL语言存储过 ...

最新文章

  1. 迷惑行为赏析:把 jpg 图片加密后卖了 247 万
  2. 解决MyEclipse2015启动时:Java was started but returned exit code=1问题
  3. Android开发之SpannableString具体解释
  4. HTML5+Bootstrap 学习笔记 1
  5. 屠龙之路_坚持就是胜利_NinthDay
  6. Reginal2011_Chengdu_I Isabella's Message
  7. 【分析】1021 Deepest Root (25 分)【DFS解法】
  8. Gemstones(牛客第八场多校)
  9. LinuX 硬盘分区细节详谈 【 整理至 LinuxSir BY FreeXploiT 】
  10. 元宇宙综观—愿景、技术和应对
  11. lastinsertid mysql_mysql错误,帮忙看看
  12. java frame linux_JAVA环境(下) - Android框架简介_Linux编程_Linux公社-Linux系统门户网站...
  13. app里面可以运行php,我可以在googleappengine for Python上运行PHP文件吗?
  14. Python入门--字符串的比较
  15. 医用计算机考试题目,2015年全国计算机应医用能力考试辅导资料.doc
  16. canvas 绘画
  17. 学习PS软件的渐变工具
  18. UE5 WebUI 5.0.1插件下载
  19. 提取DWG图纸中的图元信息
  20. 这些有趣的Python库一定会亮到你

热门文章

  1. 求最大公因数的三种算法及简要说明
  2. 闭关修炼(十二) NIO
  3. 陈皓谈对待技术的态度
  4. Go语言相关书籍推荐(从入门到放弃)
  5. 英伟达GTX 960M安装anaconda、cuda+cudnn
  6. docker启动容器之后马上又自动关闭
  7. linux 强制更新只读文件
  8. 越吃越年轻的26种抗衰老食物
  9. 模仿天猫实战【SSM版】——后台开发
  10. android adhoc,android手机怎么连接adhoc共享电脑网络