GoogleSQL:SQL 中的 Pipe 语法

news2024/11/19 19:35:10

这些是我根据论文 SQL Has Problems 编写的笔记。我们可以修复它们:SQL 中的 Pipe 语法

TL博士

SQL 长期以来一直是结构化数据处理的主导语言,通过本文,GoogleSQL 团队引入了一种新的管道结构化数据流语法,该语法显著提高了 SQL 的可读性、可扩展性和易用性。

该方法涉及向 SQL 添加管道运算符 (|>),这基本上将复杂的查询分解为多个步骤,使其更易于理解和维护。此语法使操作可以按任意顺序任意组合,从而大大简化了复杂查询并提高了可读性。我发现有趣的三件事是:

  • 管道语法,使 SQL 更加线性、可扩展和可读
  • “prefix 属性”,该属性允许运行部分查询以查看中间结果,从而帮助调试
  • 实验性调试运算符 (ASSERTLOGDESCRIBE)

三件有趣的事情

继续上述 TL博士 的讨论,以下是我在这篇论文中发现的三个有趣的事情,以及关于每个事情的一些快速细节。

注释和快速说明

SQL 是结构化数据处理的事实标准,经受住了 50+ 年的时间考验。Google 提出了对 SQL 的扩展,并引入了管道结构的数据流语法,以提高其可用性和可扩展性。

标准 SQL 的基本问题

SQL 的严格子句 (SELECT ... FROM ... WHERE ... GROUP BY) 不反映实际的数据流,该数据流从子句中的表扫描开始。这种结构还使使用新功能扩展语言的过程复杂化,这种脱节会导致几个问题,例如

  • SQL 使用重复子句 (WHEREHAVINGQUALIFY )来解决严格的子句顺序
  • 许多简单的操作需要子查询,导致代码嵌套深度,难以阅读
  • SQL 的结构使跟踪逻辑变得困难,尤其是在大型查询中
  • 添加新的查询操作具有挑战性,并且过度依赖保留关键字

管道语法解决方案

在传统 SQL 中,查询通常编写在单个整体语句中。GoogleSQL 的新管道语法支持顺序方法,其中一个操作的输出作为下一个操作的输入“管道化”。这种方法很直观,也与数据的处理方式一致。

使用 GoogleSQL 的管道语法,查询可以将零个或多个管道运算符作为后缀,用“|>”分隔。下面是一个使用管道语法的 SQL 查询的快速示例

SELECT column1, column2
FROM table1
WHERE condition1
|> JOIN table2 ON table1.id = table2.id
|> SELECT column3
|> ORDER BY column3 DESC;

每个管道操作符都是一个一元关系操作,接收一个表作为输入并产生一个表作为输出。SQL中的中间结果是具有一个或多个列和零条或多条记录的表。这种结构确保了可组合性,并允许操作符以任意顺序、任意次数应用。每个管道操作符都是自包含的,仅看到其输入表和参数。这种隔离性使得管道操作符天然具备可组合性。

扩展

管道语法极大地提高了SQL通过表值函数(Table-Valued Functions,TVFs)的可扩展性。CALL 操作符允许直接调用 TVFs,而无需使用嵌套子查询。以下是一个快速示例:

SELECT '<text>' AS input, 7 AS rating
|> CALL ML.PREDICT(MODEL `my_project.nnlm_embedding_model`)
|> CALL ML.PREDICT(MODEL `my_project.imdb_classifier`)

内置运算符扩展

管道语法简化了新增内置操作符的添加。例如,PIVOT 操作符在标准 SQL 中实现得较为笨拙,但在管道语法中成为了一个自然而然的可组合管道操作符:

FROM customer JOIN nation ON c_nationkey = n_nationkey
|> SELECT n_name, c_acctbal AS bal, c_mktsegment
|> PIVOT(SUM(bal) AS bal FOR n_name IN ('PERU', 'KENYA', 'JAPAN'))

实验性调试运算符

GoogleSQL 还引入了利用管道语法的调试运算符

  1. ASSERT:向 SQL 查询添加断言
  2. LOG:记录中间结果表以进行调试
  3. DESCRIBE:返回中间表的架构信息

