专栏首页SmartSi<转>Calcite SQL 形式化语言:关系代数

<转>Calcite SQL 形式化语言:关系代数

关系代数是一种过程化查询语言。它包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。关系代数的基本运算有:

名称

英文名称

符号

选择

select

σ

投影

project

Π

union

集合差

set-difference

-

笛卡儿积

Cartesian-product

×

更名

rename

ρ

除了上面的6种基本运算之外,还有一些其他运算,其他运算是可以用基本运算来表示的。但是在实际中,我们为了方便使用,单独建立了一种运算来表示,其他运算有:

名称

英文名称

符号

集合交

intersection

自然连接

natural join

赋值

assignment

1. 选择

  • 英文: select
  • 字符: σ
  • 读音: sigma
  • 作用:选择运算在关系中选择出能够满足给定谓词的元组。将那些不满足谓词的元组剔除,组成一个新的关系。在σ后面小写谓词代表查询条件,括号中写要操作的关系。可以使用=,≠,>,<,≤,≥来进行谓词的判断。另外,也可以使用and(∧)or(∨)not(﹁)将多个谓词组合成一个较大的谓词。

示例:

(1) 在User关系中查找出年龄大于18的所有元组并返回这些元组组成的关系

(2) 在User关系中查找出年龄大于20并且工资高于10000的所有元组并返回这些元组组成的关系

2. 投影

  • 英文: project
  • 字符: Π
  • 读音: pi(是希腊字母π的大写形式)
  • 作用:如果我们只对一个关系中的某些属性感兴趣而不是所有,那么我们使用投影关系来选择出我们想要的属性,投影关系返回一个仅含有这些属性的关系。因为关系是集合,所以将返回的关系中所有重复的元组将被剔除。

示例:

在User关系中查找出年龄大于18的所有元组并返回这些元组的姓名name组成的关系。

3. 并

  • 英文: union
  • 字符: ∪
  • 作用:有时我们需要把两个关系中的内容联系起来,或者一个关系经过不同的查询,我们希望把结果联系在一起。这就要使用并运算。没有什么不同的,和集合中的并很相似。需要注意的是,并运算处理的两个关系必须具有相同的属性,否则并运算将没有意义。

示例:

在User关系中找出所有年龄大于18的姓名,在Home关系中找出所有家在NewYork的人的姓名,将这两个关系取并集,得到一个并关系。

4. 差

  • 英文: set-difference
  • 字符: -
  • 作用:我们用一个关系A差运算另个一个关系B,表示剩下A中有但是B中没有的元组组成的关系。和并运算相同的,我们必须保证-运算在相容的关系之间进行。

示例:

在User关系中找出所有年龄大于18的姓名,在Home关系中找出所有家在NewYork的人的姓名,得到User中存在而Home中不存在的人的姓名的关系。

5. 笛卡儿积

  • 英文: Cartesian-product
  • 字符: ×
  • 作用:有时我们需要把两个不相关的关系连接起来,但是这两个关系之中的属性却各不相同。对于这种不相容的情况我们不能使用交并差运算。笛卡儿乘积,用第一个关系A中的一个元组和第二个关系B中的所有元组结合,创造出一条包含着所有属性的新元组(如果在两个关系中有同名属性c,则在新关系中用A.c和B.c分别来表示)。这样得到的新关系中一共有A的元组数乘以B的元组数条信息。

示例:

将User关系和Home关系做笛卡儿乘积运算

6. 更名

  • 英文: rename
  • 字符: ρ
  • 读音: rho
  • 作用:关系表达式的结果没有给我们能够引用的名字。如果想要引用一个产生的关系,最基础的就是把这句语句再写一遍,但是这种方法不是很好的。我们可以通过ρ表示更名或是命名,为一个关系起个名。

示例:

将User关系中所有年龄大于18的人的姓名取出作为一个新的关系,并把这个关系起名为adult。

7. 交

  • 英文: intersection
  • 字符: ∩
  • 作用:集合交运算表示出在A和B两个关系中都存在的元组的新关系。A和B两个元组应该是属性相同的。交运算是其他运算而不是基础运算。我们可以通过 A-(A-B) 得到A∩B。

示例:

在User关系中找出所有年龄大于18的姓名,在Home关系中找出所有家在NewYork的人的姓名,将这两个关系中都存在的姓名取出作为新的关系。

8. 自然连接

  • 英文: natural join
  • 字符: ⋈
  • 作用:有的时候我们需要把两个属性并不是完全相同的关系连接在一起,就像笛卡儿积做的那样。但是我们又不想直接使用笛卡儿积,因为这种方法实在是耗时耗力,我们希望得到更为简练有效的数据。这时我们就需要自然连接。自然连接将两个关系A和B的共同属性作为根本,将两个表中这些共同属性的值都相同元组拼接在一起作为一个新的元组,而将剩下不能拼接的部分全部舍弃,这样得到一个新的关系。

自然连接也是一个其他运算。我们可以先将A和B关系做笛卡儿积,然后基于两个关系中相同的属性做相等性判断,去掉不等的元组,最后将属性简化,得到自然连接的结果。

