GROUP BY语句与HAVING语句的使用

一、GROUP BY

  GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX.)联合使用来得到一个或多个列的结果集。语法如下:

SELECT column1,  ... column_n, aggregate_function(expression)
FROM tables
WHERE predicates
GROUP BY column1, ... column_n;

举例

  比如说我们有一个学生表格(student),包含学号(id),课程(course),分数(score)等等多个列,我们想通过查询得到每个学生选了几门课程,此时我们就可以联合使用COUNT函数与GROUP BY语句来得到这一结果

SELECT id, COUNT(course) as numcourse
FROM student
GROUP BY id

  因为我们是使用学号来进行分组的,这样COUNT函数就是在以学号分组的前提下来实现的,通过COUNT(course)就可以计算每一个学号对应的课程数。

注意

  因为聚合函数通过作用于一组数据而只返回一个单个值,因此,在SELECT语句中出现的元素要么为一个聚合函数的输入值,要么为GROUP BY语句的参数,否则会出错。例如,对于上面提到的表格,我们做一个这样的查询:

SELECT id, COUNT(course) as numcourse, score
FROM student
GROUP BY id

  此时查询便会出错,错误提示如下:

Column ‘student.score‘ is invalid in the select list because
it is not contained in either an aggregate function or the
GROUP BY clause.

  出现以上错误的原因是因为一个学生id对应多个分数,如果我们简单的在SELECT语句中写上score,则无法判断应该输出哪一个分数。如果想用score作为select语句的参数可以将它用作一个聚合函数的输入值,如下例,我们可以得到每个学生所选的课程门数以及每个学生的平均分数:

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore
FROM student
GROUP BY id

二、HAVING

  HAVING语句通常与GROUP BY语句联合使用,用来过滤由GROUP BY语句返回的记录集。HAVING语句的存在弥补了WHERE关键字不能与聚合函数联合使用的不足。语法:

SELECT column1, column2, ... column_n, aggregate_function (expression)
FROM tables
WHERE predicates
GROUP BY column1, column2, ... column_n
HAVING condition1 ... condition_n;

  同样使用本文中的学生表格,如果想查询平均分高于80分的学生记录可以这样写:

SELECT id, COUNT(course) as numcourse, AVG(score) as avgscore
FROM student
GROUP BY id
HAVING AVG(score)>=80;

  在这里,如果用WHERE代替HAVING就会出错

时间: 2025-01-03 15:39:06

GROUP BY语句与HAVING语句的使用的相关文章

7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句和事物处理语句

在PL/SQL中可以使用的SQL语句主要有以下几类: SELECT 查询语句,DML语句,Transaction 事物处理语句,本文将对这几类语句在PL/SQL中的用法逐一介绍. 一.查询语句-SELECT SELECT 语句用来查询一条或多条语句.虽然SELECT 语句也属于DML语句,但SELECT是只读的,所以单独列出. 在PL/SQL中使用SELECT 语句的格式如下:   SELECT select_list INTO {variable_name[,variable_name]...

【6.1】SQL基础----2 DML语句【数据操纵语句】

2 DML语句[数据操纵语句] 2.1 插入数据 1.为表的所有字段插入数据:insert into 表名 values("值1","值2","值3","值4");  或者  insert into 表名(字段名1,字段名2,字段名3,字段名4) values("值1","值2","值3","值4"); 备注:其中values()括号里的值用英文的

Mysql 笔记之SQL语句及查询语句详解

DDL DATABASE | SCHEMA , TABLE , INDEX BTREE    全指匹配    左前缀   列前缀  范围匹配 HASH   等值比较   =  <=>  IN() 索引加速查询降低修改 查询操作 DML INSERT INTO       UPDATE        DELETE 查看INSERT 的帮助信息如下 MariaDB [(none)]> HELP INSERT; Name: 'INSERT' Description: Syntax: 1.第一种

python学习笔记二:if语句及循环语句,断点,模块,pyc

if语句 注意:语句块中的内容要强制缩进,否则出错.IndentationError,缩进错误 所有代码,如果是顶级的,必须顶格写,前面不能有空格 if - : - elif - : - else: - while语句 while -: - else: - for语句 for i in range(10)--i默认0,步长默认1,最大为9 for i in range (0,2,10)--从0开始,步长为2,最大为8 for  i   in range(-): - else: - break--

选择结构if语句和switch语句的区别

1.选择结构if语句格式及其使用 A:if语句的格式: if(比较表达式1) { 语句体1; }else if(比较表达式2) { 语句体2; }else if(比较表达式3) { 语句体3; } ... else { 语句体n+1; } B:执行流程: 首先计算比较表达式1看其返回值是true还是false, 如果是true,就执行语句体1,if语句结束. 如果是false,接着计算比较表达式2看其返回值是true还是false, 如果是true,就执行语句体2,if语句结束. 如果是fals

选择语句(分支语句)——if else

每晚必备的作业时间,今儿有点晚了,现在这样生活紧张而充实,感觉回到了幸福的学生时代,可摆在面前的现实在提醒自己时刻不能松懈……跑偏了转回正题,今儿学的分支语句不多就几句,可是用了差不多一整天的时间来理解,吃透和熟悉……语句分类:顺序语句,选择语句(分支语句),循环语句 选择(分支语句)if(){}if(){}else{} 二选一:若if成立,则不去走else,:若if不成立,肯定走else if(){}else if(){}else if(){}else{} 多选一若if成立,那其他的所有都不去

Swift流程控制之循环语句和判断语句详解

Swift提供了所有c类语言的控制流结构.包括for和while循环来执行一个任务多次:if和switch语句来执行确定的条件下不同的分支的代码:break和continue关键字能将运行流程转到你代码的另一个点上. 除了C语言传统的for-condition-increment循环,Swift加入了for-in循环,能更加容易的遍历arrays, dictionaries, ranges, strings等其他序列类型. Swift的switch语句也比C语言的要强大很多. Swift中swi

python基础:循环语句和判断语句

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. python语句块和缩进 缩进是Python语法的一部分:在python语句中,空格是用来区分块的,每一块的语句,缩进量(空格)应该是相同的 Python语言利用缩进表示语句块的开始和退出(Off-side规则),而非使用花括号或者某种关键字: 增加缩进表示语句块的开始,而减少缩进则表示语句块的退出. 在Python中,冒号(:)用来标识语

mysql中的if语句和while语句

一.if语法 if 条件 then -- SQL语句; else -- SQL语句; end if; 二.if使用 delimiter $$ -- 创建语句 create trigger my_tri after insert on orders for each row begin -- 获取表中的商品库存inv到变量@inv中 select inv from goods where id = new.g_id into @inv; -- 比较库存是否充足 if @inv < new.g_nu

SQL检索语句及过滤语句

首先推荐一款比较好用的数据库管理软件:navicat premium. 数据库中最重要的检索功能:SELECT语句 1.检索单个列:select 列名 from 表名: 2.检索多个列:select 列名1,列名2,...from 表名: 3.检索所有列:select * from 表名: 4.检索不同的行:select distinct 列名 from 表名:/*列中有重复值,只显示不同的值 5.检索限制行数:select 列名 from 表名 limit 数量:/*返回不多于几行的数据 6.