对语法灵活性的深入观察

这种新语法的一个好处是它可以灵活地容纳现有的 SQL 操作和潜在的未来扩展。因此,SQL 的现有功能(如复杂连接、子查询和聚合)不会被放弃,并且可以用管道语法表示。

管道语法还以更自然、更易读的方式支持用户定义的函数 (UDF)。当数据转换通常需要 SQL 本身不支持的自定义操作时,此功能至关重要。管道语法的模块化特性确保可以在不中断查询流程的情况下合并这些 UDF。

实施和采用

为了实现这一目标,GoogleSQL 团队将管道语法设计为现有 SQL 语法的扩展,而不是替代品。这允许用户在他们的查询中逐渐采用新语法,而无需从一开始就完全承诺它。

该实现生成与标准 SQL 相同的代数,查询引擎只需最少的工作即可启用该功能。这种方法使管道语法立即成为支持查询引擎的一流功能。

GoogleSQL 将管道语法实现为在多个查询引擎(包括 F1、BigQuery、Spanner 和 Procella)之间共享的可重用组件。此共享语言分析组件允许跨多个引擎启用单个实施。

这里展示的内容是我的笔记和基于论文的解释。您可以访问完整的 paper SQL 有问题。我们可以修复它们: Pipe syntax In SQL . 本文只是我的一些理解,强烈建议您阅原文。文中所有的图及代码都来自论文。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132555.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学前端靠谱吗?

很多同学都会对自学前端持怀疑态度&#xff0c;这靠谱吗&#xff1f; 靠自学能学得会&#xff1f;一听就不靠谱&#xff0c;一定是骗子。 但实际上&#xff0c;大家都掉入一个错觉当中了。。。 一个天大的错觉 指望公司教你 在大厂&#xff0c;会有培训体系&#xff0c;会…

51单片机快速入门之定时器和计数器

51单片机快速入门之定时器 断开外部输入 晶振振荡 假设为 12MHz 12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒 溢出(值>65536 时)>中断>执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536 此时定时器会从 64536 开始计…

AD6120 60V降压芯片 2A的电流 适用于48V降12/5v 高效率转换

AD6120是一款电流模式单片降压开关稳压器&#xff0c;输入电压范围为5V~60V&#xff0c;可在宽输入电压范围内提供2A的连续输出电流&#xff0c;具有优异的负载和线路调节能力。在轻负载下&#xff0c;该稳压器以低频率运行&#xff0c;以保持高效率和低输出纹波 。电流模式控制…

性能测试-jmeter连接数据库(十七)...

百度服务器域名&#xff1a;www.baidu.com 百度的IP&#xff1a;110.242.68.3&#xff08;使用ping www.baidu.com&#xff09; jdbc:mysql://211.103.136.244:7061/test_db: mysql是数据库类型211.103.136.244是服务器IP7061是服务器端口号test_db是服务器的数据库 一、为…

Vite项目中的懒加载介绍

概述 import.meta 元属性将特定上下文的元数据暴露给 JavaScript 模块。它包含了这个模块的信息&#xff0c;例如这个模块的 URL。在vue3项目中&#xff0c;用的比较多的是通过import.meta.env来获取环境变量。而本文将要介绍的import.meta.glob和import.meta.env都是vite提供…

【零基础学习CAPL】——CRC值监控测试

🙋‍♂️【零基础学习CAPL】系列💁‍♂️点击跳转 ——————————————————————————————————–—— 从0开始学习CANoe使用 从0开始学习车载车身 相信时间的力量 星光不负赶路者,时光不负有心人。 目录 1.概述2.需求介绍3.算法4.逻辑判断5.测…

VS2022中文字符输出为乱码的解决

一、问题 vs2022输出中文时&#xff0c;出现乱码现象 二、解决方案 把文件的字符编码格式改为utf-8格式 选择工具&#xff0c;点击自定义 选择命令&#xff0c;点击添加命令 选择文件&#xff0c;点击高级保存选项&#xff0c;然后点击确定 点击高级保存选项 选择utf-8编…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

