|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
越来越多的开发者将继续选择MySQL。Evans的总裁JohnAndrews表示,MySQL学习教程用户对MySQL和其他开源数据库的评价正在赶上甚至超过很多专有商业数据库软件。oracle天冷地冻,呆在家里又读完了《MasteringOracleSQL》2nd,发明Oracle的功效仍是很刁悍,光函数就有两百个,HSQL是很难对比的。接上去的硬骨头,看来要末冒险用Hibernate3.0的SQLMapping功效,要末就本人跑JDBC组装VO了。1.报表算计公用的Rollup函数
发卖报表
广州1月2000元
广州2月2500元
广州4500元
深圳1月1000元
深圳2月2000元
深圳3000元
一切区域7500元
以往的查询SQL:
Selectarea,month,sum(money)fromSaleOrdergroupbyarea,month
然后广州,深圳的算计和一切区域算计都必要在程序里自行累计
1.实在可使用以下SQL:
Selectarea,month,sum(total_sale)fromSaleOrdergroupbyrollup(area,month)
就可以发生和报表千篇一律的记录2.假如year不想累加,能够写成
Selectyear,month,area,sum(total_sale)fromSaleOrdergroupbyyear,rollup(month,area)
别的Oracle9i还撑持以下语法:
Selectyear,month,area,sum(total_sale)fromSaleOrdergroupbyrollup((year,month),area)
3.假如利用Cube(area,month)而不是RollUp(area,month),除取得每一个区域的算计以外,还将取得每月份的算计,在报表最初显现。4.Grouping让算计列更好读
RollUp在显现广州算计时,月份列为NULL,但更好的做法应当是显现为"一切月份"
Grouping就是用来判别以后Column是不是是一个算计列,1为yes,然后用Decode把它转为"一切月份"
SelectDecode(Grouping(area),1,一切区域,area)area,
Decode(Grouping(month),1,一切月份,month),
sum(money)
FromSaleOrder
GroupbyRollUp(area,month);
2.对多级条理查询的startwith.....connectby
好比职员构造,产物种别,Oracle供应了很典范的办法
SELECTLEVEL,name,emp_id,manager_emp_id
FROMemployee
STARTWITHmanager_emp_idisnull
CONNECTBYPRIORemp_id=manager_emp_id;
下面的语句demo了全体的使用,startwith指明从那里入手下手遍历树,假如从根入手下手,那末它的manager应当是Null,假如从某个人员入手下手,能够写成emp_id=11
CONNECTBY就是指明父子干系,注重PRIOR地位
别的另有一个LEVEL列,显现节点的条理3.更多报表/剖析决议功效
3.1剖析功效的基础布局
剖析功效()over(partion子句,orderby子句,窗口儿句)
观点上很难讲分明,仍是用例子措辞对照好.3.2Row_Number和Rank,DENSE_Rank
用于选出Top3sales如许的报表
当两个营业员大概有不异事迹时,就要利用Rank和Dense_Rank
好比
金额RowNumRankDense_Rank
张三4000元111
李四3000元222
钱五2000元333
孙六2000元433
丁七1000元554这时候,应当把并列第三的钱五和孙六都选出来,以是用Ranking功效比RowNumber保险.至于Desnse仍是Ranking就看详细情形了。
SELECTsalesperson_id,SUM(tot_sales)sp_sales,
RANK()OVER(ORDERBYSUM(tot_sales)DESC)sales_rank
FROMorders
GROUPBYsalesperson_id
3.3NTILE把记录中分成甲乙丙丁四等
好比我想获得前25%的记录,大概把25%的记录看成统一个level同等看待,把另25%看成另外一个Level同等看待
SELECTcust_nbr,SUM(tot_sales)cust_sales,
NTILE(4)OVER(ORDERBYSUM(tot_sales)DESC)sales_quartile
FROMorders
GROUPBYcust_nbr
ORDERBY3,2DESC;
NTITLE(4)把记录以SUM(tot_sales)排序分红4份.3.4帮助剖析列和WindowsFunction
报表除基础现实数据外,总但愿中间多些整年总销量,到今朝为止的累计销量,前后三个月的均匀销量如许的列来参考.
这类前后三个月的均匀和到今朝为止的累计销量就叫windowsfunction,见下例
SELECTmonth,SUM(tot_sales)monthly_sales,
SUM(SUM(tot_sales))OVER(ORDERBYmonth
ROWSBETWEENUNBOUNDEDPRECEDINGANDCURRENTROW)max_preceeding
FROMorders
GROUPBYmonth
ORDERBYmonth;
SELECTmonth,SUM(tot_sales)monthly_sales,
AVG(SUM(tot_sales))OVER(ORDERBYmonth
ROWSBETWEEN1PRECEDINGAND1FOLLOWING)rolling_avg
FROMorders
GROUPBYmonth
ORDERBYmonth;
WindowsFunction的关头就是Windows子句的几个取值
1PRECEDING之前的一笔记录
1FOLLOWING以后的一笔记录
UNBOUNDEDPRECEDING之前的一切纪录
CURRENTROW以后记录4.SubQuery总结
SubQuery每天用了,实际上总结一下.SubQuery分三种
1.Noncorrelated子查询最一般的款式.
2.CorrelatedSubqueries把父查询的列拉到子查询内里往,头一回cyt教我的时分了解了半天.
3.InlineView也被当做最一般的款式用了.然后Noncorrelated子查询又有三种情形
1.前往一行一列whereprice<(selectmax(price)fromgoods)
2.前往多行一列whereprice>=ALL(selectpricefromgoodswheretype=2)
orwhereNOTprice<ANY(selectpricefromgoodswheretype=2)
最经常使用的IN实在就是=ANY()
3.前往多行多列一次前往多列固然就节俭了查询工夫
UPDATEmonthly_orders
SET(tot_orders,max_order_amt)=
(SELECTCOUNT(*),MAX(sale_price)
FROMcust_order)
DELETEFROMline_item
WHERE(order_nbr,part_nbr)IN
(SELECTorder_nbr,part_nbrFROMcust_orderc)
DBaaS系统本身并不提供面对面访问或个人客户关系或持续不断的支持MySQL学习教程。这些就是需要解决方案提供商的原因。他们帮助客户选择正确的解决方案、规划集成和迁移战略,然后协助实施。 |
|