大家来学数据库(非学院派,实战派修炼法)

如果希望9、10排到后面,就通过 isnull 函数,把空值转换成很大的值,保证大于正常的Z1值即可。这也算个小技巧吧。

楼主 久依沙盘  发布于 2019-08-11 07:20:24 +0800 CST  
如果想变成从大到小,在字段名后面加 desc,desc 只对跟随的字段名有效,从小到大与从大到小可以混杂。粗一看有点小奇怪,为什么Z3没安排倒排,却也出现类似倒排的效果?在数据库中,在排序前,通过连接形成的记录,同一行(一条记录)各字段永远在一行,排序时同进同退,永不分离。排序时,写在前面的字段优先,再考虑写在后面的字段。

楼主 久依沙盘  发布于 2019-08-11 07:29:17 +0800 CST  
给分组汇总加上条件,结果大不相同,想想为什么是这种结果?

楼主 久依沙盘  发布于 2019-08-14 16:27:08 +0800 CST  
前面那个可能还觉得没啥用,这个看出什么奥秘了吗?

数据库里,一条记录里(同一行)计算使用公式很简单,跨记录(跨行)就比较麻烦了。理解了这个,你就打开了思路和想象空间。也就容易理解,为什么一直强调交叉连接是连接之母。

楼主 久依沙盘  发布于 2019-08-14 16:31:29 +0800 CST  
25楼中,出现好像是本行Z1跟上一行SZ1相加的效果,这种效果在Excel里倒很容易做到。当然其原理跟Excel的公式完全不同。不管怎么说,数据库中同一条记录跨字段处理很方便,但跨记录,数值型可以用 sum 求和,文本型就没函数可用了。好在它提供了一种特殊方法实现文本的跨记录合并,请看效果:

这里,开始出现多语句,多语句增添了巨大的灵活性。有了多语句,就可以用declare定义变量,用 set/select 给变量赋值,有点像编程的味道了。注意变量定义后要先赋值,否则其初始值是空值,得到的结果也会是空值。

楼主 久依沙盘  发布于 2019-08-15 07:12:17 +0800 CST  
我们借助8楼的技巧展示25楼的实现原理。25楼似乎清楚了,谁愿意讲讲这金字塔是怎么建造的?

楼主 久依沙盘  发布于 2019-08-15 07:16:23 +0800 CST  
@久依沙盘 2019-08-15 07:16:23
我们借助8楼的技巧展示25楼的实现原理。25楼似乎清楚了,谁愿意讲讲这金字塔是怎么建造的?

-----------------------------
此处8楼笔误,应该是28楼。
楼主 久依沙盘  发布于 2019-08-15 15:37:58 +0800 CST  
从28楼开始我们讲多语句,把许多相关的语句打包,就组成一个存储过程。比如我们要执行29楼的任务,可以先创建一个名叫 A1_C1 的存储过程,写法如下:

Create Procedure dbo.A1_C1
as

declare @ab varchar(200)
set @ab=''
select @ab=@ab+cast(B.Z1 as varchar(10))+case when a.z1=b.z1 then char(10)
else '+' end from A1 A,A1 B where A.Z1>=B.Z1 order by a.z1,b.z1
select @ab AB

执行后存储过程 A1_C1 创建完成,我们就可以调用该存储过程来替代一堆语句,写法如下:
exec A1_C1

咋一看,这不是多此一举吗?其实不然,正常情况下数据库只是开发人员使用,用户通过前端程序跟数据库打交道。如果不用存储过程,大量的语句就写在程序源代码里,造成程序很臃肿,增加程序与数据库交互的工作量,也影响运行速度。改用存储过程后,程序可大幅瘦身,而且很多改进可以通过修改存储过程而不必修改源代码,好处实在太多了。
楼主 久依沙盘  发布于 2019-08-15 21:55:27 +0800 CST  

楼主:久依沙盘

字数:4941

发表时间:2019-08-06 01:38:06 +0800 CST

更新时间:2019-08-16 17:54:20 +0800 CST

评论数:32条评论

帖子来源:天涯  访问原帖

 

热门帖子

随机列表

大家在看