关于groupby⼦句使⽤的注意事项
当查询中存在group by⼦句时,select列表(或是having⼦句)中只能存在分组函数,或是出现在group by⼦句中的字段。
groupby是什么函数这⾥说的,“出现在group by⼦句中的字段”具体有两种形式出现:
1、select列表⾥直接出现⼀个以该字段名为列名的列,如:
select  La from test group by La;
1、select列表⾥出现⼀个⾮分组函数的函数的列,如:
select  La ,contact(La,La)from test group by La;
select  La ,contact(La,‘two’)from test group by La;
select  La ,contact(La,&tt)from test group by La;
注释:
当查询中存在group by⼦句时,⾮分组函数的参数值只能是from⼦句⾥各个表中出现在group by⼦句中的字段(变量)。⽽from⼦句⾥各个表中不出现在group by⼦句中的字段(变量)则不能为⾮分组函数的参数值,此时。⽽其他不是属于在表定义的变量(即表的列)的的变量,如上述的替换变量&tt,则可以为⾮分组函数的参数值。常量,可以为⾮分组函数的参数值,此时。
总之,当查询中存在group by⼦句时,只有from⼦句⾥各个表中不出现在group by⼦句中的字段(变量)不能为⾮分组函数的参数值。
当查询中存在group by⼦句时,分组函数,其参数值可以来⾃from⼦句⾥各个表中不出现在group by⼦句中的字段(变量)。
当查询中存在group by⼦句时,select列表中出现在group by⼦句中的字段组合值都是不重复的⼀条。例如,
select  La,Lb from test;
La  Lb
--    ---
a    3
a    9
b    2
b    3
b  12
select  La,sum(Lb) from test group by La;
La    sum(Lb)
--      ---
a      12
b      17
test⾥La为a,b值都是多条,经过group by后,结果集⾥La为a,b值总是都为⼀条。
这⾥,以select  La,sum(Lb) from test group by La;为例⼦,来描述group by的处理过程。⼤概过程如下:
先对test表上的数据⾏按列La进⾏排序即order by,再对⾮在group by⼦句中的字段进⾏聚合函数操作(如果group by ⼦句所在select语句中存在聚合函数的话,会执⾏该步骤;不存在的话,就跳过不执⾏该步骤),这样,就对应输出⼀个列La的值(经过distinct操作这个步骤处理)和⼀个聚合函数返回值构成结果集A⾥的⼀⾏。聚合函数返回值都是⼀个的。
⽽select  La ,contact(La,‘two’)from test group by La;⾥的⾮分组函数contact所⽤的La的值是来⾃在该SQL语句中group by的处理过程执⾏完毕后对应输出的结果集A上⼀个列La的值,即⾮分组函数contact在结果集A基础上再进⾏处理获得该sql语句的最终⼀步结果集B。
再看如下例⼦,
SQL> select * from test;
COUNTRY CITY
-------------------- --------------------
中国台北
中国⾹港
中国上海
⽇本东京
⽇本⼤阪
定义⼀个函数
create or replace function str_list( str_in in varchar2 )--分类字段
return varchar2
is
str_list varchar2(4000) default null;--连接后字符串
str varchar2(20) default null;--连接符号
begin
for x in ( select TEST.CITY from TEST where TEST.COUNTRY = str_in ) loop
str_list := str_list || str || to_char(x.city);
str := ', ';
end loop;
return str_list;
end;
使⽤:
SQL> untry,str_untry) from test t GROUP untry;
COUNTRY STR_LIST(T.COUNTRY)
-------------------- -----------------------
中国台北, ⾹港, 上海
⽇本东京, ⼤阪
这个时候,使⽤分组和求唯⼀都可以满⾜要求。它的原理就是,根据唯⼀的分组字段country,在str_list函数⾥⾯再次查询该字段对应的所有被合并列,使⽤PL/SQL将其合并输出,也就是说,在str_list函数⾥执⾏的select TEST.CITY from TEST where TEST.COUNTRY = str_in这个sql语句(对表test再次做查询)和untry,str_untry) from test t GROUP untry; 这个sql语句是相当于相互独⽴的两个sql语句在执⾏,前者不受后者⾥有GROUP BY 的影响,在执⾏str_list函数(⾥的select TEST.CITY from TEST where TEST.COUNTRY = str_in这个sql语句)时,外层的untry,str_untry) from test t GROUP untry; 这个sql语句除了select⼦句还没执⾏完(select⼦句执⾏完就获得该select语句的最终结果集了)外,其他⼦句都已经执⾏完,
即 GROUP BY⼦句已经执⾏完获得了结果集A了,⽽外层的这个sql语句的select⼦句⾥执⾏的正是str_list函数。(select⼦句⾥的函数是否没查到⼀条数据⾏就⽴刻执⾏⼀次,⽽不是经过where等⼦句筛选出⼀个结果集后在执⾏,如case then?)
这两个sql语句也可以相当于前者是后者⾥的⼦查询,外层语句先开始执⾏,但⼦查询都是先于外层语句执⾏完毕的,故前者不受后者⾥有GROUP BY 的影响。(执⾏个带⼦查询和GROUP BY的查询语句试试,两层查询都对同个表?)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。