sql中字符串比较和in的效率

如果table_a中
date_id char(8)
那么下面两种哪个效率高些?
select * from table_a where date_id in ('200909','200908','200907,'200906');
select * from table_a where date_id <= '200909' and date_id >= '200906';

根据情况而定,不同的数据库如MYSQL,MSSQL,ORACLE等执行情况不同,
就连同一个数据库不同版本执行情况也有可能不同,
像ORACLE 9跟ORACLE 10 ,你对同一个比较复杂的SQL执行EXPLAIN分析执行时间时,结果也会差别很大的。
而且同一个SQL,如果一个加上了对应的索引,那执行时间也会差很多。

一般在解析SQL时,数据库也会根据SQL自己去 优化一下,比如ORACLE的HIT策略等。
对于你提供的SQL语句,如果仅仅是这样的话,觉得两条效果差不多,应该可以当成一样仅用,

如果是动态拼接的,比如将来可能要把IN里面的数越来越多,可能效率就会慢下很多,
但对于<=和>=,可能就必須保证你要查里面的数据没有需要排除的。(我知道的IN对于ORACLE里有最多1000个项的限制,超过就会报错),
所以感觉要优化SQL语句,还得自己先了解所使用的数据库,再学习下对应的优化方法

楼主还是在自己机器上测试一下:

我在mysql上测试:

如果date_id 设置成主键, 两条语句效率一样

如果没有设置主键,select * from table_a where date_id <= '200909' and date_id >= '200906';的效率要高。

mysql 上用explain语句可以检测该语句查询出结果检索到的行数。

在oracle数据库中,第二个效率会高一些,因为在比较时,都是拿date_id 去比较的,但是第二个会拿date_id 与两个临界值相比,而第一条,会逐个的进行比较,这样的话,至少检索字段的数量上减少了,你可以测试一下

下面这个sql性能要高些

参考
SQL 语句性能调优

http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1002limh/

and效率比较高,
假如数据库有N条数据的话,
第一种就要比较4N次,
而第二条,如果执行date_id >= '200906'查询结果是M条的话,则
date_id <= '200909' 比较的次数就是M的,总次数为N+M。
sql语句条件执行的顺序是从右向左

N+M<=2N