使用Group By注意事项
当查询中存在group by子句时,select列表(或是having子句)中只能存在分组函数,或是出现在group by子句中的字段。
这里说的,“出现在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> select t.country,str_list(t.country) from test t GROUP BY t.country;
COUNTRY STR_LIST(T.COUNTRY)
-------------------- -----------------------
中国 台北, 香港, 上海
日本 东京, 大阪
这个时候,使用分组和求唯一都可以满足要求。它的原理就是,根据唯一的分组字段country,在str_list函数里面再次查询该字段对应的所有被合并列,使用PL/SQL将其合并输出,也就是说,在str_list函数里执行的select TEST.CITY from TEST where TEST.COUNTRY = str_in这个sql语句(对表test再次做查询)和select t.country,str_list(t.country) from test t GROUP BY t.country; 这个sql语句是相当于相互独立的两个sql语句在执行,前者不受后者里有GROUP BY 的影响,在执行str_list函数(里的select TEST.CITY from TEST where TEST.COUNTRY = str_in这个sql语句)时,外层的select t.country,str_list(t.country) from test t GROUP BY t.country; 这个sql语句除了select子句还没执行完(select子句执行完就获得该select语句的最终结果集了)外,其他子句都已经执行完,即 GROUP BY子句已经执行完获得了结果集A了,而外层的这个sql语句的select子句里执行的正是str_list函数。(select子句里的函数是否没查到一条数据行就立刻执行一次,而不是经过where等子句筛选出一个结果集后在执行,如case then?)
这两个sql语句也可以相当于前者是后者里的子查询,外层语句先开始执行,但子查询都是先于外层语句执行完毕的,故前者不受后者里有GROUP BY 的影响。(执行个带子查询和GROUP BY的查询语句试试,两层查询都对同个表?)
使用Group By注意事项的更多相关文章
- SQL其他常用的语句
阅读目录 一:汇总数据 1.理解AVG函数 2.理解COUNT()函数 3.理解max()函数 4.理解min()函数 5.理解sum()函数 二:分组数据 1 创建分组(group by) 2 HA ...
- 分组查询以及having使用
Group by 注意事项:对查询的列有限制,除了聚合函数外,就必须是分组的项 order by总是放在最后 代码示例: select Gender as 性别 ,count (Gender) a ...
- MySQL数据表查询操作
准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...
- MySQL数据表查询操
准语法结构:编写DQL时一定要严格按照此语法的顺序来实现!/* SELECT [ALL | DISTINCT] ALL表示查询出所有的内容 DISTINCT 去重 {* | 表名.* | 表名.字段名 ...
- mysql-数据分组
一.创建分组 上面所讲的语句都是建立在表的所有数据或匹配特定的where子句的数据上进行的.是否能够进行分组,在进行汇总计算哪儿?例如:要想返回每个供应商提供的产品数目怎么办? 分组是在select语 ...
- MYSQL中GROUP BY不包含所有的非聚合字段时的注意事项
本文导读:在MYSQL中使用GROUP BY分组时,我们可以select 多个非聚合字段,但是这些字段不在GROUP BY中,这样的SQL查询在SQL SERVER.ORACLE中是不合理的,且会报错 ...
- Group by、having、order by、Distinct 使用注意事项
直奔主题,如下SQL语句 SELECT COUNT(*) AS COUNT,REQUEST,METHOD FROM REQUESTMETH GROUP BY REQUEST,METHOD HAVING ...
- SQL中group by的注意事项
最最最最重要的: group by有一个原则,就是select后面所有的列中,没有使用聚合函数的列,必须出现在group by子句中. group by子句中的注意事项: 1,不能使用别名(因为执行顺 ...
- MySQL中MAX函数与Group By一起使用的注意事项(转)
mysql> select * from test; +----+-------+------+-------+ | id | name | age | class | +----+------ ...
随机推荐
- GPU渲染和GDI
要实现这样一段逻辑,用GPU画3D图,用GDI画二维图元,怎么样效率高.相传Vista年代,是这样干的: 硬件渲染的东西在GPU上做完 读回CPU端 把GDI这些用软件渲染 两者混合 拷贝到显存显示 ...
- IOS7.0 UILabel实现自适应高度的新方法
//IOS7.0中利用- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attri ...
- Swift---- 可选值类型(Optionals) 、 断言(Assertion) 、 集合 、 函数
1 使用数组实现九宫格 1.1 问题 Swift提供经典的数组和字典两种集合类型来存储集合数据.本案例使用数组实现一个九宫格程序,如图-1所示: 图-1 1.2 方案 九宫格就是有一个n行n列的方格, ...
- 关于cookie 取不到值的问题
当前我们设置cookie时,跨路径的话,我们会取不到设置的cookie的值 我们要添加上path路径的值,就可以啦.(经过验证) path 的设置方法:path=/; function setcook ...
- Windows下Nginx的安装与配置
Nginx ("engine x") 是一款高性能的,轻量级的HTTP Web 服务器 和 反向代理服务器及电子邮件 IMAP/POP3/SMTP 代理服务器. Nginx 是由俄 ...
- java考核完的心得
2015年8月13日 星期四 晴 今天上午我们考核了java,就是用Java语言写一个小型的管理系统.考核前的我信心满满,因为我本身是测试专业的,觉得在开发这方面对自己不用要求的那么 ...
- 深入剖析ConcurrentHashMap(1)
转载自并发编程网 – ifeve.com本文链接地址: 深入剖析ConcurrentHashMap(1) ConcurrentHashMap是Java5中新增加的一个线程安全的Map集合,可以用来替代 ...
- Tomcat口令猜解工具【Python脚本】
Tomcat 服务器网页部署,登录需用户名/密码,编写了一个简单的Python脚本来测试一些简单的弱口令. 测试环境:Tomcat版本 7.0 登录界面采用basic认证,Base 64加密一下,模拟 ...
- python杂七杂八小问题
1.win7系统下,安装完GTK+后,从命令行界面无法启动ipython,提示“failed to create process”.运行easy_install也遇到了这个问题. 原因是安装GTK+时 ...
- Scala笔记整理
使用类型参数化数组(Array) 创建java.math.BigInteger实例: var big = new java .math.BigInteget("12345678") ...