重庆专业做网站公司,设计网站开发方案流程,在线制作图片书,大学生毕业设计网页设计※食用指南#xff1a;文章内容为《SQL基础教程》系列学习笔记#xff0c;该书对新手入门非常友好#xff0c;循序渐进#xff0c;浅显易懂#xff0c;本人主要用来补全学习MySQL中未涉及的部分#xff0c;便于刷题和做项目。
官方电子书#xff1a;《SQL基础教程》第2…※食用指南文章内容为《SQL基础教程》系列学习笔记该书对新手入门非常友好循序渐进浅显易懂本人主要用来补全学习MySQL中未涉及的部分便于刷题和做项目。
官方电子书《SQL基础教程》第2版——图灵社区
官方授权视频《SQL基础教程》第2版 零基础6小时
个人觉得不是很有必要去看视频自己看书做练习就够了 目录
第8章SQL高级处理
8-1窗口函数
1什么是窗口函数
2窗口函数语法
3语法的基本使用方法——使用RANK函数
4无需指定PARTITION BY
5专用窗口函数的种类
6窗口函数的适用范围
7作为窗口函数使用的聚合函数
8计算移动平均
9两个ORDER BY
8-2GROUPING运算符
1同时得到合计行
2ROLLUP——同时得出合计和小计
3GROUPING函数——让NULL更加容易辨认
4CUBE——用数据来搭积木
5GROUPING SETS——取得期望的积木
章节练习 第8章SQL高级处理 8-1窗口函数 1什么是窗口函数 窗口函数OLAPOnline Analytical Processing对数据库数据进行实时分析处理市场分析、创建财务报表、创建计划等 2窗口函数语法 作为窗口函数使用的函数
ROW_NUMBER、RANK、DENSE_RANK专用窗口函数排序函数
SUM、AVG、COUNT、MAX、MIN能够作为窗口函数的聚合函数 3语法的基本使用方法——使用RANK函数 RANK用来记录排序的函数
PARTITION BY设定排序的对象范围根据什么分组
ORDER BY指定哪一列、何种顺序排序默认升序降序DECS ❗根据不同种类product_type按照销售单价sale_price从低到高排序 PARTITION BY对表进行横向分组ORDER BY决定纵向排序的规则 窗口函数兼具GROUP BY子句的分组功能以及ORDER BY子句的排序功能但PARTITION BY不具备GROUP BY子句的汇总功能因此使用RANK函数不会减少表中记录的行数 PARTITION BY分组后的记录合集称为“窗口”代表范围
因为在SQL中“组”特指GROUP BY分割后的记录集合为避免混淆使用PARTITION BY时称为窗口 4无需指定PARTITION BY
窗口函数中起到关键作用的是PARTITION BY、GROUP BY其中PARTITION BY并不是必需的即使不指定也可以正常使用窗口函数 和没有使用GROUP BY的聚合函数时效果一样将整个表作为一个大的窗口来使用 5专用窗口函数的种类
ROW_NUMBER唯一值连续位次
RANK存在相同位次的记录跳过之后的位次
DENSE_RANK存在相同位次的记录不跳过之后的位次 使用RANK或ROW_NUMBER时无需任何参数只需要像RANK或者ROW_NUMBER保持括号中为空就行 练习
LeetCode178题
分数排名不分组排序 LeetCode184题
每个部门工资最高的员工分组排序
①获得每个部门的员工及员工工资排序 ②只提取工资最高的员工
salary_rank 1取每个分组降序后的第一个
t取一个别名 使用RANK、DENSE_RANK都可以因为如果工资都是一样的位次都要把它列出来 6窗口函数的适用范围
原则上窗口函数只能在SELECT子句中使用
窗口函数是对WHERE子句或者GROUP BY子句处理后的结果进行操作 7作为窗口函数使用的聚合函数
所有聚合函数都能用作窗口函数SUM、AVG、COUNT、MAX、MIN ①计算销售单价的总计值累计统计法
一行一行逐渐添加计算对象按时间序列的顺序计算各个时间的销售总额 ②计算平均值以当前记录为基准进行统计 8计算移动平均
窗口函数将表以窗口为单位进行分割并在其中进行排序的函数
框架在窗口中指定更加详细的汇总范围的备选功能该备选功能中的汇总范围
需要在ORDER BY子句之后使用指定范围的关键字 框架是根据当前记录来确定的和固定的窗口不同其范围会随着当前记录的变化而变化 ①指定最靠近的3行作为汇总对象
ROWS行、PRECEDING之前 ROW 2 PRECEDING截止到之前2行
-- 自身当前记录
-- 之前1行记录
-- 之前2行记录 以上的统计方法为移动平均moving average实时把控最近状态常用于对股市趋势的实时跟踪 ②把PRECEDING替换成FOLLOWING截止之后2行 汇总当前记录的前后行同时使用PRECEDING、FOLLOWING -- 之前1行的记录
-- 自身当前记录
-- 之后1行的记录 能够熟练掌握框架功能就可称之为窗口函数高手了 9两个ORDER BY
注意记录的排列顺序
使用窗口函数时必须要在OVER子句中使用ORDER BY可能会误以为结果中的记录按照该ORDER BY 指定的顺序排序的
OVER子句中的OEDER BY只是用来决定窗口函数按照什么样的顺序进行计算的对结果的排列顺序并没有影响 DBMS可以按照窗口函数的ORDER BY 子句所指定的顺序对结果进行排序但也仅仅只是个例罢了 如果想让记录就按张ranking列的升序进行排序
在SELECT语句的最后使用ORDER BY子句进行指定 使用两个ORDER BY 看起来有点怪但这两个ORDER BY的动能完全不同 8-2GROUPING运算符
1同时得到合计行
GROUP BY子句用来指定聚合键的场所根据指定的键分割数据不会出现合计行
合计行是不指定聚合键时得到的汇总结果
如果想要得到合计分别计算出合计行和按照商品种类进行汇总的结果再用UNION ALL连接在一起 2ROLLUP——同时得出合计和小计 GROUPING运算符
ROLLUP
CUBE
GROUPING SETS ROLLUP是卷起卷起百叶窗、窗帘卷等能够得到像从小计到合计从最小的聚合级开始聚合单位逐渐扩大的结果 ROLLUP列1列2…一次计算出不同聚合键组合的结果
-- GROUP BY
-- GROUP BYproduct_type GROUP BY没有聚合键相当于没有GROUP BY子句会得到全部数据的合计行记录超级分组记录super group row
超级分组记录的product_type列的键值对DBMS来说并不明确会默认使用NULL 其他SQL语法 MySQL专用语法 ①未使用ROLLUP前 ②使用ROLLUP后
其他SQL语法 MySQL专用语法 使用ROLLUP多了合计行和3个不同商品种类的小计行未使用登记日期作为聚合键的记录这4行就是超级分组记录 SELECT语句使用UNION对3种模式的聚合级的不同结果进行连接
-- GROUP BY
-- GROUP BYproduct_type
-- GROUP BYproduct_type,regist_date 3GROUPING函数——让NULL更加容易辨认
regist_date中衣服有一列为NULL而NULL作为了聚合键作为小计两个NULL不易辨认 判断超级分组记录的NULL特定函数——GROUPING函数参数列的值是超级分组记录产生NULL返回1其他返回0 使用GROUPING函数可以在超级分组记录的键值中插入字符串
当GROUPING函数的返回值为1时指定“合计”或者“小计”等字符串其他情况返回通常的列的值
实际业务中需要获取包含合计或者小计的汇总结果 ELSE CAST(regist_date AS VARCHAR(16)) END AS regist_date,
满足CAST表达式所有分支的返回值必须一致的条件否则各个分支分别返回日期和字符串类型的值执行时发生语法错误 4CUBE——用数据来搭积木
CUBE立方体
将ROLLUP替换为CUBE 把regist_date作为聚合键
-- GROUP BY
-- GROUP BYproduct_type
-- GROUP BYproduct_date
-- GROUP BYproduct_type,regist_date CUBE将GROUP BY子句中聚合键的“所以可能的组合“汇总结果集中到一个结果中
组合的个数2nn是聚合键的个数
聚合键有2个所以是4如果是3个聚合键则为8 5GROUPING SETS——取得期望的积木
GROUPING SETS运算符用于从ROLLUP、CUBE的结果中取出部分记录个别条件对应的不固定的结果 想从中选取将“商品种类“和”登记日期“各自作为聚合键的结果
或不想得到合计“记录和使用2个聚合键的记录“ 章节练习
8.1 按照product_id升序排序计算出截至当前行的最高销售单价
商品编号越来越大计算最大值的对象范围也不断扩大
用于奥运会等竞技体育的最高纪录不断变化相似随着运动员数量逐渐增加要选出历史第一也会越来越难 8.2
使用Proudct表计算按照regist_date升序进行排列的各日期的sale_price的总额
排序需要将等级日期为NULL 的运动T恤记录排在第1位看作弊比其他日期都早 方法二regist_date为NULL时显示“1年1月1日“日常骗一下DBMS 方法一regist_date为NULL时将该记录放在最前显示不推荐可能因DBMS的需求改变无法使用 ————TBC