sql cookbook学习笔记db2.docx
- 文档编号:10854650
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:15
- 大小:950.36KB
sql cookbook学习笔记db2.docx
《sql cookbook学习笔记db2.docx》由会员分享,可在线阅读,更多相关《sql cookbook学习笔记db2.docx(15页珍藏版)》请在冰豆网上搜索。
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.补充范围内丢失的值。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sql cookbook学习笔记db2 cookbook 学习 笔记 db2