Task05 SQL高级处理

  参考:GitHub - datawhalechina/wonderful-sql: Follow me,从 0 到 1 掌握 SQL。

1.窗口函数

1.1 窗口函数的概念以及基本使用 

窗口函数也称为OLAP函数

常规的SELECT语句都是对整张表进行查询,而窗口函数可以让我们有选择的去某一部分数据进行汇总、计算和排序。

窗口函数的通用形式:

<窗口函数> OVER ( [ PARTITION BY <列名> ]
                                 [ ORDER BY <排序用列名> ] )  

其中 PARTITION BY 语句是用于分组的,即选择窗口,类似于 GROUP BY 语句,但是没有汇总功能;ORDER BY语句是用于排序的,即决定窗口内的数据按何规则排序。

1.2 窗口函数的分类

窗口函数可大致分为两类:

一类是 RANK、DENSE_RANK等排序用的专用窗口函数

另一类是将SUM、MAX、MIN等聚合函数用在窗口函数中

1.2.1 专用窗口函数

RANK函数

计算排序时,如果存在相同位次的记录,则会跳过之后的位次。(例)有3条记录排在第1位时:1位、1位、1位、4位…

DENSE_RANK函数

同样是计算排序,即使存在相同位次的记录,也不会跳过之后的位次。(例)有3条记录排在第1位时:1位、1位、1位、2位…

ROW_NUMBER函数

赋予唯一的连续位次。(例)有3条记录排在第1位时:1位、2位、3位、4位。

1.2.2 聚合函数在窗口函数中

聚合函数在窗口函数中的使用方法和之前的专用窗口函数一样,只是出来的结果是一个累计的聚合函数值。

1.3 窗口函数的应用-计算移动平均

<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS n PRECEDING )  
                 
<窗口函数> OVER (ORDER BY <排序用列名>
                 ROWS BETWEEN n PRECEDING AND n FOLLOWING)

PRECEDING(“之前”), 将框架指定为 “截止到之前 n 行”,加上自身行

FOLLOWING(“之后”), 将框架指定为 “截止到之后 n 行”,加上自身行

2. GROUPING运算符

只使用group by子句和聚合函数是无法同时得出小计和合计的,想要同时得到,可以使用grouping运算符。

2.1 ROLLUP - 计算合计及小计

SELECT  product_type
       ,regist_date
       ,SUM(sale_price) AS sum_price
  FROM product
 GROUP BY product_type, regist_date WITH ROLLUP;  

得到的结果为:

3. 存储过程及函数

基本语法:

DELIMITER //
CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]
BEGIN
	存储过程体

END;
DELIMITER ;

因为MySQL默认的语句结束符号为分号‘;’。为了避免与存储过程中SQL语句结束符相冲突,需要使用DELIMITER改变存储过程的结束符。

DELIMITER //”语句的作用是将MySQL的结束符设置为//,并以“END //”结束存储过程。

存储过程和函数的参数有三类,分别是: IN, OUT, INOUT

  • IN 是入参。每个参数默认都是一个 IN 参数。如需设定一个参数为其他类型参数,请在参数名称前使用关键字 OUT 或 INOUT 。一个IN参数将一个值传递给一个过程。存储过程可能会修改这个值,但是当存储过程返回时,调用者不会看到这个修改。
  • OUT 是出参。一个 OUT 参数将一个值从过程中传回给调用者。它的初始值在过程中是 NULL ,当过程返回时,调用者可以看到它的值。
  • INOUT :一个 INOUT 参数由调用者初始化,可以被存储过程修改,当存储过程返回时,调用者可以看到存储过程的任何改变。

练习题

1. 请说出针对本章中使用的 product(商品)表执行如下 SELECT 语句所能得到的结果。

SELECT  product_id
       ,product_name
       ,sale_price
       ,MAX(sale_price) OVER (ORDER BY product_id) AS Current_max_price
  FROM product;

找出之前所有行及本行中的最大值

2. 继续使用product表,计算出按照登记日期(regist_date)升序进行排列的各日期的销售单价(sale_price)的总额。排序是需要将登记日期为NULL 的“运动 T 恤”记录排在第 1 位(也就是将其看作比其他日期都早)

3. 思考题

① 窗口函数不指定PARTITION BY的效果是什么?

② 为什么说窗口函数只能在SELECT子句中使用?实际上,在ORDER BY 子句使用系统并不会报错。

① 不会进行分组,操作窗口是整张表

② 因为窗口函数是对where或者group by子句处理后的结果进行操作,所以窗口函数原则上只能写在select子句中;而ORDER BY 子句则是对SELECT 子句中的结果进行操作,操作的是整个结果表,所以可以使用窗口函数,但是窗口函数的返回结果只作为ORDER BY子句的排序依据,并不能返回期望的结果。

  • 54
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: SQL窗口函数有一些高级用法。首先,窗口函数通常只能在SELECT子句中使用,并且窗口函数中的ORDER BY子句不会影响最终结果的排序,它只是用来确定窗口函数的计算顺序。其次,窗口函数可以使用GROUPING运算符来计算合计和小计。其中,ROLLUP是一种常用的GROUPING运算符,用于计算合计和小计。\[1\]\[2\] 窗口函数的语法如下: <窗口函数> OVER (ORDER BY <排序用列名> ROWS n PRECEDING) <窗口函数> OVER (ORDER BY <排序用列名> ROWS BETWEEN n PRECEDING AND n FOLLOWING) 这些语法可以用来指定窗口函数的排序方式和计算范围。例如,可以使用ROWS BETWEEN子句来指定窗口函数计算的范围,如"ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING"表示计算当前行及其前后一行的窗口函数值。\[2\]\[3\] 总之,SQL窗口函数的高级用法包括使用ORDER BY子句确定计算顺序,使用GROUPING运算符计算合计和小计,以及使用ROWS BETWEEN子句指定计算范围。这些用法可以帮助我们更灵活地使用窗口函数进行数据分析和计算。 #### 引用[.reference_title] - *1* [SQL学习——窗口函数](https://blog.csdn.net/luschka/article/details/114333624)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【SQL】(task5)SQL高级处理(窗口函数 | ROLLUP)](https://blog.csdn.net/qq_35812205/article/details/121425049)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值