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;


浙公网安备 33010602011771号