大家来学数据库(非学院派,实战派修炼法)
如果想变成从大到小,在字段名后面加 desc,desc 只对跟随的字段名有效,从小到大与从大到小可以混杂。粗一看有点小奇怪,为什么Z3没安排倒排,却也出现类似倒排的效果?在数据库中,在排序前,通过连接形成的记录,同一行(一条记录)各字段永远在一行,排序时同进同退,永不分离。排序时,写在前面的字段优先,再考虑写在后面的字段。
前面那个可能还觉得没啥用,这个看出什么奥秘了吗?
数据库里,一条记录里(同一行)计算使用公式很简单,跨记录(跨行)就比较麻烦了。理解了这个,你就打开了思路和想象空间。也就容易理解,为什么一直强调交叉连接是连接之母。
数据库里,一条记录里(同一行)计算使用公式很简单,跨记录(跨行)就比较麻烦了。理解了这个,你就打开了思路和想象空间。也就容易理解,为什么一直强调交叉连接是连接之母。
25楼中,出现好像是本行Z1跟上一行SZ1相加的效果,这种效果在Excel里倒很容易做到。当然其原理跟Excel的公式完全不同。不管怎么说,数据库中同一条记录跨字段处理很方便,但跨记录,数值型可以用 sum 求和,文本型就没函数可用了。好在它提供了一种特殊方法实现文本的跨记录合并,请看效果:
这里,开始出现多语句,多语句增添了巨大的灵活性。有了多语句,就可以用declare定义变量,用 set/select 给变量赋值,有点像编程的味道了。注意变量定义后要先赋值,否则其初始值是空值,得到的结果也会是空值。
这里,开始出现多语句,多语句增添了巨大的灵活性。有了多语句,就可以用declare定义变量,用 set/select 给变量赋值,有点像编程的味道了。注意变量定义后要先赋值,否则其初始值是空值,得到的结果也会是空值。
@久依沙盘 2019-08-15 07:16:23
我们借助8楼的技巧展示25楼的实现原理。25楼似乎清楚了,谁愿意讲讲这金字塔是怎么建造的?
-----------------------------
此处8楼笔误,应该是28楼。
我们借助8楼的技巧展示25楼的实现原理。25楼似乎清楚了,谁愿意讲讲这金字塔是怎么建造的?
-----------------------------
此处8楼笔误,应该是28楼。
从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
咋一看,这不是多此一举吗?其实不然,正常情况下数据库只是开发人员使用,用户通过前端程序跟数据库打交道。如果不用存储过程,大量的语句就写在程序源代码里,造成程序很臃肿,增加程序与数据库交互的工作量,也影响运行速度。改用存储过程后,程序可大幅瘦身,而且很多改进可以通过修改存储过程而不必修改源代码,好处实在太多了。
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
咋一看,这不是多此一举吗?其实不然,正常情况下数据库只是开发人员使用,用户通过前端程序跟数据库打交道。如果不用存储过程,大量的语句就写在程序源代码里,造成程序很臃肿,增加程序与数据库交互的工作量,也影响运行速度。改用存储过程后,程序可大幅瘦身,而且很多改进可以通过修改存储过程而不必修改源代码,好处实在太多了。