做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等。因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为公司衡量程序员技术水平的标准。

我们程序员不是dba,不需要时刻关注sql运行时间,想方设法优化表结构,存储空间,优化表读取速度等等,但是在开发系统时,时刻保持优良的写sql语句的作风是很有必要的,这关乎到个人在公司的声誉,嘿嘿,你懂的。。。

新来的程序员老鸟,在一个开发团队中,需要表现一下自己的水平,奠定在公司的地位,需要努力表现一把,最简单的从写的sql语句就很容易表现出来,曾经就有一次,一个老程序员,上面定位是要做团队领导的,先历练一下做个制单的模块,列表sql中有一列这位老鸟直接写了个select语句从别的表中取之,而不是用表之间关联得到,一下破坏自己程序员老鸟光辉形象。

做技术的还是要注重自己的内涵,提升内功,哈哈。

闲话少说,总结一点程序员老鸟写sql顺手拈来的功夫吧:

1. 不论一个sql中涉及到多个表,每次都用两个表(结果集)操作,得到新的结果后,再和下一个表(结果集)操作。

2. 避免在select f1,(select f2 from tableB ).... from tableA 这样得到字段列。直接用tableA和tableB关联得到A.f1,B.f2就可以了。

3.避免隐含的类型转换
 如 
 select id from employee where emp_id='8'  (错)
 select id from employee where emp_id=8    (对)
 emp_id是整数型,用'8'会默认启动类型转换,增加查询的开销。
 
4. 尽量减少使用正则表达式,尽量不使用通配符。

5. 使用关键字代替函数
   如:
   select id from employee where UPPER(dept) like 'TECH_DB'  (错)
   select id from employee where SUBSTR(dept,1,4)='TECH'    (错)
   select id from employee where dept like 'TECH%'         (对)
 
6.不要在字段上用转换函数,尽量在常量上用
  如:
  select id from employee where to_char(create_date,'yyyy-mm-dd')='2012-10-31'  (错)
  select id from employee where create_date=to_date('2012-10-31','yyyy-mm-dd')   (对)
  
7.不使用联接做查询
 如:select id from employee where first_name || last_name like 'Jo%'  (错)
 
8. 尽量避免前后都用通配符
  如:
  select id from employee where dept like '%TECH%' (错)
  select id from employee where dept like 'TECH%' (对)

9. 判断条件顺序
  如:
  select id from employee where creat_date-30>to_date('2012-10-31','yyyy-mm-dd')   (错) 
    select id from employee where creat_date >to_date('2012-10-31','yyyy-mm-dd')+30   (对)
    
10. 尽量使用exists而非in
 当然这个也要根据记录的情况来定用exists还是用in, 通常的情况是用exists
 select id from employee where salary in (select salary from emp_level where....)   (错)    
 select id from employee where salary exists(select 'X' from emp_level where ....)   (对)
 
11. 使用not exists 而非not in
    和上面的类似
    
12. 减少查询表的记录数范围

13.正确使用索引
  索引可以提高速度,一般来说,选择度越高,索引的效率越高。

14. 索引类型
  唯一索引,对于查询用到的字段,尽可能使用唯一索引。
  还有一些其他类型,如位图索引,在性别字段,只有男女的字段上用。

15. 在经常进行连接,但是没有指定为外键的列上建立索引

16. 在频繁进行排序会分组的列上建立索引,如经常做group by 或 order by 操作的字段。

17. 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不建立索引。如性别列上只有男,女两个不同的值,就没必要建立索引(或建立位图索引)。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

18. 在值比较少的字段做order by时,翻页会出现记录紊乱问题,要带上id字段一起做order by.

19. 不要使用空字符串进行查询
    如:
    select id from employee where emp_name like '%%' (错)
    
20. 尽量对经常用作group by的关键字段做索引。

21. 正确使用表关联
    利用外连接替换效率十分低下的not in运算,大大提高运行速度。
    如:
    select a.id from employee a where a.emp_no not in (select emp_no from employee1 where job ='SALE')  (错)
    
22. 使用临时表    
   在必要的情况下,为减少读取次数,可以使用经过索引的临时表加快速度。
   如:
   select e.id from employee e ,dept d where e.dept_id=d.id and e.empno>1000 order by e.id   (错)
   
   select id,empno from employee into temp_empl where empno>1000 order by id
   select m.id from temp_emp1 m,dept d where m.empno=d.id      (对)