QLExpress规则引擎简述;字符串公式/脚本运算

概述 在业务中会遇到一些场景的运算方式不是固定的&#xff0c;而且内容不是有规律的&#xff0c;无法落库到表中&#xff08;强行落库后也需要针对该内容硬编码写一段特殊的查询方式&#xff09;&#xff1b; 这个时候将这部分计算抽取出来&#xff0c;用一个动态的脚本去执…

Spring web mvc入门练习

对于Spring方面的知识重在多练习 目录 一、计算器 1、前端界面 2、约定前后端交互接口 3、服务器代码 二、用户登录 前端代码 服务器代码 三、留言板 后端代码 前端代码 一、计算器 我们需要通过前后端的交互最终完成这样的界面以及完成需求 1、前端界面 因为主要…

windows系统离线搭建darknet

没有网的情况下采用将安装包全部都下载下来&#xff0c;再安装的方式。darknet在windows上编译问题比较多&#xff0c;经历了3天的踩坑&#xff0c;终于搭建好。。。下面简单记录一下安装过程。 1.下载cuda,cudnn,anaconda,opencv,opencv_python&#xff0c;vs。安装顺序&…

[Redis] Redis中的Hash类型和List类型

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

CISP-PTE CMS sqlgun靶场渗透测试

1.打开靶场 2.在搜索框尝试xss <script>alert(1)</script> 发现此处存在xss漏洞 3.在搜索框尝试sql注入 -1 union select 1,2,3# 发现页面有回显 4.查询数据库名 -1 union select 1,database(),3# 5.查询数据库的所有表 -1 union select 1,(select group_conc…

Matlab做二阶函数

关于解答&#xff1a; >> % Expert PID Control % 二阶传递函数的阶跃响应 % 位置式 clc; clear all; close all;n500; % 设置离散点的个数 Ts0.001; % 设置离散的采样时间 epsilon0.001; …

剪辑视频怎么放慢速度?6种方法可以轻易做到

在这个快节奏的短视频时代&#xff0c;视频编辑中的慢动作效果往往能吸引观众的眼球&#xff0c;赋予画面以独特的艺术感和情感深度。但是很多小伙伴不知道该怎么将视频播放速度放缓&#xff0c;今天&#xff0c;给大家分享6种剪辑视频放慢速度的高效方法&#xff0c;一起来学习…

【物理编程】解决物理压力的正确画法

这里写自定义目录标题 压力的画法 压力的画法 该程序是一个交互式的教育工具&#xff0c;它通过可视化的方式帮助学生和教师理解多边形的几何特性以及力的表示方法。以下是该程序的一些优点和对教师的帮助&#xff0c;用专业的语言进行总结&#xff1a; 增强理解力&#xff1a…

98、RS485全自动收发电路入坑笔记

因为RS485采用叉分信号&#xff0c;只支持半双工。正常的RS485芯片驱动电路是需要GPIO来切换发送和接收模式。如下图所示&#xff0c;一般的RS485电平转换芯片都有RE/DE脚&#xff0c;用来切换收发模式。 例如这篇推荐&#xff1a;芯片RS485自动收发电路常见问题与应对策略 但…

【kubernetes】Ingress和Ingress-Controller介绍,高可用应用案例

一&#xff0c;Ingress介绍 Ingress是k8s中一种重要的资源对象&#xff0c;它主要用于定义从集群外部到集群内部服务的HTTP(S)路由规则。用于管理代理 Ingress-Controller的配置文件。 kubectl explain ingress二&#xff0c;Ingress-Controller介绍 Ingress Controller 是 …

[ESP32]:如何在micropython中添加C库

[ESP32]&#xff1a;如何在micropython中添加C库 本文将描述如何在micropython中添加一个基于c语言的led模块。 1.编写c驱动 选择一个目录&#xff1a;examples/usercmodule&#xff0c;建立对应的驱动文件hw_led&#xff1a; . ├── cexample │ ├── examplemodule…