有三张表,学生表(t_student),班级表(t_class),成绩表(t_grade),三张表的字段设计如下

                                      

查询大竹峰班级里语文成绩前三名的女同学的id,姓名,班级,语文成绩:
SELECT
t_student.id,
t_student.sname,
t_student.sex,
t_class.cname,
t_grade.chinese
FROM
t_student
JOIN t_class ON t_class.id = t_student.cid
JOIN t_grade ON t_grade.sid = t_student.id
WHERE
t_student.sex = '女'
AND t_class.cname = '大竹峰'
ORDER BY
t_grade.chinese DESC
LIMIT 3  

聚合函数

1、求和:sum()

2、平均值:avg()

3、计数:count()

4、最大:max()

5、最小:min()

聚合函数特点:

    ①每个组函数接收一个参数(字段名或者表达式) 统计结果中默认忽略字段为NULL的记录

   ②要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。

   ③不允许出现嵌套,比如sum(max(xx))

求学生表中最大年龄,最小年龄,年龄的平均值,年龄之和:
select max(age),min(age),avg(age),sum(age) from t_student;  
查询学生表有多少条数据:
select count(*) from t_student;

 count()在计算某一字段有多少行的时候,可能会不准确,因为为空的时候(null值),count()不会计算进去,所以一般要计算有多少行的时候,都是用的*代替,一行里边不可能所有数据都是空的嘛! 

avg()在计算的时候,也不会考虑为空的时候

分组:分组必须和聚合函数配合使用,不然会出问题,但是聚合函数可以简单的单独使用(即查询表中某一字段时可以单独使用)

分组的时候会改变原来的表结构,所以不能再继续用select * 了,修改:以什么字段进行分组,这个字段就不能和聚合函数使用了,别的字段要查询出来都要和聚合函数配合使用

统计不同地区的人男女人数情况:
SELECT
sex,
address,
count(*)
FROM
t_student
GROUP BY
sex,
address;  
统计每个班级的男女成绩的平均分:
SELECT
a.sex,
b.cname,
avg(c.chinese + c.math + c.english) pjf
FROM
t_student a
JOIN t_class b ON a.cid = b.id
JOIN t_grade c ON c.sid = a.id
GROUP BY
a.sex,
b.cname;  

起别名,可以对表,字段起别名,起了别名之后,就只能用别名了,不能再用原表名,原字段名

起别名,关键字as,as可以省略不写

统计每个班级的男女成绩的平均分,北京的人不纳入统计:
SELECT
a.sex,
b.cname,
avg(c.chinese + c.math + c.english) pjf
FROM
t_student a
JOIN t_class b ON a.cid = b.id
JOIN t_grade c ON c.sid = a.id
where a.address!='北京'
GROUP BY
a.sex,
b.cname;

 

统计每个班级的男女成绩的平均分,北京的人不纳入统计,并且不显示平均分低于320分的:
SELECT
a.sex,
b.cname,
avg(c.chinese + c.math + c.english) pjf
FROM
t_student a
JOIN t_class b ON a.cid = b.id
JOIN t_grade c ON c.sid = a.id
WHERE
a.address != '北京'
GROUP BY
a.sex,
b.cname
HAVING
pjf >= 320  

分析:此处只需要再来一个查询条件即可,但是pjf这个值其实是分组后聚合函数的使用得出的结果

having和where作用和用法一致,但是where是对分组前的数据的查询,having是对分组后的数据做查询

统计每个班级的男女成绩的平均分,北京的人不纳入统计,并且不显示平均分低于320分的,并且只显示成绩最高的两条数据:
SELECT
a.sex,
b.cname,
avg(c.chinese + c.math + c.english) pjf
FROM
t_student a
JOIN t_class b ON a.cid = b.id
JOIN t_grade c ON c.sid = a.id
WHERE
a.address != '北京'
GROUP BY
a.sex,
b.cname
HAVING
pjf >= 320
ORDER BY
pjf DESC
LIMIT 2  

  

注意:这些顺序是固定的,可以不写,但是顺序不能改变

最新文章

  1. 在Mac上搭建本地Apache服务器一些注意点
  2. C#操作XML方法集合
  3. 使用node的插件UglifyJs来合并和压缩文件
  4. .net 使用ffmpeg.exe进行音频转码
  5. WPF MVVM模式
  6. BZOJ 1976 能量魔方 Cube(最小割)
  7. Visual Studio 2012 RC 中RC表示什么意思
  8. DB2数据库中SQL语句中使用or和and的关键字的时候注意事项
  9. 理解C++ 宏
  10. node系列4
  11. SQL Server 阻止了对组件 'xp_cmdshell' 的 过程'sys.xp_cmdshell' 的访问
  12. mysql left join,right join,inner join用法分析
  13. .NET反射应用
  14. 进程间通信系列 之 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例
  15. JS获取URL传的值与解决获取URL中的中文参数出现乱码
  16. Git - git branch - 查看本地仓分支列表
  17. Perl的输出:print、say和printf、sprintf
  18. Linux安装64位Mysql5.7
  19. 前端常用长度单位(px,em,rem,pt)介绍
  20. js-数组面试题

热门文章

  1. php 程序员进化之路
  2. 第2-4-2章 规则引擎Drools入门案例-业务规则管理系统-组件化-中台
  3. 线性时间选择(含平均情况O(n)和最坏情况O(n)算法)
  4. uniCloud云开发入门以及对传统开发方式的思考
  5. 【Shell案例】【tail/head/sed、echo $res ·· cat和管道】2、打印文件的最后5行
  6. 如何理性看待国内大热的HuTool工具包
  7. SpringBoot向Excel模板中写入数据并下载 (无需获取file对象及模板绝对路径)
  8. kernel 启动流程
  9. AcWing786.第k个数
  10. 腾讯出品小程序自动化测试框架【Minium】系列(四)API详解(上)