您当前的位置: 站长圈 > 技术文章 > 数据库技术 > MySQL数据库查询——分组查询

MySQL数据库查询——分组查询

来源:站长圈 作者:adminzzq 点击: 0
一、分组查询

关键字:group by/having
 group by子句的作用是对某列数据进行分组查询
 1.select子句中任一非聚合表达式的所有列都应包含在group by 子句中
 例:学生表中按性别统计人数
 SELECT `ssex`,count(*) FROM `student` group by `ssex`
 结果见图23.jpg
\
 例:按性别统计学生的平均年龄
 SELECT `ssex` , round(avg( year(sysdate())-left(`sbirth`,4) ),2) as 平均年龄 FROM `student` WHERE `sbirth` <> '' GROUP BY `ssex`
 结果见图23-1.jpg
\
 例:统计来自不同地区的学生人数,排队地区不明学生
 SELECT  `saddress` , count( * )
 FROM `student`
 WHERE `saddress` <> ''
 GROUP BY `saddress`
 ORDER BY `saddress` ASC
 ----以上是用where子句给出条件
 SELECT `saddress` , count( * )
 FROM `student`
 GROUP BY `saddress`
 HAVING `saddress` <> ''
 ORDER BY `saddress` ASC
 ----以上是用having子句给出分组后的条件
 结果见图24.jpg
\
 2.text、image类型的数据不能用于gorup by子句

 SELECT 学习课程,count(*) from 学生_学课 group by 学习课程
 结果见图25.jpg
\
group by关键字通常和集合函数一起使用。

 

二、 聚合函数:
 sum()求和
 avg()求平均值
 count()表达式中记录的数目
 count(*)计算记录的数目
 max()最大值
 min()最小值
 

 GROUP BY 子句的语法
 Select 字段列表
 FROM 表名
 Where 条件
 [GROUP BY 分组字段列表  
 [HAVING 过滤分组后的字段]]

 GROUP BY字段中的Null值以备分组但是不能被省略。
 在任何SQL合计函数中不计算Null值。
 GROUP BY子句后最多可以带有十个字段,排序优先级按从左到右的顺序排列。

 having与where的区别:
 1.where条件是对整个查询而言,在进行分组操作之前应用;而having仅限于分组内部的数据过滤。
 2.having语法与where类似,但having可以包含聚合函数。

 在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明 了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。

 SELECT `class_id` , max( `mysql` ) , avg( `mysql` )
 FROM `学生成绩`
 WHERE `mysql` <> ''
 GROUP BY `class_id`
 HAVING `class_id` =1

 多表分组查询
 SELECT 课程.课程名称,count(*) from 学生_学课,课程 where 学生_学课.学习课程=课程.id group by 课程.课程名称
 结果见图26.jpg

 \

 查询mysql班的平均分数
 SELECT avg(mysql) as mysql平均分数,class_id from 学生成绩 group by class_id having avg(mysql)>0
 结果见图27.jpg
\
 SELECT avg(mysql) as mysql平均分数,class_id from 学生成绩 where mysql>0 group by class_id
 结果见图27-1.jpg
\
 select max(php) as php最高分,max(mysql) as mysql最高分,max(htmlcss) as htmlcss最高分,class_id from 学生成绩 group by class_id
 结果见图28.jpg
\

 在SQL的语法里,GROUP BY和HAVING子句用来对数据进行汇总。GROUP BY子句指明了按照哪几个字段来分组,而将记录分组后,用HAVING子句过滤这些记录。