Mysql的group by, having, count

平时经常用错,这里举一些使用的例子。

  • group by
  • having
  • 聚合函数count,avg,min,max,sum等

一些基础的sql语句:
http://www.cnblogs.com/xinge1993/p/4769468.html

常用的sql
http://www.cnblogs.com/sunada2005/p/3411873.html


group by

根据by后面的字段的值分组,值相同的归为一组。

having

group by后,进行组类的判断。where后面也是跟条件判断,但是where是group by之前(如果有group by的话),针对每一行数据;having是针对group by后的组级别的数据。

count等聚合函数

  • count统计条数;
  • sum求和;
  • avg求平均;
  • max最大;
  • min最小。

注意:聚合函数并不只和group by一起用,不是只有group by的地方才能用它。
比如: select count(*) from stu; # 统计stu表的条数

示例

1:group、两个表join

create table tmp(rq varchar(10),shengfu nchar(1))insert into tmp values('2005-05-09','胜')
insert into tmp values('2005-05-09','胜')
insert into tmp values('2005-05-09','负')
insert into tmp values('2005-05-09','负')
insert into tmp values('2005-05-10','胜')
insert into tmp values('2005-05-10','负')
insert into tmp values('2005-05-10','负')

统计:每一天的胜负次数。输出是:rq,胜次数,负次数。

select a.rq, a.sheng, b.fu from (select rq, count(shengfu) sheng from tmp where shengfu='胜' group by rq, shengfu) a
join
(select rq, count(shengfu) fu from tmp where shengfu='负' group by rq, shengfu) b
on a.rq = b.rq

2:每个学生的成绩在90分以上的各有多少门

create table sc (
sno int,
pno varchar(16),
grade int
)insert into sc values(1, 'YW', 95)
insert into sc values(1, 'SX', 98)
insert into sc values(1, 'YY', 90)
insert into sc values(2, 'YW', 89)
insert into sc values(2, 'SX', 91)
insert into sc values(2, 'YY', 92)
insert into sc values(3, 'YW', 85)
insert into sc values(3, 'SX', 88)
insert into sc values(3, 'YY', 96)
insert into sc values(4, 'YW', 95)
insert into sc values(4, 'SX', 89)
insert into sc values(4, 'YY', 88)select sno, count(*) from sc where grade>=90 group by sno;# 刚开始写成这样下面这样,是错误的:
select sno, count(*) from sc group by sno, grade having grade>=90

输出结果:

3:至少有两门课程在90分以上才能有资格,列出有资格的学生号及90分以上的课程数

select sno,count(*) from sc where grade>=90 group by sno having count(*)>=2

4:列出平均成绩大于等于90分并且语文课大于等于95的学生sno和平均成绩

select sno, avg(grade) from sc where sno in (select sno from sc where grade>=95 and pno='YW') group by sno having avg(grade)>=90# 两种错误的,错误在哪自己分析
select sno from (select * from sc where pno='YW' and grade>=95) group by sno having avg(grade)>=90select sno, grade from sc where sno in (select sno from sc group by sno having avg(grade)>=90) and pno='YW' and grade>=95 group by sno

5 :平均成绩至少比学号是3的平均成绩高的学生学号以及平均分数

# 两种方法
select sno, avg(grade) from sc group by sno having avg(grade) > (select avg(grade) from sc where sno=3 group by sno)select sno, avg(grade) from sc group by sno having avg(grade) > (select avg(grade) from sc where sno=3)
#上面这句,having后面的select子查询,用到了聚合函数avg但是没有group by。看出,group by和聚合函数不是天生在一起用的。

6 : 查询每一个班级中年龄大于20且性别为男的人数

这个题来自http://www.cnblogs.com/wang-123/archive/2012/01/05/2312676.html 的最后面。但是,原博客中的sql语句是错误的。

create TABLE Table1
(ID int auto_increment primary key,   classid int, sex varchar(10),age int
) insert into Table1(classid, sex, age) values(1,'m',20)
insert into Table1(classid, sex, age) values(2,'f',22)
insert into Table1(classid, sex, age) values(3,'m',23)
insert into Table1(classid, sex, age) values(4,'m',22)
insert into Table1(classid, sex, age) values(1,'m',24)
insert into Table1(classid, sex, age) values(2,'f',19)
insert into Table1(classid, sex, age) values(4,'m',26)
insert into Table1(classid, sex, age) values(1,'m',24)
insert into Table1(classid, sex, age) values(1,'m',20)
insert into Table1(classid, sex, age) values(2,'f',22)
insert into Table1(classid, sex, age) values(3,'m',23)
insert into Table1(classid, sex, age) values(4,'m',22)
insert into Table1(classid, sex, age) values(1,'m',24)
insert into Table1(classid, sex, age) values(2,'f',19)select COUNT(*) as '>20岁人数', classid from Table1 where sex='m' and age>20 group by classid# 原博客错误的sql
select COUNT(*) as '>20岁人数', classid from Table1 where sex='m' group by classid,age having age>20 

7 : 班级人数大于等于3人的那些班级的学生

create table stu_class_info(sid int,class_id int,snane varchar(32)
)insert into stu_class_info values(1, 1, 'zhangsan')
insert into stu_class_info values(2, 1, 'zhangsan')
insert into stu_class_info values(3, 2, 'zhangsan')
insert into stu_class_info values(4, 3, 'zhangsan')
insert into stu_class_info values(5, 2, 'zhangsan')
insert into stu_class_info values(6, 2, 'zhangsan')
insert into stu_class_info values(7, 2, 'zhangsan')
insert into stu_class_info values(8, 4, 'zhangsan')
insert into stu_class_info values(9, 4, 'zhangsan')
insert into stu_class_info values(10, 2, 'zhangsan')# 班级人数大于等于3人的那些班级的学生
select * from stu_class_info where class_id in (select class_id from stu_class_info group by class_id having count(class_id)>=3) order by class_id

