Sunday, June 27, 2010

Group By语句和having语句的用法

更多精彩请到 http://www.139ya.com

http://www.cnblogs.com/tangjian/archive/2009/02/13/1390027.html

(11)GROUP BY子句
GROUP BY子句首先讲讲GROUP BY 子句语法: SELECT column1, SUM(column2)FROM
"list-of-tables"GROUP BY "column-list"; 这个GROUP BY子句将集中所有的行在一起,它包含了指定列的数据以及允许合计函数来计算一个或者多个列。当然最好解释的方法是给出一 个例子啦:假设我们将从employee表中搜索工资最高的列,可以使用以下的SQL语 句:SELECT max(salary), deptFROM employee GROUP BY dept; 这条语句将在每一个单独的部门中选择 工资最高的工资。结果他们的salary和dept将被返回。
(
12)HAVING子句
HAVING子句下面先给出HAVING子句的语法:SELECT column1, SUM(column2)FROM
"list-of-tables"GROUP BY "column-list"HAVING "condition"; 这个HAVING子句 允许你为每一个组指定条件,换句话说,可以根据你指定的条件来选择行。如果你想使用HAVING子句的话,它应该处再GROUP BY子句之后。下面将以 一个例子来解释HAVING子句。假设我们的employee表中包含雇员的name、departmen、salary和age。如果你想为每个部门中 每个雇员选择平均工资的话,你可以使用下面的SQL语 句:SELECT dept, avg(salary)FROM employeeGROUP BY dept; 当然,如果你还想只计算和显示 salary大于20000的平均工资的话,你还可以加上HAVING子 句:SELECT dept, avg(salary)FROM employeeGROUP BY deptHAVING avg(salary) > 20000;



where语句里不能含有聚合函数

Select SNAME FROM STUDENTS
Where AGE > (Select AVG(AGE) FROM STUDENTS)

找出各课程的平均成绩,按课程号分组,且只选择学生超过 3 人的课程的成绩。( GROUP BY 与 HAVING
GROUP BY 子句把一个表按某一指定列(或一些列)上的值相等的原则分组,然后再对每组数据进行规定的操作。
GROUP BY 子句总是跟在 Where 子句后面,当 Where 子句缺省时,它跟在 FROM 子句后面。
HAVING 子句常用于在计算出聚集之后对行的查询进行控制。)

程序代码 程序代码

Select CNO, AVG(GRADE), STUDENTS = COUNT(*) FROM ENROLLS

GROUP BY CNO HAVING COUNT(*) >= 3

查询没有选任何课程的学生的学号和姓名。(当一个子查询涉及到一个来自外部查询的列时,称为相关子查询( Correlated Subquery) 。 相关子查询要用到存在测试谓词 EXISTS 和 NOT EXISTS ,以及 ALL 、 ANY ( SOME )等。)

程序代码 程序代码

Select SNO, SNAME FROM STUDENTS Where NOT EXISTS

(Select * FROM ENROLLS Where ENROLLS.SNO=STUDENTS.SNO)

例 37 查询没有选任何课程的学生的学号和姓名。(当一个子查询涉及到一个来自外部查询的列时,称为相关子查询( Correlated Subquery) 。 相关子查询要用到存在测试谓词 EXISTS 和 NOT EXISTS ,以及 ALL 、 ANY ( SOME )等。)

程序代码 程序代码

Select SNO, SNAME FROM STUDENTS Where NOT EXISTS
(Select * FROM ENROLLS Where ENROLLS.SNO=STUDENTS.SNO)

例 38 查询哪些课程只有男生选读。

程序代码 程序代码

Select DISTINCT CNAME FROM COURSES C
Where ' 男 ' = ALL
(Select SEX FROM ENROLLS , STUDENTS Where ENROLLS.SNO=STUDENTS.SNO AND ENROLLS.CNO=C.CNO)

例 39 要求给出一张学生、籍贯列表,该表中的学生的籍贯省份,也是其他一些学生的籍贯省份。

程序代码 程序代码

Select SNAME, BPLACE FROM STUDENTS A Where EXISTS
(Select * FROM STUDENTS B Where A.BPLACE=B.BPLACE AND A.SNO < > B.SNO)

No comments: