• SQL编程 Task05.SQL高级处理



    一、窗口函数

    学习链接

    1.1 第一题

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

    SELECT  product_id
           ,product_name
           ,sale_price
           ,MAX(sale_price) OVER (ORDER BY product_id) AS Current_max_price
      FROM product;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    猜测会按product_id升序排序,并输出目前的价格sale_price最大值,记为Current_max_price。
    在这里插入图片描述

    1.2 第二题

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

    解:
    处理方式:当登记日期为NULL时,将其处理为1年1月1日。

    SELECT regist_date, product_name, sale_price,
           SUM(sale_price) OVER (ORDER BY COALESCE(regist_date, CAST('0001-01-01' AS DATE))) AS current_sum_price
    FROM Product;
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    MySQL不支持NULLS FIRST.

    1.3 第三题

    思考题
    ① 窗口函数不指定PARTITION BY的效果是什么?
    ② 为什么说窗口函数只能在SELECT子句中使用?实际上,在ORDER BY 子句使用系统并不会报错。

    解:
    ① PARTITON BY 是用来分组,即选择要看哪个窗口。如果不指定PARTITION BY,则相当于对全局继续排序,即相当于所有的记录都属于一个分组。
    ②窗口函数只能出现在SELECT和ORDER BY子句中;其本质是SQL的语句执行顺序:
    FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY,由于ORDER BY位于SELECT之后,自然能用于SELECT也可以用于ORDER BY。
    如果查询的其他部分(WHERE,GROUP BY,HAVING)需要窗口函数,请使用子查询,然后在子查询中在使用窗口函数;
    如果查询使用聚合或GROUP BY,请记住窗口函数只能处理分组后的结果,而不是原始的表数据。

    1.4 第四题

    使用存储过程创建20个与 shop.product 表结构相同的表,如下图所示:

    在这里插入图片描述

    解:

  • 相关阅读:
    Java 8 新特性 ---- Lambda 表达式
    基于SSM的垃圾分类管理系统源码
    深入Linux内核理解epoll事件轮询机制
    springcloud搭建kafka
    记一次 .NET 某餐饮小程序 内存暴涨分析
    有什么软件可以提升视频画质,将模糊视频修复清晰?
    微服务与中间件系列——容器技术Docker
    【java web】JSP-Java Server Page
    玩转Configmap配置应用的各种姿势
    python实现微信新版v3的jsapi支付
  • 原文地址:https://blog.csdn.net/weixin_45662974/article/details/125464759