MySQL (八)数据库的查询

继续上一篇中的问题

【常用的Select选择语句】


四、【 Select 语句之 group by 子句的使用 】

GROUP BY子句主要用于根据字段对行分组。例如,根据学生所学的专业对XS表中的所有行分组,结果是每个专业的学生成为一组。GROUP BY子句的语法格式如下:

GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]

说明:

1、GROUP BY子句后通常包含列名或表达式

MySQL对GROUP BY子句进行了扩展,可以在列的后面指定ASC(升序)或DESC(降序)。GROUP BY可以根据一个或多个列进行分组,也可以根据表达式进行分组,经常和聚合函数一起使用。

如: 将XSCJ数据库中各专业名输出。

SELECT 专业名

   FROM XS

   GROUP BY 专业名;

如:求XSCJ数据库中各专业的学生数。

SELECT 专业名,COUNT(*) AS '学生数'

   FROM XS

   GROUP BY 专业名;

如:求被选修的各门课程的平均成绩和选修该课程的人数。

SELECT 课程号, AVG(成绩) AS '平均成绩' ,COUNT(学号) AS '选修人数'

   FROM XS_KC

   GROUP BY 课程号

 

2、使用带ROLLUP操作符的GROUP BY子句: 指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行。

如:在XSCJ数据库上产生一个结果集,包括每个专业的男生人数、女生人数、总人数,以及学生总人数。

SELECT 专业名, 性别, COUNT(*) AS '人数'

   FROM XS

   GROUP BY 专业名,性别

   WITH  ROLLUP;

从上述执行结果可以看出,使用了ROLLUP操作符后,将对GROUP BY子句中所指定的各列产生汇总行,产生的规则是:按列的排列的逆序依次进行汇总。如本例根据专业名和性别将XS表分为4组,使用ROLLUP后,先对性别字段产生了汇总行(针对专业名相同的行),然后对专业名与性别均不同的值产生了汇总行。所产生的汇总行中对应具有不同列值的字段值将置为NULL。

可以将上述语句与不带ROLLUP操作符的GROUP BY子句的执行情况做一个比较:

SELECT 专业名, 性别, COUNT(*) AS '人数'

    FROM XS

    GROUP BY 专业名,性别;

还可以将专业名与性别顺序交换一下看看执行情况。

 

3、带ROLLUP的GROUP BY子句可以与复杂的查询条件及连接查询一起使用。

如: 在XSCJ数据库上产生一个结果集,包括每门课程各专业的平均成绩、每门课程的总平均成绩和所有课程的总平均成绩。

SELECT 课程名, 专业名, AVG(成绩) AS '平均成绩'

    FROM XS_KC, KC,XS

    WHERE XS_KC.课程号 = KC.课程号 AND XS_KC.学号 = XS.学号

    GROUP BY 课程名, 专业名

    WITH ROLLUP;

 

posted @ 2015-01-04 19:22  RoperLee  阅读(1720)  评论(0)    收藏  举报