sql中的with关键字和窗口函数

在oltp系统里,通常sql都比较简答(crud),而在olap场景中由于是面向分析的故sql都普遍更长更复杂,此时with关键字和窗口函数就经常被使用到。

with

作用

  • 建立一个仅在当前sql语句中生效的临时表,该临时表的结果可以在当前sql中复用

语法

with 
	alias1 as (
    ---子查询1---
    select *
    from your_table
  ), 
	alias2 as (
  	---子查询2---
    select *
    from alias1
  )
select alias1.*, alias2.*
from alias1
join alias2 on alias1.id = alias2.id
  • with申明子查询(临时表)后必须接select
  • 申明创建后的临时表可以被后续临时表使用
    • 如alias1表可以被alias2使用
  • 使用with创建临时表和在from中使用子查询的区别是
    • with创建的临时表在顶层,可以在整句sql中使用
    • 性能是否存在区别?

递归

使用with创建临时表并和自己关联以实现对树形结构数据的搜索,详见sql递归

窗口函数

作用

类似聚合函数+group by,但不会减少数据条数而是对每条数据都执行操作

语法

func() over (partition by col1, col2 order by col3)

详见sql窗口函数