当前位置:学学看123知识中心电脑教学数据库教程select - SQL的工作流程» 正文

select - SQL的工作流程

[06-11 18:16:40]   来源:http://www.xxk123.com  数据库教程   阅读:8985

导读:命令过程也和上一个要求那样,先进行联接,只是这条命令的中间临时表比上面更大,因为是三个表的记录数相乘。但经过联接条件过滤后,就会剩下这些内容:001022000/01/150200113002022000/01/150200214003012000/01/020100315004nullnullnullnullnull005012000/01/020100512005022000/01/150200520然后也一样进行分组,分组时的判断过程也一样,只是在累加的时候有点不同:sum(iif(isnull(thdmx.thsl),0,thdmx.thsl)),是先用isnull(thdmx.thsl)检查thsl是不是null,如果是,则iif()就返回0,如果不是,则返回thdmx.thsl。然后外层的sum()就根据iif()返回的数值进行累加,最后做为这个分组的累加值。还有一种使用方法,说出来也可以加深命令当中的sum()函数的处理过程。人事表rsb:姓名xm年龄age张三25李四32王五28现在想统计一下各个年龄段(20-30,31-40)的人数是多少。sele

select - SQL的工作流程,标签:sql数据库教程,access数据库教程,http://www.xxk123.com

命令过程也和上一个要求那样,先进行联接,只是这条命令的中间临时表比上面更大,因为是三个表的记录数相乘。但经过联接条件过滤后,就会剩下这些内容:

001022000/01/150200113002022000/01/150200214003012000/01/020100315004nullnullnullnullnull005012000/01/020100512005022000/01/150200520

然后也一样进行分组,分组时的判断过程也一样,只是在累加的时候有点不同:

sum(iif(isnull(thdmx.thsl),0,thdmx.thsl)),是先用isnull(thdmx.thsl)检查thsl是不是null,如果是,则iif()就返回0,如果不是,则返回thdmx.thsl。然后外层的sum()就根据iif()返回的数值进行累加,最后做为这个分组的累加值。

还有一种使用方法,说出来也可以加深命令当中的sum()函数的处理过程。

人事表rsb:

姓名xm年龄age张三25李四32王五28

现在想统计一下各个年龄段(20-30,31-40)的人数是多少。

sele sum(iif(betw(age,20,30),1,0) as _20-30,sum(iif(betw(age,31,40),1,0) as _31-40 ;  from rsb ;  grou by zc ;  into curs temp1

因为这条命令没有过滤条件、联接,所以不需事先预处理,一来就进行分组。和投票中点票一样,在"黑板"上写划出三列:

    zc        _20-30        _31-40

这样,在rsb中从头扫到尾时,每经过一记录时,都用iif(betw(age,20,30),1,0)检查这个人的年龄是不是处于20-30,如果是就在_20-30这一列下面加一横,否则就不加。第二个iif()也这样处理。如果当前的年龄是53,那二个iif()都是返回0,即二列都不加,相当于废票。全部记录都点完了,然后就用sum()进行合计了,结果就出来了。

因为二个sum()都是扫描完后再合计的,它不象sum命令。sum命令会移动记录指针,而sum()函数不会,所以不必怕使用这个函数会造成不良后果。而且二个iif()都有自己的判断条件,两者不互相重合,所以一个记录不会重复计算(除非你的命令设计错了。)

如果使用union参数把两条运算结果的格式一模一样的命令合在一起,那也是一样的。它是把其中的每一节select命令单独运行(它单独运行时的运行流程跟上面说的一样),最后才把每一节的结果首尾相接后,再根据最后那节的orde by进行排序。所以一条带union的SQL命令,只能有一个orde by。而每一节select命令,却可以有自己的grou by,它自己的grou by只对这一节有影响,是不会影响到其它节的运算的。更不会对最后结果有影响。

这里举个例子:我想统计一段时间内的提货、进货情况。这里要涉及到5个表:产品表、提货表、提货明细表、进货表、进货明细表:

sele cpbh,sum(thdmx.thsl) as thsl,100000-100000 as jhsl ;  from thd join thdmx ;    on thd.thdbh=thdmx.thdbh ;  grou by cpbh ;union ;sele cpbh,0,sum(jhdmx.jhsl) ;  from jhd join jhdmx ;    on jhd.jhdbh=jhdmx.jhdbh ;  grou by cpbh ;  orde by cpbh ;  into curs temp1

如果看了上面的解释,应该可以理解每一节SQL命令的意思。这里要说的是:

1、union要求前后两节SQL命令产生的表,在结构上要完全一样,包括字段的顺序也要一样。所以为了达到这个要求,在第一节,就要人为建立一个字段jhsl,而在第二节命令,也要建立一个字段thsl以对应。

2、用SQL产生的表,它不象crea table那样可以直接指定字段的类型、长度,而是在根据生成的临时表中第一个记录的长度来确定的。所在在第一节,如果不使用100000-100000而是直接使用0,这样产生的jhsl这个字段,它的长度就只有2个字节了。所以只有使用这种方法,才能使得这个字段的长度有7字节。在字符串也有这样情况,如果第一个记录的长度是12个字节,那以后的记录中,超过12个字节的内容就会给它去掉,这就是为什么有时在结果表中会出现字符串不完整的情况。解决方法也差不多,在字段列表那里人空加几个空格去。

上一页  [1] [2] 


Tag:数据库教程sql数据库教程,access数据库教程电脑教学 - 数据库教程

Copyright 学学看123 All Right Reserved.

1 2 3 4 5 6 7 8 9 10