聚合函数:

SQL中提供的聚合函数可以用来统计、求和、求最值等等。

分类:

–COUNT:统计行数量
–SUM:获取单个列的合计值
–AVG:计算某个列的平均值
–MAX:计算列的最大值
–MIN:计算列的最小值
首先,创建数据表如下:
执行列、行计数(count):
标准格式

SELECT COUNT(<计数规范>) FROM <表名>

其中,计数规范包括:

- * :计数所有选择的行,包括NULL值;

- ALL 列名:计数指定列的所有非空值行,如果不写,默认为ALL;

- DISTINCT 列名:计数指定列的唯一非空值行。

例,计算班里共有多少学生:
SELECT COUNT(*) FROM t_student;

也可加入筛选条件,如求女学生数目:

SELECT COUNT(*) FROM t_student WHERE student_sex='女';

如果要计算班级数目,就需要用到DISTINCT:
SELECT COUNT(DISTINCT student_class) FROM t_student;

DISTINCT即去重,如果不加DISTINCT则结果为表行数——5。

返回列合计值(SUM):
注:sum只要ALL与DISTINCT两种计数规范,无*。
计算学生年龄之和:
SELECT SUM(student_age) FROM t_student;

返回列平均值(AVG):

计算学生平均年龄:

SELECT AVG(student_age)FROM t_student;

返回最大值/最小值(MAX/MIN):

求年龄最大的学生信息(最小值同理):

SELECT MAX(student_age) FROM t_student;

注:这里只能求出最大年龄,要想显示年龄最大的学生全部信息,需要用到之后的子查询。

数据分组(GROUP BY):

SQL中数据可以按列名分组,搭配聚合函数十分实用。

例,统计每个班的人数:

SELECT student_class,COUNT(ALL student_name) AS 总人数 FROM t_student GROUP BY (student_class);

AS为定义别名,别名的使用在组合及联接查询时会有很好的效果,之后再说。

分组中也可以加入筛选条件WHERE,不过这里一定要注意的是,执行顺序为:WHERE过滤→分组→聚合函数。牢记!

统计每个班上20岁以上的学生人数:

SELECT student_class,COUNT(student_name) AS 总人数 FROM t_student WHERE student_age >20 GROUP BY (student_class);

HAVING过滤条件:

之前说了分组操作、聚合函数、WHERE过滤的执行顺序,那如果我们希望在聚合之后执行过滤条件怎么办?

例,我们想查询平均年龄在20岁以上的班级

能用下面的语句吗?

SELECT student_class, AVG(student_age) FROM t_student WHERE AVG(student_age)>20 GROUP BY student_class;

结果会出错。正因为聚合函数在WHERE之后执行,所以这里在WHERE判断条件里加入聚合函数是做不到的。
这里使用HAIVING即可完成:
SELECT student_class,AVG(student_age) AS 平均年龄 FROM t_student GROUP BY (student_class) HAVING AVG(student_age)>20; 

这里再啰嗦一句
SQL的执行顺序:
–第一步:执行FROM
–第二步:WHERE条件过滤
–第三步:GROUP BY分组
–第四步:执行SELECT投影列
–第五步:HAVING条件过滤
–第六步:执行ORDER BY 排序
子查询:
为什么要子查询?

现有一数据表如下:
根据之前的知识我们可以查出每门科目的最高分,但是要想查出取得最高分的学生信息就做不到了。这时就需要用到子查询来取得完整的信息。
什么是子查询?子查询就是嵌套在主查询中的查询。
子查询可以嵌套在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。
但并不是每个位置嵌套子查询都是有意义并实用的,这里对几种有实际意义的子查询进行说明。
现有表两张:一张学生表、一张班表。id相关联
在SELECT中嵌套:
学生信息和班级名称位于不同的表中,要在同一张表中查出学生的学号、姓名、班级名称:
SELECT s.student_id,s.student_name,(SELECT class_name FROM t_class c WHERE c.class_id=s.class_id) FROM t_student s GROUP BY s.student_id;         

* 首先这条SQL语句用到了别名,写法为在FORM的表名后加上某个字符比如FROM t_student s,这样在之后调用t_student的某一列时就可以用s.student_id来强调此列来源于对应别名的那张表。

