DML数据操作语言之查询(二)
当我们查询出了N条记录之后 ,我们知道一共是几条记录,或者这些记录某一字段(列值)的最大值,最小值,平均值等,就可以使用聚合函数。
1.聚合函数
聚合函数会将null 排除在外。但是count(*)例外,并不会排除null。
常用的聚合函数有 5个 : 聚合函数 用在select子句中
count(列名) : 计算表中的数据行数
使用 count(*) 会查出 包含null在内的全部数据行数 。
使用count(某列名) 会查出 该列不包含null在内的 数据行数。
如:某表记录一共有8行,其中有两条记录的age字段 为null。
select count(*) from tb_person; ----将得到 8
select count(age) from tb_person; --- 将得到 6
sum(列名): 计算表中 指定列的值的总和值 只能指定列类型为数值的列 不能指定列名为 *
如:某表记录一共有8行,其中有两条记录的age字段 为null。
select sum(age) from tb_person; --- 先排除 age字段为null的记录 ,然后计算剩余6条记录的age字段的总和值
avg(列名) : 计算表中 指定列的值的平均值 只能指定列类型为数值的列 不能指定列名为 *
如:某表记录一共有8行,其中有两条记录的age字段 为null。
select avg(age) from tb_person ; --- 先排除 age字段为null的记录 ,然后计算剩余6条记录的age字段的平均值。
max(列名) : 比较得到表中 指定列的值的最大值 可以指定任何列类型的数据列 不能指定列名为 *
如:某表记录一共有8行,其中有两条记录的age字段 为null,还有两条记录的birthday字段为null
select max(age) from tb_person ; --- 先排除 age字段为null的记录 ,然后比较剩余6条记录的age字段的得到age字段的最大值。
select max(birthday) from tb_person ; --- 先排除 birthday字段为null的记录 ,然后比较剩余6条记录的birthday字段的得到birthday字段的最大值。
min(列名) : 比较得到表中 指定列的值的最小值 可以指定任何列类型的数据列 不能指定列名为 *
用法类同与max().
在使用聚合函数的同时,结合使用 distinct来删除重复记录
2.对表进行分组
对表中的记录 ,按照指定的列的值是否相等(可以是多列),从而进行分组。使用group by子句。
group by子句按照指定的列,将查询出来的记录进行分组,指定的列称为分组列。
group by子句一定要写在 from子句之后(如果有where子句的话需要写在where子句之后)。所以现在接触的子句书写顺序是:
select ..... from ..... where ...... group by .......
当指定的分组列 中包含 null时,在最终的分组会以"不确定"行(空行)的形式表现出来。
在使用了where子句的SQL语句中,执行顺序是 首先 根据where子句的条件表达式对记录进行筛选。
其次,将筛选得到的记录 安装 group by 子句指定的分组列,进行分组。
然后,根据select子句中指定的显示列,进行显示。
所以指定顺序是 from → where → group by → select
常见错误 :
1.在使用 group by子句进行分组时,在select子句中出现了多余的列。
通过group by子句进行分组之后,得到的结果表中的一条记录 代表的是一个分组,而不再是一条数据。
使用group by子句进行分组时,select子句中不能出现group by子句中没有出现的列名。
2.在group by子句中写了列的别名
我们可以在select 子句中指定列的别名 ,但是不能在group by 子句中使用select子句中指定的列的别名。
因为 group by子句是在select子句之前执行的。
3.group by子句进行分组之后的记录 是有序的吗?
答案是:“随机的”。
4.在where子句中出现了 聚合函数
只有select子句 和 having子句 (以及order by子句)中才能使用聚合函数。
3.为聚合结果指定条件
为聚合结果指定筛选条件 使用的 having 子句。
where子句 和 having子句 都是用来指定筛选条件的,但是二者的使用有所不同:
我们查询数据有两种情况,
第一种,我们不使用 聚合函数 和 group by子句 这种对查询后的数据进行聚合的操作 ,这是我们查询出来的结果表中的一行记录,就是一条
原始的记录,这条记录在原始的数据表中是存在的。
第二种,我们使用了 聚合函数 和 group by子句这种对查询后的数据进行聚合的操作 ,操作的到的结果表的一行记录,是在原始数据表中 不存在的。
结果表中的一行数据 可能代表一个分组(使用了 group by 子句),也可能代表了对查询数据的操作(使用了聚合函数)。
使用 where子句 指定的筛选条件,是对第一种情况,即原始数据表中的一条记录 来进行筛选的
使用 havin子句 指定的筛选条件,是对第二种情况,即不是原始数据表的一条记录,是采用 聚合函数 和 group by子句得到的一条聚合记录进行筛选的。
having子句必须写在group by子句之后(如果group by子句存在的话):
select ..... from .... where .... group by ... having....
执行顺序是: 先执行where子句,对原始的数据记录进行筛选,得到的是原始数据记录,在原数据表中中存在,然后执行group by子句对得到的原始数据记录,按照指定
的分组列,进行分组,得到的数据记录,是在原始数据表中 不存在的的聚合数据记录,即分组,再然后 指定select子句,对group by子句分组之后的数据记录,来指定显示
哪些列,使用聚合函数进行操作。最后 ,执行having 子句,再对聚合函数操作得到的列进行筛选。
按理来说,对于group by子句指定的分组列,进行筛选的条件,应该放在having子句中,则也是合理的。但是 对于group by子句指定的分组列,进行筛选的条件应该放在where
子句中 ,这是出于执行效率的考虑。因为我们可以先筛序出符合条件的分组列的记录,然后再进行分组,这样执行效率高。而不是先进行分组,然后筛选出符合分组列条件的分组,
这样执行效率低。
4.对查询结果进行排序
使用order by子句对查询结果进行排序。
一般情况,order by 子句写在select语句 (不是子句)的末尾。
书写顺序:
select ..... from .... where ..... group by .... having .... order by.....
order by 子句中指定的列 称为排序列。
升序使用的关键字是 asc 降序使用的关键字是 desc。 如果不写 ,默认使用升序进行排序,即asc.
指定多个排序列:
我们可以在order by子句中,指定多个排序列,意思是先按照指定的第一列进行排序,排好之后,对于第一列的值相等的记录,再按照指定的第二列的值进行排序,以此类推,如果还指定
了第三列。
如果某些记录,在指定的排序列的值是 null,那这些记录就不进行排序。而是在其他记录排好序之后,在结果表的开头或者末尾集中显示(不同数据库不同)。
可以在order by子句中使用 select子句中指定的列的别名,这是因为排序总是在最后一步,是在select子句执行之后。
排序列既可以任何列:
可以是上一个小节中的查询数据的第一种情况中的列。select子句中原始数据的指定的列。
可以是select之中中未使用的列,即不用来显示的列。
可以是上一个小节中的查询数据的第二种情况中的列。即进行数据的聚合之后的列,聚合函数。
DML数据操作语言之查询(二)的更多相关文章
- DML数据操作语言之查询(一)
1.select语句基础 基本语句格式: select <列名>,.... from <表名>; select子句中列举出希望从表中查询出的列的名称,from子句则指定了选取 ...
- 6.1课堂笔记—DML(数据操作语言),DQL查询语句
一.DML(数据操作语言) InnoDB MyISAM 支持事务 不支持事务 不支持全文索引 支持全文索引 支持外键约束 不支持 命令查看默认存储引擎 show variables like '%st ...
- DML数据操作语言
DML数据操作语言 用来对数据库中表的数据记录进行更新.(增删改) 插入insert -- insert into 表(列名1,列名2,列名3...) values (值1,值2,值3...):向表中 ...
- DML数据操作语言之增加,删除,更新
1.数据的增加 数据的增加要用到insert语句 ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...
- DML数据操作语言之复杂查询
1.视图(View) 我们知道,在关系型数据库中,用来保存实际数据记录的是数据表.和表同等概念也是用来保存东西是:视图. 但是数据表是用来保存实际数据记录的,而视图是用来保存常用select语句的. ...
- DML数据操作语言之谓词,case表达式
谓词:就是返回值是真值的函数. 前面接触到的“>” “<” “=”等称为比较运算符,它们的正式名称就是比较谓词.因为它们比较之后返回的结果是真值. 由于谓词 返回的结果是一个真值 ,即tr ...
- DML数据操作语言之常用函数
所谓函数,就是输入某一值,得到相应的输出结果的功能.相当于一个加工厂,给了原料,最终产出成品. 其中原料 就是参数(parameter). 产品 就是返回值. 函数大致可以分为以下五个种类: 算术函数 ...
- MySQL SQL DML (数据操作语言)
包括 SELECT, UPDATE, DELETE, INSERT SELECT 从数据库表中获取数据 用法 SELECT name FROM students; SELECT name,age FR ...
- DML数据操作语言练习
--创建表T_HQ_BM2 --create table t_hq_bm2 as select * from t_hq_bm; commit; --添加行内容 --insert into t_hq_b ...
随机推荐
- 【SPOJ】Longest Common Substring(后缀自动机)
[SPOJ]Longest Common Substring(后缀自动机) 题面 Vjudge 题意:求两个串的最长公共子串 题解 \(SA\)的做法很简单 不再赘述 对于一个串构建\(SAM\) 另 ...
- 【洛谷1855】 榨取kkksc03
题面 前面省去一堆背景内容 洛谷的运营组决定,如果一名oier向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有20个或以上的成员,上传10道以上的私有题目,布置过一次作业并成功举办过一 ...
- 【linux之软件安装,rpm,yum】
一.软件管理 静态库 动态库静态库:在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库动态库:在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入. 链接是程序调用库的过程. 静 ...
- 【Webpack的使用指南 01】Webpack入门
使用Webpack有一段时间了,但是感觉之前学的用的都比较零散,所以在这里整理一下Webpack的使用知识,从入门到进阶. 创建项目 首先创建最简单的一个项目 npm init 得到以下项目结构: 安 ...
- angular采坑记录
在angular中会遇到一些莫名的问题,导致不能完成想要的功能,可能是某项用法使用错误,或许是angular相对应不支持,或者是我们功力根本就没有达到.为了在每次采坑之后能有所收获,再遇到时能理解其根 ...
- 初探Electron
Electron是什么? 官网是这么描述的:Build cross platform desktop apps with JavaScript, HTML, and CSS 翻译一下:使用JavaSc ...
- oracle sql model从句demo
model从句作用 sql model可以完成像EXCEL工作表的数据内容扩展.计算填充的功能 关键词解释 partition 分区关键词,白话就是分组 dimension 度量关键词,白话就是要取出 ...
- 【原创】快应用QuickApp--HelloWorld体验
快应用: 快应用是九大手机厂商基于硬件平台共同推出的新型应用生态.用户无需下载安装,即点即用,享受原生应用的性能体验. 3月20日在北京联合召开快应用标准启动发布会.过去1天了,官网(快应用官方网站) ...
- 优先级队列用法详解(priority_queue)
由于优先级队列的内部数据结构为 堆,所以这里先介绍堆的一些操作. 堆的一些函数操作在algorithm头文件中 //在[first, last)范围内构造最大堆,first,last 可以是vecto ...
- Mycat 分片规则详解--日期(天)分片
实现方式:按照日期来分片 优点:使数据按照日期来进行分时存储 缺点:由于数据是连续的,所以该方案不能有效的利用资源 配置示例: <tableRule name="sharding-by ...