示例:

将User关系和Home关系做自然连接

9. 赋值

  • 英文: assignment
  • 字符: ←
  • 作用:实际上,赋值和更名很像,只不过赋值可以单独的写在一句话中,下面可以使用箭头左侧的名字作为右边关系的表示。

示例:

在User关系中找出所有年龄大于18的姓名,在Home关系中找出所有家在NewYork的人的姓名,将这两个关系中都存在的姓名取出作为新的关系。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Flink Table API/SQL 是如何变成程序运行的

    如上图,最下面一层是 Process Function ,可以去做一些有状态的计算,注册 Timer 定时器,可以做更复杂的操作,灵活性更高,可以做非常复杂的定...

    kk大数据
  • Apache Calcite 功能简析及在 Flink 的应用

    • Apache Calcite 是一个动态数据的管理框架,可以用来构建数据库系统的语法解析模块

    KyleMeow
  • Apache Calcite 论文学习笔记

    特别声明:本文来源于掘金,“预留”发表的[Apache Calcite 论文学习笔记](https://juejin.im/post/5d2ed6a96fb9a...

    叁金
  • Flink SQL Blink Planner 执行流程解析(上)

    大数据领域SQL化的风潮方兴未艾(所谓"Everybody knows SQL"),Flink自然也不能“免俗”。Flink SQL是Flink系统内部最高级别...

    zhisheng
  • Calcite技术研究

    Apache Calcite是一个基础的软件框架,它提供了查询处理、查询优化以及查询语言支持的能力。很多流行的开源数据处理系统例如Apache Hive,Apa...

    Fayson
  • Apache Calcite 框架 50 倍性能优化实践

    某天临时被当成壮丁拉去参加一个非常牛逼的应用监控平台(后续会开源),然后大佬就给我派了一个任务,要将项目中的查询性能优化 50 倍以上,大佬对我如此地寄予厚望,...

    张乘辉
  • [源码分析] 带你梳理 Flink SQL / Table API内部执行流程

    本文将简述Flink SQL / Table API的内部实现,为大家把 "从SQL语句到具体执行" 这个流程串起来。并且尽量多提供调用栈,这样大家在遇到问题时...

    罗西的思考
  • Apache Calcite项目简介

    Apache Calcite是一个动态数据管理框架,它具备很多典型数据库管理系统的功能,比如SQL解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等...

    叁金
  • Flink StreamSQL 原理介绍

    引言 前面群里面同学说对flink感兴趣,特别邀请资深流专家张如聪给大家深入分析下Flink里面最重要部分:Flink SQL。 本文对Flink SQL深入浅...

    大数据和云计算技术
  • calcite简单入门

    Apache Calcite是一款开源的动态数据管理框架,它提供了标准的 SQL 语言、多种查询优化和连接各种数据源的能力,但不包括数据存储、处理数据的算法和存...

    zhangheng
  • SQL 数据库查询的优化工具及实用

    本文主要是对数据库查询优化器的一个综述,包括查询优化器分类、查询优化器执行过程和CBO框架Calcite。

    养码场
  • Flink SQL vs Spark SQL

    Spark已经在大数据分析领域确立了事实得霸主地位,而Flink则得到了阿里系的亲赖前途一片光明。我们今天会SparkSQL和FlinkSQL的执行流程进行一个...

    麒思妙想
  • 阿卡姆大数据科普报告——Calcite

    Apache Calcite 是独立于存储与执行的SQL解析、优化引擎,广泛应用于各种离线、搜索、实时查询引擎,如Drill、Hive、Kylin、Solr、f...

    麒思妙想
  • calcite 入门

    最近越来越明白了一件事:框架之所以叫框架,必然用到了模板方法,我们只需要实现哪些我们自己需要实现的东西即可。

    shengjk1
  • Streaming SQL基础

    基于 Stream & Table relativity,《Streaming Systems》将 declarative 的编程方式往前推进到数据系统中最常用...

    哒呵呵
  • 基于Calcite自定义SQL解析器

    这本应该是《我也能写数据库》系列文章中的一篇,但是最近一直在反思这个系列标题是不是有点不亲民,所以,暂时放弃这个系列标题了。

    麒思妙想
  • 我也能写数据库 —— Streaming(上)

    在前面两篇中介绍了 存储 和 UDF,然后就开始着手准备streaming了,开始走了些弯路,本以为需要构建起一个简单的流系统,才能写streaming sql...

    麒思妙想
  • 数栈技术分享:开源·数栈-扩展FlinkSQL实现流与维表的join

    SQL是数据处理中使用最广泛的语言。它允许用户简明扼要地声明他们的业务逻辑。大数据批计算使用SQL很常见,但是支持SQL的实时计算并不多。其实,用SQL开发实时...

    数栈DTinsight
  • 0505-使用Apache Hive3实现跨数据库的联邦查询

    如今的企业内部一般都有多个系统用于数据存储和数据处理。这些不同的系统各自服务于不同的应用场景或案例。除了传统的RDBMS如Oracle DB,Teradata或...

    Fayson

扫码关注云+社区

领取腾讯云代金券