别名在子查询及联接查询中的应用有着很好效果,当两张表有相同列名或者为了加强可读性,给表加上不同的别名,就能很好的区分哪些列属于哪张表。

还有种情况就是在子查询或联接查询时,主查询及子查询均为对同一张表进行操作,为主、子查询中的表加上不同的别名能够很好的区分哪些列的操作是在主查询中进行的,哪些列的操作是在子查询中进行的,下文会有实例说明。

接下来回到上面的SQL语句中,可以看出本条子查询的嵌套是在SELECT位置(括号括起来的部分),它与学号、学生姓名以逗号分隔开并列在SELECT位置,也就是说它是我们想要查出的一列,
子查询中查出的是,班级表中的班级id与学生表中的班级id相同的行,注意 WHERE c.class_id=s.class_id 这里就是别名用法的一个很好的体现,区分开了两张表中同样列名的列。
结果:
最后的GROUP BY可以理解为对重复行的去重,如果不加:
在WHERE中嵌套:
现要查出C语言成绩最高的学生的信息:
SELECT * FROM t_student WHERE student_subject='C语言' AND student_score>=ALL (SELECT student_score FROM t_student WHERE student_subject='C语言') ;

结果:

这里出现了一个ALL,其为子查询运算符
分类:
–ALL运算符
和子查询的结果逐一比较,必须全部满足时表达式的值才为真。
–ANY运算符
和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。
–EXISTS/NOT EXISTS运算符
EXISTS判断子查询是否存在数据,如果存在则表达式为真,反之为假。NOT EXISTS相反。
在子查询或相关查询中,要求出某个列的最大值,通常都是用ALL来比较,大意为比其他行都要大的值即为最大值。
要查出C语言成绩比李四高的学生的信息:
SELECT * FROM t_student WHERE student_subject='C语言' AND student_score >(SELECT student_score FROM t_student WHERE student_name='李四' AND student_subject='C语言'); 

通过上面两例,应该可以明白子查询在WHERE中嵌套的作用。通过子查询中返回的列值来作为比较对象,在WHERE中运用不同的比较运算符来对其进行比较,从而得到结果。

现在我们回到最开始的问题,怎么查出每门课最高成绩的学生的信息:

SELECT * FROM t_student s1 WHERE s1.student_score >= ALL(SELECT s2.student_score FROM t_student s2 WHERE s1.`student_subject`=s2.student_subject);

这里就是上文提到的别名的第二种用法,主、子查询对同一张表操作,区分开位于内外表中相同的列名。

结果:

子查询的分类:

–相关子查询
执行依赖于外部查询的数据。
外部查询返回一行,子查询就执行一次。
–非相关子查询
独立于外部查询的子查询。
子查询总共执行一次,执行完毕后后将值传递给外部查询。
上文提到的例子中,第一个例子求学生对应班级名的即为相关子查询,其中WHERE c.class_id=s.class_id 即为相关条件。其他的例子均只对一张表进行操作,为非相关子查询。
需要注意的是相关子查询主查询执行一回,子查询就执行一回,十分耗费时间,尤其是当数据多的时候。

组合查询:

通过UNION运算符来将两张表纵向联接,基本方式为:

SELECT 列1 , 列2 FROM 表1
UNION
SELECT 列3 , 列4 FROM 表2;

UNION ALL为保留重复行:

SELECT 列1 , 列2 FROM 表1
UNION ALL
SELECT 列3 , 列4 FROM 表2;

组合查询并不是太实用,所以这里只是简单提一下,不举出例子了。
上文说过相关子查询不推荐使用,组合查询又用的少之又少,那需要关联的多张表我们怎么做?
这就是下一篇博文要详细说明的SQL的重点表联接、联接查询。而此篇博文目的是为了对嵌套查询、别名的用法等等打下基础,毕竟只是写法变了,思路还是相似的。

