版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《数据库原理与应用》任务3.3子查询处理电力调度管理系统业务数据项目3数据查询与管理主讲人:刘培林第10讲
定制化查询你的数据(3)在任务3.2中,通过连接查询获取了用电数据的详细信息,本任务进一步处理数据,辅助决策分析。查询T_CONSUME和T_USERINFO表,返回用电值高于所在街道用电平均值的用户用电情况。素质目标能力目标知识目标1)理解嵌套子查询与相关子查询的区别,掌握嵌套子查询与相关子查询的用法。2)理解标量子查询与表子查询的返回值,掌握标量子查询和表子查询的用法。3)了解派生表子查询的概念。4)掌握<PIVOT子句>的用法。1)能够正确理解嵌套子查询与相关子查询的区别,根据应用要求正确应用嵌套子查询与相关子查询。2)能够正确理解标量子查询与表子查询的返回值的区别与联系,根据应用要求正确使用表子查询的运算符。3)能够使用<PIVOT子句>将行数据转换为列数据。培养善于抓住问题关键,能够找准重点,正确分析与解决问题的创新素质。一个<SELECT-FROM-WHERE语句>称为一个查询块,如果在一个查询块中嵌套了查询块,称这种被嵌套的查询块为子查询。根据子查询的返回结果,子查询可分为标量子查询(只返回一行一列)和表子查询(可返回多行多列)。子查询语法格式如下。<子查询>::=(<查询表达式>)子查询是嵌入括弧的<查询表达式>,有以下限制:1)子查询允许TEXT类型与CHAR类型值比较。比较时,取出TEXT类型字段的最多32767字节与CHAR类型字段进行比较;2)在子查询中允许嵌套子查询。嵌套了子查询的查询块称为父查询,根据子查询按与父查询是否具有依赖关系,又可以将子查询分为嵌套子查询和相关子查询。嵌套子查询不依赖父查询独立执行,查询执行的结果可能是标量,也可能是表子,父查询直接使用子查询的查询结果。子查询与父查询相关联,含有一个外部引用时,称为相关子查询。3.3.1标量子查询标量子查询的结果是一个标量,即单列单行的数值。这个数值可以应用在数值能够使用的任意场景,例如应用在关系运算符(=、>、<、>=、<=、<>、!=、!<、!>等)的运算中。1嵌套子查询【例3-50】查询T_CONSUME表,返回用电值大于等于总平均值的用户及其用电情况。第1步:查询T_CONSUME表,查找出总的用户用电平均值。SELECTAVG(CONSUME_NUM)FROMEPDMS.T_CONSUME;查询后返回单列单行的标量用电平均值:150.71。第2步:在父查询的WHERE子句中,用CONSUME_NUM列值与子查询得到的总的平均值150.71进行比较。SELECTCONSUME_ID,CONSUME_NUM,USER_IDFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>=150.71;将上述两步合并成一条嵌套子查询语句。SELECTCONSUME_ID,CONSUME_NUM,USER_IDFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>=(SELECTAVG(CONSUME_NUM)ASACONSUME_NUMFROMEPDMS.T_CONSUME);【例3-51】查询T_USERINFO表,返回与“张玮”在同一个街道的用户。第1步:查询T_USERINFO表,查找出“张玮”所在的街道编码。SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮';查找后返回单列单行的标量街道编码:10101。第2步:在父查询的WHERE子句中,用COMMUNITY_ID列值与子查询得到的值10101进行比较。SELECT*FROMEPDMS.T_USERINFOWHERECOMMUNITY_ID='10101';将上述两步合并成一条嵌套子查询语句。SELECT*FROMEPDMS.T_USERINFOWHERECOMMUNITY_ID=(SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮');2相关子查询相关子查询的查询条件依赖于外部父查询中的某个字段值。因此,相关子查询中的子查询不能单独运行,子查询的执行过程也与嵌套子查询不同,嵌套子查询中的子查询只执行一次,相关子查询中的子查询需要重复地执行,具体过程如下。第1步,父查询执行一次,并将查询引用字段的执行结果值传递给子查询,执行子查询。第2步,如果子查询中的任何元组能够与其匹配,父查询就返回结果元组。第3步,回到第1步继续处理,直至处理完父查询的每一个元组。【例3-52】查询T_CONSUME表,返回用电量高于自己用电平均值的用户用电情况。本例与例3-50的不同之处在于用电平均值是每一个用户自己的平均值,与当前被查询的用户相关,不是一个固定值,所以需要使用相关子查询。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMET1WHERET1.CONSUME_NUM>(SELECTAVG(CONSUME_NUM)FROMEPDMS.T_CONSUMET2
WHERET2.USER_ID=T1.USER_ID);相关子查询常常是同一张表的重复使用,所以需要为表指定不同的别名。本例中,T1和T2分别是外部父查询和内部子查询中T_CONSUME表的别名。内部子查询是求一个用户用电的平均值,至于求哪个用户的平均值要看参数T1.USER_ID的值,该值是与父查询相关的。本例查询的执行过程分析如下。第1步,从父查询中取出T_CONSUME表的一个元组R,将元组R的USER_ID的值(如“1000000001”)传递给子查询,查询这个元组的用电平均值。SELECTAVG(CONSUME_NUM)FROMEPDMS.T_CONSUMET2WHERET2.USER_ID='1000000001';第2步,执行子查询,得到该用户的用电平均值182.95125,用该值替代子查询,得到父查询。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMET1WHERET1.CONSUME_NUM>182.95125ANDT1.USER_ID='1000000001';第3步,执行这个查询,得到查询结果。第4步,父查询取出下一个元组,重复步骤1~3,直到外层T_CONSUME表的元组全部处理完毕。通过比较例3-50和例3-52的查询执行过程可以发现,例3-50嵌套子查询共需执行2次查询,一次是子查询,另一次是外部父查询。例3-52相关子查询共需执行N+1次查询,外部父查询还是只执行一次,但是,针对父查询的每一个值都需要执行一次子查询,子查询需执行N次,所以一共需要执行N+1次查询。3.3.2表子查询表子查询的执行结果一般是多行多列,也即是一张表,标量子查询也可以看作是只有一行一列的表子查询的特殊情况。表子查询可以使用ALL、ANY(与SOME同义)、IN/NOTIN和EXISTS/NOTEXISTS运算符。1IN/NOTIN运算符同IN/NOTIN谓词,限定查询的取值范围。【例3-53】实现例3-51同样功能,查询T_USERINFO表,返回与“张玮”在同一个街道的用户。第1步,查询T_USERINFO表,查找出“张玮”所在的街道编码。SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮';第2步,在父查询的WHERE子句中,将COMMUNITY_ID列值用IN运算符与子查询得到的表进行比较,得到嵌套子查询。SELECT*FROMEPDMS.T_USERINFOWHERECOMMUNITY_IDIN(SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮');【例3-54】查询T_CONSUME和T_USERINFO表,返回“10101”街道用户的用电消费情况。第1步,查询T_USERINFO表,查找出“10101”街道的用户。SELECTUSER_IDFROMEPDMS.T_USERINFOWHERECOMMUNITY_ID='10101';第2步,在父查询的WHERE子句中,将USER_ID列值用IN运算符与子查询得到的表进行比较,得到嵌套子查询。SELECT*FROMEPDMS.T_CONSUMEWHEREUSER_IDIN(SELECTUSER_IDFROMEPDMS.T_USERINFOWHERECOMMUNITY_ID='10101');【例3-55】查询T_CONSUME和T_USERINFO表,返回与“张玮”处在同一个街道的用户的用电情况。第1步,查询T_USERINFO表,查找出“张玮”所在的街道编码。SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮';第2步,查询T_USERINFO表,查找出“10101”街道的用户。SELECTUSER_IDFROMEPDMS.T_USERINFOWHERECOMMUNITY_IDIN(SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮');第3步,在父查询的WHERE子句中,将USER_ID列值用IN运算符与子查询得到的表进行比较,得到嵌套子查询语句。SELECT*FROMEPDMS.T_CONSUMEWHEREUSER_IDIN(SELECTUSER_IDFROMEPDMS.T_USERINFOWHERECOMMUNITY_IDIN(SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮'));运行后返回“10101”街道用户的32条用电消费记录,参见图3-56。本例使用了三层嵌套查询方式,首先通过最内层子查询从T_USERINFO表中查出街道编码,然后从T_USERINFO表中查询出属于这个街道的用户,最后在最外层查询出这些用户的用电情况。当然,本例也可用三个表的内连接来完成,代码如下。SELECTT_CONSUME.*FROMEPDMS.T_CONSUMEJOINEPDMS.T_USERINFOT1ONT1.USER_ID=T_CONSUME.USER_IDJOINEPDMS.T_USERINFOT2ONT1.COMMUNITY_ID=T2.COMMUNITY_IDANDT2.USER_NAME='张玮';对比代码可见,嵌套子查询逐步求解的特点使得查询层次更为清晰,更易于阅读和理解,具有结构化程序设计的优点。在IN运算符前添加NOT关键字,可以得到取反运算。【例3-56】修改例3-53,查询T_USERINFO表,返回与“张玮”不在同一个街道的用户。在例3-53代码的IN运算符前加NOT关键字即可。SELECT*FROMEPDMS.T_USERINFOWHERECOMMUNITY_IDNOTIN(SELECTCOMMUNITY_IDFROMEPDMS.T_USERINFOWHEREUSER_NAME='张玮');当子查询为值列表时,与IN/NOTIN谓词一样,有以下使用注意事项:1)值列表需要用括号括起来;2)值列表之间用逗号进行分割;3)每一个值列表的个数与查询列的个数必须相同。【例3-57】查询T_USERINFO表,返回“10101”街道的“张”姓用户的信息。SELECT*FROMEPDMS.T_USERINFOWHERE(COMMUNITY_ID,USER_ID)IN(SELECTCOMMUNITY_ID,USER_IDFROMEPDMS.T_USERINFOWHEREUSER_NAMELIKE'张%'ANDCOMMUNITY_ID='10101');2ALL运算符ALL定量比较要求的语法格式如下:
<标量表达式><比较算符>ALL<表子查询>1)<标量表达式>可以是对任意单值计算的表达式;2)<比较算符>包括=、>、<、>=、<=或<>。运算规则如下:1)若表子查询返回0行,则返回TRUE。2)若比较算符对于表子查询返回的每一行都为TRUE,则返回TRUE。3)若比较算符对于表子查询返回中有一行是FALSE,则返回FALSE。
=<>
<
<=>
>=ALL不存在NOTIN<MIN<=MIN>MAX>=MAX【例3-58】查询T_CONSUME表,返回比每一个用户用电平均值都高的用户的用电情况。第1步,查询T_CONSUME表,分组统计出每一个用户的用电量平均值。SELECTAVG(CONSUME_NUM)
FROMEPDMS.T_CONSUMEGROUPBYUSER_ID;第2步,在父查询的WHERE子句中,用ALL运算符比较用户用电量与各用户的用电量平均值。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>ALL(SELECTAVG(CONSUME_NUM)FROMEPDMS.T_CONSUMEGROUPBYUSER_ID);如果结合集函数来实现本例,步骤如下。第1步,查询T_CONSUME表,查找出每一个用户的用电量平均值的最大值。SELECTMAX(AVG(CONSUME_NUM))FROMEPDMS.T_CONSUMEGROUPBYUSER_ID;返回每一个用户的用电量平均值的最大值215.856。第2步,在父查询的WHERE子句中,用比较运算符比较用户用电量与所有用户的用电量平均值的最大值。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>(SELECTMAX(AVG(CONSUME_NUM))FROMEPDMS.T_CONSUMEGROUPBYUSER_ID);【例3-59】查询T_CONSUME表,返回比“1000000001”用户用电量都高的用户用电情况。第1步,查询T_CONSUME表,返回“1000000001”用户的用电情况。SELECTCONSUME_NUMFROMEPDMS.T_CONSUMEWHEREUSER_ID='1000000001';第2步,在父查询的WHERE子句中,用ALL运算符比较用户用电量与“1000000001”用户的用电量。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>ALL(SELECTCONSUME_NUMFROMEPDMS.T_CONSUMEWHEREUSER_ID='1000000001');
如果用集函数实现,代码如下。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>(SELECTMAX(CONSUME_NUM)FROMEPDMS.T_CONSUMEWHEREUSER_ID='1000000001');【例3-60】拓展例3-54,查询T_USERINFO表和T_CONSUME表,返回比“10101”街道用户用电量都低的用户用电情况。第1步,参考例3-54,获取10101街道用户的用电消费情况。第2步:在父查询的WHERE子句中,用ALL运算符比较用户用电量与“10101”街道用户的用电量。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM<ALL(SELECTCONSUME_NUMFROMEPDMS.T_CONSUME WHEREUSER_IDIN(SELECTUSER_IDFROMEPDMS.T_USERINFOWHERECOMMUNITY_ID='10101'));调试小技巧,可以通过增加ORDERBY子句排序查询结果,从而查看用电量的最小值。如果用集函数实现,代码如下。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM<(SELECTMIN(CONSUME_NUM)FROMEPDMS.T_CONSUMEWHEREUSER_IDIN(SELECTUSER_IDFROMEPDMS.T_USERINFOWHERECOMMUNITY_ID='10101'));3ANY(或SOME)运算符ANY或SOME定量比较要求的语法如下:<标量表达式><比较算符>ANY|SOME<表子查询>1)<标量表达式>可以是对任意单值计算的表达式;2)<比较算符>包括=、>、<、>=、<=或<>。SOME和ANY是同义词,运算规则如下。1)若表子查询返回0行,则返回FALSE。2)若比较算符对于表子查询返回的每一行都为FALSE,则返回FALSE。3)若比较算符对于表子查询返回中有一行是TRUE,则返回TRUE。
=<>
<
<=>
>=ANYIN不存在<MAX<=MAX>MIN>=MIN【例3-61】查询T_CONSUME表,返回比某一个用户用电平均值高的用户的用电情况。第1步,参考例3-58,查询T_CONSUME表,分组统计出每个用户的用电量平均值。第2步,在父查询的WHERE子句中,用ANY运算符比较用户用电量与各用户的用电量平均值。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>ANY(SELECTAVG(CONSUME_NUM)FROMEPDMS.T_CONSUMEGROUPBYUSER_ID);
如果用集函数实现,代码如下。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM>(SELECTMIN(AVG(CONSUME_NUM))FROMEPDMS.T_CONSUMEGROUPBYUSER_ID);将本例查询结果与例3-58查询结果进行比较可以发现,本例查询返回的记录数较例3-58更多,由集函数实现也可见,本例与例3-58不同,本例是与用电平均值的最小值进行比较。
【例3-62】查询T_CONSUME表,返回与某一个用户用电平均值相等的用户的用电情况。修改例3-61,将大于运算符修改为等号(=)运算符即可,代码如下。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEWHERECONSUME_NUM=ANY(SELECTAVG(CONSUME_NUM)FROMEPDMS.T_CONSUMEGROUPBYUSER_ID);运行后没有返回记录,表明不存在这样的记录。4EXISTS运算符EXISTS运算符测试集合的非空性,运算规则如下。1)若表子查询返回0行,则返回FALSE。2)若表子查询返回一行或多行,则返回TRUE。NOTEXISTS运算符是EXISTS运算符的取反,运算规则如下。1)若表子查询返回0行,则返回TRUE。2)若表子查询返回一行或多行,则返回FALSE。EXISTS/NOTEXISTS子查询只返回真值或假值,给出列名亦无实际意义,所以EXISTS/NOTEXISTS子查询的列名常用“*”表示。
【例3-63】用EXISTS运算实现例3-51,查询T_USERINFO表,返回与“张玮”属于同一个街道的用户信息。SELECTT1.*FROMEPDMS.T_USERINFOT1WHEREEXISTS(SELECT*FROMEPDMS.T_USERINFOT2WHERET2.USER_NAME='张玮'ANDT1.COMMUNITY_ID=T2.COMMUNITY_ID);
本例中,父查询可以不直接引用子查询的结果值,只检查子查询是否返回了记录,可以使用EXISTS运算符,查询过程分析如下。在子查询中通过连接表达式T1.COMMUNITY_ID=T2.COMMUNITY_ID,将别名为T1与T2的两个用户信息表T_USERINFO作自连接。先从父查询T1表中第1条记录开始,取出街道编码T1.COMMUNITY_ID,通过子查询中的自连接表达式T1.COMMUNITY_ID=T2.COMMUNITY_ID找到子查询T2表中同街道用户的记录,并通过条件表达式T2.USER_NAME='张玮'判断该街道中是否存在用户“张玮”,如果存在则子查询结果非空,EXISTS判断为真,此时应将父查询T1表中当前记录添加到与“张玮”同街道用户的集合中去。然后再对T1表中第2条记录作上述处理,直到最后一条记录为止。程序运行结果表明用EXISTS运算符实现例3-51正确。3.3.3派生表子查询派生表子查询是一种特殊的表子查询,查询表达式返回的表可以起别名和定义表结构,称为派生表,派生表可以被<FROM子句>使用。<FROM子句>中可以包含一个或多个派生表,派生表嵌套层次不能超过60层。【例3-71】由T_CONSUME表生成用户用电数量和的派生表,查询T_USERINFO表和派生表,返回用户所属区域、用户编码和用户用电的数量和,按区号排序查询结果。第1步,分组查询T_CONSUME表,返回用户用电数量和。SELECTUSER_ID,SUM(CONSUME_NUM)FROMEPDMS.T_CONSUMEGROUPBYUSER_ID;第2步,由用户用电数量和子查询生成派生表T2,查询T_USERINFO表和派生表T2,并用等值连接连接两表,返回需要的数据,最后排序查询结果。SELECTT1.COMMUNITY_ID,T1.USER_ID,T2.NUMFROMEPDMS.T_USERINFOT1,
(SELECTUSER_ID,SUM(CONSUME_NUM)FROMEPDMS.T_CONSUMEGROUPBYUSER_ID)AST2(USER_ID,NUM)WHERET1.USER_ID=T2.USER_IDORDERBYT1.COMMUNITY_ID;3.3.4转换行数据<PIVOT子句>将一组数据从行转换为列,语法格式如下:<PIVOT子句>::=PIVOT[XML](<set_func_clause>FOR<pivot_for_clause>IN(<pivot_in_clause>))<set_func_clause>::=<集函数>[[AS]<别名>]{,<集函数>[[AS]<别名>]}<pivot_for_clause>::=<列名>|(<列名>{,<列名>})参数说明如下。1)XML指定使用XML格式输出数据。2)<set_func_clause>指定对表或视图中的字段使用集函数。3)<pivot_for_clause>指定表或视图的原始列名。
4)<pivot_in_clause>对<pivot_for_clause>指定列中的数据进行筛选,指定的数据值或别名将作为转换后新列的列名。支持以下三种筛选方式:1)<exp_clause>直接指定<pivot_for_clause>列中的数据值,<表达式>即实际数据值,仅支持常量表达式。2)<select_clause>使用子查询语句选取<pivot_for_clause>列中的数据值,仅在指定XML时生效;3)ANY指定<pivot_for_clause>列中的所有数据值,仅在指定XML时生效。
使用注意事项如下:1)使用多个集函数时,必须为每个集函数指定别名。2)在<pivot_for_clause>或<exp_clause>中,针对多个<列名>或<表达式>时,必须使用小括号将其括起来;针对单个<列名>或<表达式>,使用或者不使用小括号均可。3)指定的<集函数>个数与<pivot_in_clause>中表达式个数的乘积不能超过2048。4)指定XML时,结果集返回类型为TEXT。5)<PIVOT子句>中未涉及的所有查询项,都将作为分组项。6)不支持<FORUPDATE子句>。
【拓展例1】查询T_CONSUME表,使用PIVOT子句,将表中CONSUME_DATE列的3个日期('2024-06-25','2024-06-26','2024-06-27')所对应的行数据转换为列数据,并汇总各日期的用电量。SELECT*FROMEPDMS.T_CONSUMEPIVOT(SUM(CONSUME_NUM)FORCONSUME_DATEIN('2024-06-25','2024-06-26','2024-06-27'));<PIVOT子句>中未提及的所有查询项都将作为分组项,因此上述语句的分组项为CONSUME_ID、USER_ID和REMARK,查询结果如图所示。
<PIVOT子句>所在层级的<SELECT子句>的查询项应当未出现在<PIVOT子句>中,或为“*”,否则将报错。例如,执行以下语句,<SELECT子句>的查询项在<PIVOT子句>中,将报CONSUME_NUM无效列名的错误,如左图所示,因为CONSUME_NUM出现在了<PIVOT子句>中,不能再在<PIVOT子句>所在层级的<SELECT子句>的查询项中出现。SELECTUSER_ID,CONSUME_NUMFROMEPDMS.T_CONSUMEPIVOT(SUM(CONSUME_NUM)FORCONSUME_DATEIN('2024-06-25','2024-06-26','2024-06-27'));将<SELECT子句>的CONSUME_NUM查询项去掉即可正确执行。但是执行结果只显示USER_ID列,如右图所示,并不是期望的结果。为了解决这一问题,可以将T_CONSUME表用查询生成派生表,在派生表中仅保留需要的列。这里分组的列是USER_ID,使用集函数的列是CONSUME_NUM,转换的列是CONSUME_DATE,仅保留需要列的查询代码如下。SELECTUSER_ID,CONSUME_NUM,CONSUME_DATEFROMEPDMS.T_CONSUME;查询后返回全部352条记录。对派生表进行转换,生成最终查询代码如下。SELECT*FROM(SELECTUSER_ID,CONSUME_NUM,CONSUME_DATEFROMEPDMS.T_CONSUME)PIVOT(SUM(CONSUME_NUM)FORCONSUME_DATEIN('2024-06-25','2024-06-26','2024-06-27'));这里仅是使用派生表的概念,因为查询的层次关系,并不能完整使用派生表的语法。可以在<IN子句>中为每个数据值指定别名,指定的别名将作为转换后各列的列名。例如,可以为'2024-06-27'列指定一个别名,指定别名后代码如下。SELECT*FROM(SELECTUSER_ID,CONSUME_NUM,CONSUME_DATEFROMEPDMS.T_CONSUME)PIVOT(SUM(CONSUME_NUM)FORCONSUME_DATEIN('2024-06-25','2024-06-26','2024-06-27'AS结算日));可以使用多个集函数,此时需要为每个集函数指定别名。例如,还可以统计各日期的用户数据,代码如下。SELECT*FROM(SELECTUSER_ID,CONSUME_NUM,CONSUME_DATEFROMEPDMS.T_CONSUME)PIVOT(SUM(CONSUME_NUM)AS电量和,COUNT(USER_ID)AS用户数FORCONSUME_DATEIN('2024-06-25'AS结算日1,'2024-06-26'AS结算日2,'2024-06-27'AS结算日3));[任务实施]
1技术分析1)T_CONSUME表不含COMMUNITY_ID字段,需要用到派生表。2)用户用电值与用户所在街道的用电的平均值进行比较,是典型的相关子查询。[任务实施]
2实现步骤1)连接T_CONSUME表和T_USERINFO表,返回包含用户所属街道编码的用户用电情况子查询,代码如下。SELECTT1.COMMUNITY_ID,T1.USER_ID,T2.CONSUME_NUM
FROMEPDMS.T_USERINFOT1,EPDMS.T_CONSUMET2WHERET1.USER_ID=T2.USER_ID;[任务实施]
2)将包含用户所属街道编码的用户用电情况子查询作为派生表(命名为MT1),查询派生表,返回包含街道编码的、以街道编码分组统计的用电平均值子查询,代码如下。SELECTMT1.COMMUNITY_ID,AVG(MT1.CONSUME_NUM)FROM(SELECTT1.COMMUNITY_ID,T1.USER_ID,T2.CONSUME_NUMFROMEPDMS.T_USERINFOT1,EPDMS.T_CONSUMET2WHERET1.USER_ID=T2.USER_ID)
ASMT1(COMMUNITY_ID,USER_ID,CONSUME_NUM)GROUPBYCOMMUNITY_ID[任务实施]
3)将包含街道编码和以街道编码分组统计的用电平均值子查询作为派生表(命名为MT2),用相关子查询查询派生表MT1和MT2。首先将步骤2的查询变成派生表,并命名为MT2,用派生表MT1和MT2根据题目要求做相关子查询,代码框架如下。SELECTMT1.COMMUNITY_ID,MT1.USER_ID,MT1.CONSUME_NUMFROMMT1WHEREMT1.CONSUME_NUM>(SELECTMT2.AVG_NUMFROMMT2WHEREMT2.COM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位笔试-辽宁-辽宁西药学(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-甘肃-甘肃血液内科(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-海南-海南耳鼻喉科(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-浙江-浙江放射医学(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-河南-河南审计学(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-河北-河北儿科学(医疗招聘)历年参考题库含答案详解
- 2026事业单位笔试-江西-江西儿科学(医疗招聘)历年参考题库含答案详解
- 《奇特的视觉图形》课件
- 《蝴蝶的启示》课件
- 2026-2027学年初中物理九年级全一册(新教材)北师大版(李春密)(新教材)寒假专区课时过关卷
- 医院神经内科护理常规管理制度
- 2026江苏省安全员b证考试试题及答案
- 北科大冶金工程实验指导
- 第十五章 轴对称 数学活动 课件 2025-2026学年人教版数学八年级上册
- 2025年10月自考13683管理学原理中级试题及答案
- 有源医疗器械风险管理分析报告-2024年-42062-2022,9706.1-2020
- 奶茶店食品安全规章制度
- 浙江省衢州市六校联谊2026届九年级物理第一学期期中监测试题含解析
- 第14课 明至清中叶的经济与文化 课件 中外历史纲要(上)
- QC/T 29018-2025汽车碳氮共渗齿轮金相检验
- 兽医生物制品试题及答案
评论
0/150
提交评论