参考链接

http://www.cnblogs.com/xinge1993/p/4769468.html
http://www.cnblogs.com/sunada2005/p/3411873.html
http://blog.csdn.net/ooooooobh/article/details/52795073

136 Mysql 语句之group by, having, count相关推荐

  1. MYSQL语句优化:limit和count的优化

    正 文: SQL语句的优化大有学问,不同的写法取得的效果大为不同.今例举limit和count语句来作下探讨 1, limit语句的优化 . 常见的limit语句的形式为:LIMIT m,n;随之偏移 ...

  2. mysql groupby having_浅谈sql语句中GROUP BY 和 HAVING的使用方法

    在介绍GROUP BY 和 HAVING 子句前,我们必需先讲讲sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等.这些函数和其它函数的根本区别就是它们一般作用在多 ...

  3. sql分组查询group by结合count,sum统计语句的实现(附带sql详细分析步骤)

    日常写代码经常会遇到数据统计的业务场景,分组查询 group by 结合 count 和 sum 的复杂语句写起来容易令人头大,在这里分享两个比较复杂的统计场景,提供详细分析思路和最终sql语句,希望 ...

  4. mysql语句性能优化-使用case when 代替count(*)

    文章目录 前言 一.问题SQL 二.修改后SQL 总结 前言 负责运维的项目有个页面加载特别慢,打开差不多要2分钟,但是页面数据并不算多,只有几百条.为了把页面加载速度慢的问题解决,通过查看后台日志, ...

  5. mysql关于group by加count的优化

    很多时候我们需要查询类似于所有人做题量之类的查询,一般第一时间想到的会是group by 加count,这个在数据量不大的情况下还没问题,但数据达到百万级别就会是很大的问题,因为group by的字段 ...

  6. mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)

    MySQL常用的语句语法 注意:1. | 符号用来指出几个选中中的一个,因此NULL | NOT NULL 表示给出null 或 not null 2.包含在方括号中的关键字或子句是可选的(如 [li ...

  7. 【Elasticsearch】Elasticsearch如何实现 SQL语句中 Group By 和 Limit 的功能

    1.概述 转载:https://elasticsearch.cn/article/629 有 SQL 背景的同学在学习 Elasticsearch 时,面对一个查询需求,不由自主地会先思考如何用 SQ ...

  8. mysql语句命令_MySQL语句和命令大全

    前言 这里记录的是这两年学习工作过程中遇到的常用的 MySQL 语句和命令,部分是网上收集来的,出处已经不记得了,这里先谢过这些大佬.本文包括常见 SQL 语句,还有部分运维语句和命令,没有做详细的说 ...

  9. hive 把mysql语句执行_Hive SQL 语句的执行顺序

    提示 Hive SQL 教程 编写中,使用过程中有任何建议,提供意见.建议.纠错.催更加微信 sinbam. 当我们写了一个 sql,但是执行起来很慢,这时如果我们知道这个sql的底层执行流程是怎样的 ...

  10. Mysql语句改成Oracle语句的区别

    Mysql语句: select count(a.site_id) ,            (select attr_value from site1_attr where site_id = a.s ...

最新文章

  1. 《用Python进行自然语言处理》第6章 学习分类文本
  2. 直播预告|灵动MM32 MCU助力全国大学生智能汽车竞赛——基础培训第二讲
  3. python模拟内置函数reversed_Python内置函数reversed
  4. fsolve函数求解非线性方程
  5. hdu4284 dfs+floyd
  6. Hudson-ci/Installing Hudson Windows Service---官方文档
  7. liunx常用命令笔记
  8. python 捕获鼠标点击事件,在Python中的wx.Frame外部捕获鼠标事件
  9. python ca模块_python学习之模块-模块(五)
  10. 学业水平考试b能上985吗_这是最好考的985高校,如今被“降级”到双一流B类,真让人惋惜...
  11. Nagios+Cacti模块——Nagios+Cacti 搭建及整合(一)
  12. PHP SQL注入攻击与防御
  13. 【Ansys Workbench】—直接优化
  14. php smarty入门,smarty教程专题
  15. 单片机数码管动态显示时钟C语言,8位数码管显示电子时钟c51单片机程序
  16. python版我的世界怎么去天堂_我的世界中国版手游怎么去天堂 我的世界去天堂代码指令...
  17. 利用watir自动化测试并截图,截图后保存
  18. Java判断闰年和平年
  19. English 英文邮件致谢的10种表达方式十种不同场合的英文表达
  20. 爆文标题怎么写,分享四个吸睛标题的万能套路写法,新手速看!

热门文章

  1. 嘿,今年国庆最正能量视频流出!
  2. LeetCode851. 喧闹和富有(DFS+记忆化搜索)
  3. 依图公布全球化战略,与微软共同建设全球智慧城市
  4. C# DataTable去重
  5. Cool I just got a free Minecraft gift code athttps://freeminecraftgiftcode.net
  6. 华中科技大学研究生计算机专硕几年,华中科技大学硕士研究生学制从2年改为2.5年...
  7. uniapp h5实现微信公众号登录
  8. Linux生产实践优化详解
  9. 虾皮买家号批量注册软件
  10. 小米2017校招笔试题