写sql语句时应注意的事项

摘要: 开发人员在写sql语句的时候,通常会受面向对象的思维左右之外,还有其他因素也会影响写sql语句的习惯:1. 以往编程的经验2. 定式思维模式3. 心情好坏对于sql 本身来说,与面向对象没有半毛钱的关系,只是因为ORM 的出现,为了简化编程,好像有了关联,但事实上二者一点关系都没有。要写好SQL 语句并不是一件简单的事。在工作中总结了如下需要注意的地方:

开发人员在写sql语句的时候,通常会受面向对象的思维左右之外,还有其他因素也会影响写sql语句的习惯:
1. 以往编程的经验
2. 定式思维模式
3. 心情好坏
对于sql 本身来说,与面向对象没有半毛钱的关系,只是因为ORM 的出现,为了简化编程,好像有了关联,但事实上二者一点关系都没有。要写好SQL 语句并不是一件简单的事。在工作中总结了如下需要注意的地方:

写sql语句时,请忘记java 编程中的null
s数据库记录中的NULL 与 java 中的 null 完全是两回事,有些程序员会搞混, 因为 jdbc 会将 NULL 映射到 Java的null, 这往往会给人造成一种假象 NULL==null(java)

在内存中 处理数据
程序员精通SQL 的并不是很多,所以很多程序员会把数据取到内存中,然后在内存中进行计算或者进行类型转换,特别在喜欢用 java 的 List 循环处理, 这个时候应该多想想,数据库是否提供了一些方法能更简便的处理数据,比如 数据库的 OLAP ,这样可以让数据库处理出结构,而内存中只用这些结果. 这样做至少有两个好处:
1. 简洁, 程序代码简洁,写SQL 或许更容易,java 代码也少很多。
2, 高效, 数据库处理的逻辑比你处理的要高效.
所以,有这种情况的时候,可以问下自己,这个查询语句是否可以让数据库去执行得更好。

用 union 代替 union all
如果有这种情况发生,请问一下自己是否真的需要这样,union 是会去掉重复的记录,性能会比较低,因为它会比较多个结果集中是否有重复记录,而union all 不用比较,性能相对高效。

利用jdbc 分页处理大量记录
这是最笨的办法,内存分页,所有的数据取到内存中,然后再去分页,性能底下。其实很多数据库已经提供了相应的处理方法,比如通过limit .offset, top ... , orACLE 利用 ROWNUM, SQLSERVER 2005 以上版本支持ROW_NUMBER() OVER 等方式分页.


多表查询,在内存中 连接 数据
有些程序员特别喜欢单表操作,总数据查处几个表的数据之后,然后在内存中来关联,除非特殊情况,否则不要这么做,应该多想想是否可以用一条SQL语句关联查询得到结果集。我发现IBM 的产品,很喜欢这么做,基本单表查询,或许与要兼容多种数据库相关吧。

在插入数据的时候,一条一条插入
JDBC 有 batch 处理,不需要一条一条的插入, 那样性能很低,每次都需要创建 PreparedStatement. 如果需要向同一个表中插入多条记录,值需要一条SQL 语句和许多相关的值绑定就可以做到,最后在commit 数据.

尽量用数据库的排序
数据的order by 能对许多类型的数据进行排序,除非特殊情况,你能确定数据库排序比你自己排序还要慢,否则,不要在 内存中进行排序。

灵活运用数据库提供的聚合方法
比如很多数据库都提供了 group by , case ,sum 等方法,能用的地方,尽量用。

上一篇: 获取django orm query执行的的sql语句
下一篇: spring security JDBC 数据库实现,5个表, 例子下载
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号