举例如下:现有软考成绩表(考生编号,考生姓名,证件号,省份/直辖市,考试等级,考试科目,成绩)划线字段是主键,表中数据如下:
考生编号,考生姓名,证件号,省份/直辖市,考试等级,考试科目,成绩
----------------------------------------------------------------
123456 奥巴马 00000 四川 初级 基础知识 0
134535 唐僧 11111 陕西 高级 应用技术 70
253533 诸葛亮 22222 四川 高级 应用技术 75
525552 秦始皇 44444 陕西 高级 应用技术 60
445466 康熙 53333 吉林 初级 基础知识 35
----------------------------------------------------------------
如果要查询成绩在45以上的考生,这是按行选择记录,所以用WHERE:
SELECT 考生姓名 FROM 软考成绩表 WHERE 成绩>=45;
将返回:唐僧,诸葛亮,秦始皇
如果要查询考生平均成绩在45以上的省份,这就存在一个按考生籍贯分组的问题,奥巴马与诸葛亮一组,唐僧与秦始皇一组,康熙一组,但只有陕西这组被选择,所以用GROUP BY和HAVING:
SELECT 省份/直辖市 FROM 软考成绩表 GROUP BY 省份/直辖市 HAVING AVG(成绩)>=45;
对这一语句分析如下:
如果我们写:SELECT 省份/直辖市,AVG(成绩)AS 平均成绩 FROM 软考成绩表 GROUP BY 省份/直辖市;将返回如下结果:
省份/直辖市 平均成绩
--------------------
四川 37 //这里假设成绩字段是整型数据,不考虑小数的问题
陕西 65
吉林 35
这样分成了三组,但我们只需要第二组,所以加上HAVING子句选组分组:HAVING AVG(成绩)>=45,然后我们只需要显示省份,无需显示平均成绩,故再省略SELECT后面那个平均成绩,所以最终是:
SELECT 省份/直辖市 FROM 软考成绩表 GROUP BY 省份/直辖市 HAVING AVG(成绩)>=45;