转载于:https://www.cnblogs.com/freeitlzx/p/10946534.html

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询相关推荐

  1. SQL语句汇总(终篇)—— 表联接与联接查询

    上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需要用到表联接. 和之前的UNION组合查询不同,UNION是将不同的表组合起来,也就是纵向联接,说白了就是竖着拼起来. ...

  2. 妙用SQL Server聚合函数和子查询迭代求和

    本文为原创,如需转载,请注明作者和出处,谢谢! 先看看下面的表和其中的数据: t_product 图1 该表有两个字段:xh和price, 其中xh是主索引字段,现在要得到如下的查询结果: 图2 从上 ...

  3. SQL语句汇总(一)——数据库与表的操作以及创建约束

    首先,非常感谢大家对上篇博文的支持,真是让本菜受宠若惊,同时对拖了这么久才出了此篇表示抱歉. 前言:此文旨在汇总从建立数据库到联接查询等绝大部分SQL语句.SQL语句虽不能说很多,但稍有时间不写就容易 ...

  4. sql用于字符串的聚合函数_SQL字符串函数用于数据整理(争用)

    sql用于字符串的聚合函数 In this article, you'll learn the tips for getting started using SQL string functions ...

  5. MySQL数据库——day26 数据库安装,卸载,概念,msq的介绍,安装,连接,DDL,DML,DQL模糊查询,字段控制(别名和运算),排序,聚合函数,分组查询(where和having),分页查询

    学到mysql的时候非常的快,感觉前面的没有很巩固,还是要复习前面的博客 常见的数据库 MySQL , Oracle , SQL Server , SQLite , DB2 , - SQL Serve ...

  6. SQL Server 数据库之聚合函数

    聚合函数 1. 概述 2. 聚合函数 2.1 Sum 函数求和 2.2 Avg 求平均值 2.3 Min 函数返回最小值 2.4 Max 函数返回最大值 2.5 Count 函数统计表记录数 2.6 ...

  7. 把Python函数转换成能在SQL语句中调用的函数

    感谢中国传媒大学胡凤国老师提供的案例和第一版代码! 问题描述:把Python函数转换为能在SQLite数据库SQL语句中调用的函数,这样可以大幅度扩展SQL语句的功能. 演示代码: 运行结果: 今天公 ...

  8. SQL语句中:简单Case函数和Case搜索函数

    Case具有两种格式. 简单Case函数和Case搜索函数. --简单Case函数 CASE sexWHEN '1' THEN '男'WHEN '2' THEN '女' ELSE '其他' END - ...

  9. pdo_fetch执行mysql_PDO中执行SQL语句的三种方法

    在PDO中,我们可以使用三种方式来执行SQL语句,分别是 exec()方法,query方法,以及预处理语句prepare()和execute()方法~大理石构件来图加工 在上一篇文章<使用PDO ...

最新文章

  1. 云原生时代消息中间件的演进路线
  2. JavaScript基础学习之强制类转换(二)
  3. [Github项目]基于PyTorch的深度学习网络模型实现
  4. 一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库
  5. 二维的完整形式是什么?
  6. 异常处理记录: Servlet class X is not a javax.servlet.Servlet
  7. python识别银行卡数字_Python银行卡数字识别项目 (Opencv)
  8. java怎么读取数据_java怎么读取数据
  9. python3吧_基于python3 抓取贴吧图片与评论 图片下载保存
  10. JavaWeb实用项目之----化妆品销售网
  11. uniapp 中如何使用echart_uni-app中使用Echarts绘画图表
  12. C# .Net通过pythonnet调用python pyd文件
  13. DNS?本地填写的DNS有什么用?DNS怎么工作的?
  14. 国产CPU架构、国产Linux操作系统及其国产数据库等关键应用
  15. 工作中的自我反思[实时更新]
  16. Using insecure protocols with repositories, without explicit opt-in, is unsupported报错解决
  17. 5 款比较流行的WordPress主题后台选项开发框架
  18. 下载百度百科秒懂视频-m3u8转格式MP4
  19. 500 字写一篇程序员的个人发展计划
  20. PostgreSQL索引介绍

热门文章

  1. Code Rally 2015 编程锦标赛启动,智能手表,iPad 大奖等你来拿!
  2. 【有奖征文】如何提高IDC机房服务器的安全性
  3. Centos 5.8 安装KVM虚拟机学习笔记
  4. petshop4.0 详解之一(系统架构设计)
  5. 还珠格格里的尔泰,重现娱乐圈
  6. Linux C 程序的开发环境
  7. Linux笔记:vim
  8. 分辨5线单极性步进电机接头
  9. 英文投稿成功接收的经验
  10. ASP.NET 实践:写入 Cookie