group by语句,聚合函数与其他语句(关系,执行过程)
2012-04-09 10:23
330 查看
(本文一切基于SQL SERVER 2008 R2)
先来看一个语句执行过程发生的错误提示:
[html]
view plaincopy
消息 8120,级别 16,状态 1,第 2 行
选择列表中的列 'SC.CNO' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
元数据库为Stu_C,含有三个表,S、SC、C。执行的语句如下:
[sql]
view plaincopy
use Stu_C
select SNO,cno,sum(grade) sum_grade
from SC
where GRADE>=60
group by SC.SNO
having count(CNO)>=4
order by sum_grade desc
[sql]
view plaincopy
目的是检索选修4门课以上课程的学生总成绩(排除不及格的),并按总成绩的降序排列出来。根据提示我们容易知道,select语句中多了cno这个属性列。如果将其去掉执
行如下:
[sql]
view plaincopy
use Stu_C
select SNO,sum(grade) sum_grade
from SC
where GRADE>=60
group by SC.SNO
having count(CNO)>=4
order by sum_grade desc
[sql]
view plaincopy
结果:
[sql]
view plaincopy
<img src="http://hi.csdn.net/attachment/201111/8/0_132075203785L5.gif" alt="" />
[sql]
view plaincopy
分析及结论:
[sql]
view plaincopy
当使用group by子句时则select中关于表的原始属性名只能是被"by"的属性,如上例中的SNO。若想输出其他属性列,则应在select子句后加上相应的聚合函数(count(*),count(列名),sum(列名),avg(列名),max(列名),min(列名))。其实这也很容易理解,当参照SNO被分组后,每一个SNO的具体实例与其他任意一个属性都变成一对一或一对多的关系,只有通过聚合函数将每组其他想要的属性的多个实例算成一个值,即SNO与其形成一对一的关系后才能列出。而且一旦SQL语句中使用了group by子句后聚合函数都变成分别对每组起作用。
[sql]
view plaincopy
一条SQL语句个子句的先后作用过程:
from→where→group by→select(含聚合函数)→order
所以当select子句中含有sum(grade) sum_grade时,最后的排序子句可以是order by sum_grade desc。
先来看一个语句执行过程发生的错误提示:
[html]
view plaincopy
消息 8120,级别 16,状态 1,第 2 行
选择列表中的列 'SC.CNO' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
元数据库为Stu_C,含有三个表,S、SC、C。执行的语句如下:
[sql]
view plaincopy
use Stu_C
select SNO,cno,sum(grade) sum_grade
from SC
where GRADE>=60
group by SC.SNO
having count(CNO)>=4
order by sum_grade desc
[sql]
view plaincopy
目的是检索选修4门课以上课程的学生总成绩(排除不及格的),并按总成绩的降序排列出来。根据提示我们容易知道,select语句中多了cno这个属性列。如果将其去掉执
行如下:
[sql]
view plaincopy
use Stu_C
select SNO,sum(grade) sum_grade
from SC
where GRADE>=60
group by SC.SNO
having count(CNO)>=4
order by sum_grade desc
[sql]
view plaincopy
结果:
[sql]
view plaincopy
<img src="http://hi.csdn.net/attachment/201111/8/0_132075203785L5.gif" alt="" />
[sql]
view plaincopy
分析及结论:
[sql]
view plaincopy
当使用group by子句时则select中关于表的原始属性名只能是被"by"的属性,如上例中的SNO。若想输出其他属性列,则应在select子句后加上相应的聚合函数(count(*),count(列名),sum(列名),avg(列名),max(列名),min(列名))。其实这也很容易理解,当参照SNO被分组后,每一个SNO的具体实例与其他任意一个属性都变成一对一或一对多的关系,只有通过聚合函数将每组其他想要的属性的多个实例算成一个值,即SNO与其形成一对一的关系后才能列出。而且一旦SQL语句中使用了group by子句后聚合函数都变成分别对每组起作用。
[sql]
view plaincopy
一条SQL语句个子句的先后作用过程:
from→where→group by→select(含聚合函数)→order
by
所以当select子句中含有sum(grade) sum_grade时,最后的排序子句可以是order by sum_grade desc。
相关文章推荐
- group by语句,聚合函数与其他语句(关系,执行过程)
- EF增删查改加执行存储过程和sql语句,多种方法汇总
- oracle执行sql语句的过程
- 在搜索栏输入空格号就会出现一段执行过程的语句在网页上,烦
- Oracle数据库-where, group by, having, order by语句的执行顺序
- .NET Entity Framework(EF)使用SqlQuery直接操作SQL查询语句或者执行过程
- 对Group By 语句的一次优化过程
- MySql带参数的存储过程编写(动态执行SQL语句)
- 10PL_SQL过程之执行if语句
- 在ASP.NET中用存储过程执行SQL语句
- 在main函数前执行其他语句
- 对Group By 语句的一次优化过程
- mysql 存储过程 根据参数 动态执行sql语句
- [SQL] SQL语句,存储过程执行时间
- 存储过程中执行动态Sql语句
- 构造方法在继承关系时的执行过程
- SQLSERVER 存储过程里如何执行SQL语句
- Oracle学习之sql语句执行过程分析
- SQL语句的执行过程