sql cookbook学习笔记db2.docx

上传人:b****8 文档编号:10854650 上传时间:2023-02-23 格式:DOCX 页数:15 大小:950.36KB
下载 相关 举报
sql cookbook学习笔记db2.docx_第1页
第1页 / 共15页
sql cookbook学习笔记db2.docx_第2页
第2页 / 共15页
sql cookbook学习笔记db2.docx_第3页
第3页 / 共15页
sql cookbook学习笔记db2.docx_第4页
第4页 / 共15页
sql cookbook学习笔记db2.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

sql cookbook学习笔记db2.docx

《sql cookbook学习笔记db2.docx》由会员分享,可在线阅读,更多相关《sql cookbook学习笔记db2.docx(15页珍藏版)》请在冰豆网上搜索。

sql cookbook学习笔记db2.docx

sqlcookbook学习笔记db2

1.对表中记录随机排序:

orderbyrand();

2.Coalesce()coalesce(case"MIDINIT"when''thennullelse"MIDINIT"end,casesubstr("LASTNAME",1,1)when'A'thennullelse'µÚ¶þ¸öλÖÃ'end,'µÚÈý¸öλÖÃ')

3.处理字母数字混合的字符串:

只想按着字母处理,或只想按着数字处理。

Translate(data,’目标格式’,’要替换的字符’),raplace(data,’要替换的内容’,’替换的目标’),通过两次替换得到最终想要的字符或数字。

--限制,要连续的!

4.空值排序:

用一个子查询将null值与其他值用数字表示,在新的里再用这个值参与排序。

另外,nullfirst或,,

5.在orderby后面可以使用case表达式,从而实现根据不同的标准对数据进行排序。

Orderof是指按查询表中的某个进行排序,使用相同的顺序。

6.从一张表中查找另一张表中相同的值,使用in

7.从一张表中查找另一张表中没有的值,用集合讲,就是求集合A-集合B,

方法一:

方法二:

方法三:

方法四:

区别:

a、Except不会返回重复行,不用担心NULL。

b、Notin等价于not(谓词1or谓词2),如果其中之一为NULL,会导致结果为NULL,造成没有结果返回。

In和notin本质上是OR运算,因而计算逻辑OR时处理NULL的方式不同,产生的结果也不同。

等价运算。

运算过程:

在SQL中,trueornull的结果是true,falseornull的结果是NULL。

另外,notin,在后一个表中是空表时,会返回左边表中的所有值。

---where后面的运算结果是Null,不会返回任何值。

等价于false.

--如果运算符是and,则结果永远为空,等价于false--------根据验证结果猜测。

c、Exists运算只有两个结果,真或没有返回值。

如果是前者,notexists为假。

否则一律为真。

如果有一个相等的,则导致结果为假。

否则只要没有相等的,一律为真。

8.Distinct的替代方法。

本例是求并集-交集,当中的部分内容使用了这种方法:

9.在运算或比较中使用NULL值。

NULL值有时表示是还没有,这时意味着null是有值的,代表最小。

如提成,NULL表示的是还没有提成,是最少的。

在查找提成最少的人的时候,要特别处理这个字段为Null的。

办法--------coalesce(data,0)

10.插入数据:

可以在insert插入时使用default,插入的值是定义表时默认的值。

11.一次向多个表中插入记录。

关键是能定位某条记录能插入到哪种表中。

原理是使用视图。

12.删除重复记录。

这里有一个技巧,使用集合函数min来得到集合中不重复的部分

13.计算字符在字符串中出现的次数:

注意这里使用了除法,原因是LL占两个字节,计算结果是2乘以出现次数长度,所以要除以重复字符创长度得到的才是次数。

14.将字符和数字数据分离

这里用了几个函数,一是lower,字母全部小写。

二是repeat,不用一直写26个。

15.提取字符串中的所有数字,但数字出现的位置未知,其他字符是什么也不知道:

首先将数字弄没,得到剩下的字符;再把这些字符转译成相同字符,并去掉;得到的就是只有数字的了。

16.行变列-将行变为列

witht(workdept,phoneno_str,trn,ttol)as

(select"WORKDEPT",cast("PHONENO"asvarchar(1000)),rn,tolfrom

select"WORKDEPT","PHONENO",row_number()over(partitionbyworkdept)asrn,count(*)over(partitionbyworkdept)astol

from"DB2ADMIN"."EMPLOYEE"

)bt

wherern=1

unionall

selectt.workdept,phoneno_str||''||coalesce(phoneno,''),trn+1,ttolfromt,

select"WORKDEPT","PHONENO",row_number()over(partitionbyworkdept)asrn

from"DB2ADMIN"."EMPLOYEE"

)bt1

wheret.workdept=bt1.workdeptandbt1.rn=trn+1andtrn+1<=ttol

select*fromtwheretrn=ttol

17.将上述结果返回来变,变回原来的样子:

selectstrip(tstr),substr(tstr,pos+1,locate('',tstr,pos+1)-pos-1)from

select''||PHONENO_STR||''aststr,caseposwhen1then1elsepos+1endaspos,cast(translate(substr(PHONENO_STR,pos,1),'#','')asvarchar

(1))aschfrom"DB2ADMIN"."TT",

(selectrow_number()over()asposfrom"DB2ADMIN"."TT","DB2ADMIN"."TT","DB2ADMIN"."TT","DB2ADMIN"."TT","DB2ADMIN"."TT")p

wherepos

)t

wherech='#'orpos=1

orderby1

18.将每条记录中的字符串中的字符进行排序

技巧点:

a.在max函数中使用case表达式。

通过这种方式实现了逐个位置安置字符。

b.通过使用对全表排序来的得到一个1、2、3、、、。

的列表,而不用递归。

问题是可能不够,就是列的最大数还不够将一条记录拆为单个字符。

c.拆单个字符的方法

d.拆单个字符后,再排列,加行号。

e.问题,case那块,是有限制的,超过6个的就不能用了。

19.计算平均值问题:

Null不参与运算,导致结果出错。

20.生成累乘积

技巧:

A.计算累计和

B.用对数、指数互换实现累计乘

21.计算累计差

技巧:

a.仍然利用累计和,但是要识别第一行

b.通过对行加行标识实现标识行

22.计算模式:

技巧:

a.这样做的好处是能找出所有最大的,而不是一个。

23.查找中间值:

技巧:

a.通过ceil及。

得到整除顶及底的结果。

b.多增加的几个列,把要用到的中间结果都记录下来。

c.Where中通过or包含两种情况

24.求总和的百分比。

首先求部门和,然后再计算这个和在总和中的百分比。

技巧:

使用partitionby

25.确定两个日期之间的工作日数

技巧:

a.在sum中使用case表达式,且case表达式中使用in谓词进行判断。

b.使用dataname函数

c.Max函数中使用case表达式,相当于groupby

d.通过t500列出每一天

26.确定两个日期直接的月数和年数,既要算年,也要算月。

用年算月。

27.确定两个日期之间的秒分时数。

用天算的,不是很精确

28.计算一年中周内各个日期的次数

技巧:

a.获得一年中第一天的方法

b.用下一年的第一天减去一天作为本年年尾

29.计算相邻时间的相差天数,关键是查找到最近的那天的方法

30.通过2月的最后一天判断该年是否是闰年:

witht(p)as(selecthiredatefromemp)

selectp,caseday(((p-(dayofyear(p)-1)day)+2month)-1day)when28then'ƽÄê'else'ÈòÄê'endfromt

31.确定月的第一天和最后一天:

使用day函数:

32.像日历一样打印一个月的每一天

witht7(num)as((values1)unionallselectnum+1fromt7wherenum<7),

tt(p)as(valuescurrentdate),

trlt(p1,p2,p3,p4,p5,p6,p7,flag)as(

selectmax(caseposwhen1thendayend),

max(caseposwhen2thendayend),

max(caseposwhen3thendayend),

max(caseposwhen4thendayend),

max(caseposwhen5thendayend),

max(caseposwhen6thendayend),

max(caseposwhen7thendayend),

1

from

(select(p-day(p)day+1day)-dayofweek(p-day(p)day+1day)day+numdayasday,row_number()over()asposfromtt,t7)trow

unionall

selectp1+7day,p2+7day,p3+7day,p4+7day,p5+7day,p6+7day,p7+7day,flag+1fromtrltwhereflag<5

selectcasemonth(p1)when(selectmonth(p)fromtt)thenchar(day(p1))else''end,

casemonth(p2)when(selectmonth(p)fromtt)thenchar(day(p2))else''end,

casemonth(p3)when(selectmonth(p)fromtt)thenchar(day(p3))else''end,

casemonth(p4)when(selectmonth(p)fromtt)thenchar(day(p4))else''end,

casemonth(p5)when(selectmonth(p)fromtt)thenchar(day(p5))else''end,

casemonth(p6)when(selectmonth(p)fromtt)thenchar(day(p6))else''end,

casemonth(p7)when(selectmonth(p)fromtt)thenchar(day(p7))else''end

fromtrlt

33.在同一个表中各个行之间进行比较,求符合条件的记录,注意比较次数,通过限制实现只比较一次

34.查找同一组或分区中行之间的差。

在这个例子中,充分发挥了标量子查询的优势,查找具有某种特定的某个值,想不出其他不用标量子查询的方法。

复杂于,如果有人在同一天被雇佣,如果不使用标量子查询,想不出还有其他办法。

35.补充范围内丢失的值。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 少儿英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1