程序员老鸟写sql语句的经验之谈的更多相关文章

  1. (摘至)程序员老鸟写sql语句的经验之谈

    做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...

  2. Java 程序员在写 SQL 时常犯的 10 个错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用“模式-模式”,举个例子,模式可 ...

  3. 写sql语句注意事项

    做管理系统的,无论是bs结构的还是cs结构的,都不可避免的涉及到数据库表结构的设计,sql语句的编写等.因此在开发系统的时候,表结构设计是否合理,sql语句是否标准,写出的sql性能是否优化往往会成为 ...

  4. 《你还在写sql语句吗?》人生苦短,进入MybatisPlus的丝滑体验

    一.发展历程 依稀记得大学期间,类中写sql语句的日子,一个sql语句占据了大部分时间,到后来hibernate的出现算是解决了这一痛点.工作 后,我们又接触到了mybatis这样的框架,瞬间感觉这个 ...

  5. 程序员眼中的 SQL Server-执行计划教会我如何创建索引?

    先说点废话 以前有 DBA 在身边的时候,从来不曾考虑过数据库性能的问题,但是,当一个应用程序从头到脚都由自己完成,而且数据库面对的是接近百万的数据,看着一个页面加载速度像乌龟一样,自己心里真是有种挫 ...

  6. 写sql语句分别按日,星期,月,季度,年统计

    --写sql语句分别按日,星期,月,季度,年统计销售额 --按日 ' group by day([date]) --按周quarter ' group by datename(week,[date]) ...

  7. Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析

    Python 数据分析:让你像写 Sql 语句一样,使用 Pandas 做数据分析 一.加载数据 import pandas as pd import numpy as np url = ('http ...

  8. PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别

    PL/SQL中直接写SQL语句和用EXECUTE IMMEDIATE方法的区别 在PL/SQL中在执行SQL语句时可以直接写SQL或者可以把一个SQL语句拼成一个字符串,如下: select * fr ...

  9. 在程序开发中怎样写SQL语句可以提高数据库的性能

    以下内容是公司dba总结. 1. 首先要搞明白什么叫执行计划?   执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来 ...

随机推荐

  1. [React] Creating a Stateless Functional Component

    Most of the components that you write will be stateless, meaning that they take in props and return ...

  2. Android中FTP服务器、客户端搭建以及SwiFTP、ftp4j介绍

    本文主要内容: 1.FTP服务端部署---- 基于Android中SwiFTP开源软件介绍: 2.FTP客户端部署 --- 基于ftp4j开源jar包的客户端开发 : 3.使用步骤 --- 如何测试我 ...

  3. android90 bind方式启动服务service调用service里的方法

    package com.itheima.banzheng; import com.itheima.banzheng.LeaderService.ZhouMi; import android.os.Bu ...

  4. linux 清空文件内容命令

    清空文件内容命令 $ echo "" >log.log > 是重写,覆盖式 >>是尾部追加

  5. oracle学习----DDL锁理解

    DDL锁分为三种 1.排他DDL锁 2.共享DDL锁 3.可中断解析锁 大部分DDL都带有排他DDL锁,如一个表被修改中,可以使用select查询数据,但是大多数操作都是不允许执行的,包括所有其他DD ...

  6. iOS——GCD多线程

    1> 概述 Grand Central Dispatch (GCD)是Apple开发的一种多核编程技术.主要用于优化应用程序以支持多核处理器以及其他对称多处理系统. GCD提供函数实现多线程开发 ...

  7. 转:Oracle EBS订单的流程(Order->AR)

    目录(?)[-] 基本流程 创建订单 Pick Release Pick Confirm Ship Confirm Deliveries Interface Trip Stop - SRS Workf ...

  8. Mysql权限对照表

    Mysql分为5种数据权限.12种结构权限.11种管理权限,当我们需要精细化权限的时候,我们就需要对照来进行授权,这样可以很好的的控制登录人员的权限.

  9. JS实现跳转到页面任何地方

    要实现两个内容: 1.从A页面跳转到B页面任何地方 方法:用id对要跳转的地方进行标记. 首先,在A页面可以设一个链接 <a href = "b.html#pos" targ ...

  10. css 多栏自适应布局

    在页面重构中,我们经常会需要实现多栏布局,例如n栏固定宽度 + m栏自适应宽度的组合,绝对布局+padding+百分比宽度是容易想到的比较暴力的解决方法,但是作为未来的"工程师", ...