您的位置:首页 > 数据库 > Oracle

oracle group by 深入理解

2012-09-01 22:05 253 查看
1、sql语句select的执行过程

(1)根据where字句的条件表达式,从from子句指定的基本表或视图中找到满足条件的元组。

(2)再按select子句中的目标列的表达式,选出元组的属性值形成结果表。

(3)如果有group子句,则将结果表按group中指定的列进行分组,该属性列值相等的元组为一组,通常会在每组中作用集函数。

(4)如果group子句带having短语,则只有满足having指定条件的组才输出。

(5)如果有order子句,则将结果表按order子句指定的列升序或降序排序。

2、group by 子句的将查询结果表按某一列或多列分组,值相等的为一组。对查询结果分组的目的是为了细化集函数的作用对象。如果未对查询结果分组,集函数将作用与整个查询结果。

(1)实验说明group的常见操作和错误

实验数据

SQL> select * from student;

ID CLASSNO NAME

---------- ---------- ------------------

1 1 张三

2 1 李四

3 1 王五

4 2 刘六

5 2 钱七

6 2 赵八

已选择6行。

问题1:查出一班的人数?

SQL> select count (*) from student where classno=1 group by classno;

COUNT(*)

----------

3

问题2:查人数的同时能不能把学生姓名也查出来呢?

SQL> select name ,count (*) from student where classno=1 group by classno;

select name ,count (*) from student where classno=1 group by classno

*

ERROR 位于第 1 行:

ORA-00979: 不是 GROUP BY 表达式

可见这个语句满足不了我们的目的,因为我们分组后,我们是对组进行操作,像学生姓名这列不是组能有的性质。

3、巧用 group 分组集函数

(1)问题的提出

SQL> select * from student1;

ID SID SNAME CLASSID D

---------- ---------- ---------- ---------- ----------

1 1 a 1 1

2 1 a 1 2

3 2 b 1 2

问题如下:

只是要生成excle表。只能对数据库做查询操作

想要的结果是:

ID SID SNAME CLASSID D

---------- ---------- ---------- ---------- ----------

1 1 a 1 1

3 2 b 1 2

这个问题怎么解决呢?

想到用distinct

select id ,distnict(sid ),sname , classid ,d from student1

可惜sql不支持distnict这中用法

sql中 只能select distnict id ,sid,sname ,classid ,d from student1

可这样不能满足我们的要求。

(2)巧用 group 分组集函数

SQL> select min(id),sid,sname,classid,min(d) from student1 group by sid,sname,classid;

MIN(ID) SID SNAME CLASSID MIN(D)

---------- ---------- ---------- ---------- ----------

1 1 a 1 1

3 2 b 1 1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: