77家的会客2010

Tag: SQL | 记录数: 9
让SQL飞起来[转]
Weather:18~23度,阵雨

任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把子句拆开;拆开的子句中应该包含索引。

要善于使用存储过程,它使SQL变得更加灵活和高效。从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。

DB2的SQL将日期时间转化为数字串
Weather:暴雨没下下来

DB2中没有TO_CHAR函数,所以要将系统时间转化成字符串甚至是数字串的话,没有什么特别好的方法,但方法还是有的,虽然麻烦点。

INSERT INTO
LCDFLIB.FMOS01P(OSINPD,OSUSER,OSRKCD,OSSTRD,OSENDD,OSOSNI,OSCRDT,OSCRTM,OSCRTA)
 VALUES(
(CAST (SUBSTR(CHAR(current timestamp),1,4) || SUBSTR(CHAR(current timestamp),6,2)||
 SUBSTR(CHAR(current timestamp),9,2) || SUBSTR(CHAR(current timestamp),12,2) ||
 SUBSTR(CHAR(current timestamp),15,2) || SUBSTR(CHAR(current timestamp),18,2) AS BIGINT)
),'TANAKA    ','K22  ',20080815,20080914,'LJASLDFJWOIEJFLSDKJFL',20080818,153251,'TANAKA    ')

思路为,用current timestamp取系统的日期时间,然后用char()转化为字符串,再用SUBSTR()取出其中的数字部分,联接,最后再用CAST()函数将日期的数字串转换成大数值型。

由于日期的数字串长达14位,所以integer即int32长度不够,只能转换成BIGINT或是Decimal这种高精度的才行。

比如在.NET当中,要用Decimal.TryParse()而不能用Integer.TryParse()

sql之join用法完全版
Weather:阴转中雨,东南风5-6级转南风5-6级,(21~26)℃

SQL中大概有这么几种JOIN:

cross join

inner join

left outer join

right outer join

full outer join

一条SQL语句,字段联接
Weather:晴转多云,南风4-5级,(22~29)℃

select spnumber || '-' || scNumber from dba.ast_scNumber where datediff(day,recTime,'2008/7/5')=0

再补一个

DB2中对应的select top n在DB2中对应的语法是
select * from tablea fetch first n row only
--取last n就 order by id desc
SQL中CASE的变态用法
Weather:雾转阵雨,东南风4-5级转南风4-5级,(20~25)℃

where (case curRec when 1 then a.spnumber=b.spnumber else 1=1 end)

或是

where a.spnumber=b.spnumber and a.spnumber(case curRec when 1 then =b.spnumber else not is null end)

这两句都不好用,想了好几分钟,其它的条件下(不进行a.spnumber字段判断的情况下,让此字段=自己不就行了 :)