SQL语句编写注意事项

1、SQL编写注意事项

1.1 null 列

  null 列使用索引是无意义的,任何包含null 值的列都不会包含在索引中。因此where 语句中的is null 或者 is not null 的语句,导致索引失效。

1.2 concat 或 ||

  concate 或 || 是mysql 和 oracle 的字符串连接操作,如果对列进行函数操作,就会忽略索引的使用,比如下面的查询语句:

  

-- 忽律索引
select ... from .. where first_name || ‘‘ || last_name = ‘bill gates‘ ;
-- 使用索引
select ... from .. where first_name = ‘bill‘ and last_name = ‘bill gates‘ ;

1.3 like

  使用like进行模糊查询时,如果通配符%在首位则索引会失效,如下sql语句:

 

-- 无法使用索引
select .. from .. where name like‘%t%‘
-- 可以使用索引
select .. from .. where name like ‘t%‘ ;

1.4 order by

  order by 子句中不要使用非索引列或嵌套表达式,这样都会导致性能降低。

1.5 使用 !=或<> 操作会使索引失效

-- 索引无效
select .. from .. where sal != 3000 ;
select .. from .. where sal <>3000 ;

1.6  使用 or 需要注意

1、or两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用union all或者是union(必要的时候)的方式来代替“or”会得到更好的效果。

2、如果or 两边字段都有索引,用explain 也可能出现索引失效的情况

对于使用or导致索引失效的情况
select id from t where c1=1 or c2=2
改为
select id from t where c1=1 UNION ALL select id from t where c2=2

1.7 where 和 having

  select .. from .. on .. where .. group by .. having .. order by .. limit ..,以上是sql语句的语法结构,其中on、where和having是有过滤行为的,过滤行为越能提前完成就越可以减少传递给下一个阶段的数据量,因此如果在having中的过滤行为能够在where中完成,则应该优先考虑where来实现。

1.8 exists 和 in 的选择

  

select * from 表A where id in (select id from 表B)
相当于
select * from 表A where id exits(select id from 表B where 表B.id =表A.id)

在选择使用exits 和 in 的原则根据驱动顺序的进行选择,如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询。所以

1、当A表数据量大,B表数据量小情况下使用IN

2、当B表数据量大,A表数据量小使用exitsts

关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题。如何高效的写出一个替代not exists的SQL语句?

select colname … from A表 where a.id not in (select b.id from B表)
修改为:
select  colname … from A表 left join B 表 where a.id=b.id and b.id is null

1.9 where 后面的‘=‘后面使用函数、算术运算或其他表达式运算,系统将可能无法正确使用索引

select id from t where num/2=100
可以更改为
select id from t where num=100*2 (该方法索引不失效)

select id from t where substring(name,1,3)=‘abc‘
可以更改

select id from t where name like "abc%"

1.10 避免对where 后面的字段进行隐私类型转换

where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。

select name from t where int(age)=20 对字段进行了类型转换,索引失效

  

原文地址:https://www.cnblogs.com/dushangguzhousuoli/p/12162709.html

时间: 2024-08-29 12:39:14

SQL语句编写注意事项的相关文章

SQL语句编写注意点

1.使用英文模式下的 “`” 注意此处不是单引号 正确格式: select `user_id`,`name`,`desc` from `prv_user` 错误格式: select 'user_id','name','desc' from 'prv_user' 2.SQL语句书写,在SQL语句的引号前后留有空格,避免意外SQL语句连在一起 String sql = " select `user_id`, `name`, `desc` from `prv_user` " ; 3.在SQL

查出数据库各种类型的金额,汇总(SQL语句编写的艺术)

本实例是在做小项目的时候用到的,想分享给大家,虽然简单,但可能对大家有用.!!! 实例:记账系统 一: 数据库: 流水记录,记录的消费类型有很多.如下图:通过typeId字段可以知道类型.(当然这里还有一张消费类型表哦) 二:sql语句查询 说明:主要是case语句的运用,根据不同情况,对不同的值进行sum运算得到我们想要的结果! 1 public List getSQLqueryColumnList(String sql) 2 { 3 List l=getSession().createSQL

oracle中一些sql语句 编写操作

-- 修改系统当前日期格式ALTER SESSION SET nls_date_format = "YYYY-MM-DD HH:MI:SS"; ------------------------------------------------------------------------------------------------------ 截取一个字段     SUBSTR(字段,开始下标,截取长度)SELECT EMP.ENAME "雇员原名称", SUB

数据库性能优化之SQL语句优化

一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性. 在多数情况下,Oracle使用索

使用表达式避免拼接SQL语句

在SQL语句编写过程中,无论在存储过程中还是在程序中,有时为了使语句兼容全部情况与某字段的特殊情况,不得不拼接SQL字串 如下表 商品ID 类别ID 1 1 2 1 3 2 4 3 5 3 如果我们要写一个SQL,改SQL可通过类别ID获得该类别的商品ID,并且要求兼容传入类别ID为0时获得所有商品,我们不得不拼接SQL了 --@类别ID为传入的参数 DECLARE @Sql NVARCHAR(500) SET @Sql='SELECT * FROM 商品' IF(@类别ID!=0) SET @

SQL语句的优化

一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性. 在多数情况下,Oracle使用索

ORACLE和SYBASE数据库中实现数据查询条数限制的SQL语句实现

一.概述 对于某些需要通过数据库与大量数据打交道的软件来说,处理性能相当的重要.为了保证软件能够将所有数据处理完而不至于崩溃,分批处理的思想应运而生.分批处理的具体做法是编写SQL语句,每次返回规定条数的数据给软件处理,待这一批数据处理完之后,再接着处理下一批. 本文通过对具体的数据库表(tb_employeeinfo)的操作过程,展示了ORACLE和SYBASE数据库中分批处理SQL语句的编写方法. 二.ORACLE数据库中的处理 首先,建立tb_employeeinfo表,其定义如下: be

数据库性能优化之SQL语句优化1

一.问题的提出 在 应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海 量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提 高系统的可用性. 在多数情况下,Oracl

SQL语句 (一)

1 SQL语句分类: 数据查询语句(DQL): SELECT 数据操纵语言 (DML): INSERT.UPDATE.DELETE 数据定义语言 (DDL): 数据控制语言 (DCL): GRANT.REVOKE 事务控制语言 (TCL): COMMIT.ROLLBACK.SAVEPOINT 2 SQL 语句编写规则 2.1 关键字不区分大小写 2.2 对象名和列名不区分大小写 2.3 字符值和日期值区分大小写