关系代数和SQL语法

本文详细介绍了SQL语言的发展历程、功能、处理过程和基本语法,包括数据模型、关系代数和SQL在数据分析中的应用。强调了SQL的易用性和声明式编程特性,以及其在数据处理中的重要地位。SQL通过关系代数的操作如选择、投影、连接等,实现了对数据的灵活查询。在大数据和云计算时代,SQL仍然是数据分析的主流工具,其在OLAP场景中的广泛应用和优化技术,使得SQL成为了数据分析的事实标准。
摘要由CSDN通过智能技术生成

数据分析的语言接口

OLAP计算引擎是一架机器,而操作这架机器的是编程语言。使用者通过特定语言告诉计算引擎,需要读取哪些数据、以及需要进行什么样的计算。编程语言有很多种,任何人都可以设计出一门编程语言,然后设计对应的编译器做解析。编程语言从分类上来说,可以分为命令式,声明式。

命令式编程语言是我们最常见的编程语言,C/C++/Java等都是命令式编程语言,这类语言明确的告诉机器应该执行什么样的指令,留给编译器优化的空间很小了。

声明式编程描述程序应该获得什么结果,至于如何做到,并不关注细节。SQL就是一种声明式编程语言。例如SQL语句select count(1) from department where kpi =3.25,指明计算kpi=3.25的人数,但不会具体指定如何完成计算。这给后续的优化器留下了很大的操作空间,优化器可以根据SQL的需求和实际的数据做各种各样的探索,寻找到最佳的执行方式。

一个优秀的分析语言应该具有以下几个特征:

  1. 语言简单,门槛低
  2. 语意明确,无歧义
  3. 资料丰富,方便学习
  4. 生态丰富,工具多
  5. 方便扩展,可编排复杂的逻辑

SQL是一种历史悠久的,使用比较广泛的分析语言。在关系型数据库时代就广泛使用的一种语言。在21世纪初,出现了MapReduce算法,数据分析师需要编写MapReduce程序来分析数据。MapReduce程序是一种命令式语言,编写过程非常麻烦,堪比写程序,这就需要数据分析师不仅具备算法能力,还要具备工程能力,使用体验非常糟糕。这就需要两个团队来合作,BI团队把分析需求传递给开发团队,由开发团队去开发分析程序。为了改善分析体验,出现了SQL on Hadoop的解决方案,典型的如Hive,提供SQL接口,并把用户输入的SQL转写成MapReduce执行计划,因而极大的提升了数据分析的体验,实现了BI团队的自主分析,降低了数据分析的门槛,大大增加了受众范围。因此,SQL的影响力是非常大的。从Hive开始,大数据的主要使用接口就转移到了SQL上。而工程师们可以在SQL这张皮之下,专心的优化性能,无缝的升级计算引擎,保持使用接口的一致性。

SQL的语法简单,逻辑清晰,了解了最简单的查询语句之后,就可以嵌套多层表达很复杂的逻辑。SQL基于关系代数,有理论基础,保证语意明确没有歧义。SQL的发展历史非常久远,因而学习资料也比较多,方便新入门者学习。同时围绕SQL的生态也比较丰富,有很多工具使用SQL做分析。

除了SQL之外,也有一些软件推出自定义的语言,例如Elasticsearch使用Lucene语法,Prometheus推出了自定义的PromQL,而Splunk推出了SPL。每一种新的语法,对于新用户而言,都存在一定的学习门槛。因而都不如SQL使用广泛。可以说SQL是数据分析的事实标准。

数据模型

数据模型(DataModel) 用于描述数据在数据库中的组织形式。常见的模型有关系模型(Relational),键值模型(Key/Value),图模型(Graph),文档模型(Document),列簇模型(Column-family)等。 关系型数据库采用关系模型。Redis采用键值模型。图数据库采用图模型。MongolDB采用文档模型。

关系模型中的关系有点绕口,在英文中是Relational,硬翻译成了关系,我的理解,关系指的是一些相互之间有关系的属性组成的一个实体,因为各个列属性之间存在关联关系,而被称为一个关系,其实指的是属性之间的相关性,这种相关性体现在:属于同一行;满足列之间的约束条件;满足行之间的约束条件;满足不同关系之间的约束条件。通过不同的约束条件,是全部的数据形成一种有组织的存在。

数据库通过关系模型,定义出一个个关系实体,确保内容之间满足一定的约束标间,并且提供编程接口去读写数据库内容。一个数据库包含一堆关系,每个关系是一个多行多列的表格。每一行的各个列之间是相关的,也可能会定义一些约束条件。行与行之间,也可能通过定义唯一键(Primary Key),定义排序方式来约束行之间的关系。关系与关系之间,可以通过外部键来实现。

这种列之间和行之间的约束关系,在OLTP场景中比较实用,因为OLTP关注的数据本身,因此在存储数据时,更多关注数据的存储形式。而OLAP关注的数据的分析,所以在数仓中,这些约束条件是弱化的,因此,在数仓中,我们只需关注一张多行多列的表格即可,像PK、排序这类约束属性,更多只是用来做数据加速的手段。关系模型用来作为一种严密的理论,给执行器的优化提供理论基础。但是这个名字毕竟太绕口,在后续文章中,除非涉及到关系模型相关的理论,会使用关系这个词,一般情况下,会用表来指代一个关系。

关系代数(Relational Algebra)

关系模型和关系代数是SQL的理论基础。代数不仅是我们所熟知的简单的加减乘除等数学计算。在计算机行业,我们见到过多种algebra,在神经网络中常用的线性代数(linear algebra),在电路中用到的布尔代数(boolean algebra),香农把布尔代数带入到了逻辑电路设计中,为计算机二进制计算提供了理论依据。此外还有N多种algebra,这里不一一列举。

关系代数,源自于集合代数,讲述集合之间的变换关系。关系代数中的一系列操作,接受一个或两个关系作为输入,产生一个新的关系作为结果。由于输入和输出都是一个关系,我们可以串联多个算子,形成更加复杂的算子。关系代数中包含的算子有:σ (select,从一个关系中筛选出部分行,形成一个新的关系),Π(projection,从一个关系中筛选出部分列,形成一个新的关系),∪(Union,合并两个关系), ∩(Intersection,取两个关系的交集部分), –(difference,取两个关系的差集部分), ×(Product,两个关系的笛卡尔积),⋈(Join,两个关系在满足某些条件下的连接),ρ(Rename,重命名关系中的列), ←(Assignments,把一个临时的查询命名成一个新的关系), δ(Duplicate Eliminating,去重), γ(Aggregation,对部分列做聚合计算,结果形成一个新关系), τ(Sorting,排序结果形成一个新关系)。这里定义了常用的关系操作,名字已经表示出了其操作的含义,在这里不再介绍每个操作的明细了。在语法解析和优化器阶段我们会再次接触到关系代数,并且借助于关系代数的理论依据,来做一些语法树上的转换。在这里我们只需要知道在关系代数上有这些操作,并且在之后的SQL语法上看到如何用SQL语法来表达这些操作。

SQL

SQL语言的发展历史

SQL的发展历史,可以追溯到机械化数据分析的历史。在20世纪初,IBM主要的业务是打孔卡业务,也就是使用卡上的孔来记录信息,然后利用电路的通断判断是否有孔,并通过电路驱动机械装置,累计计算结果。打孔卡类似我们现代使用的答题卡,答题卡的每一个题目,都提供了四个选项,然后用铅笔涂黑对应的选项;打孔卡不同的地方在于,选中的部分穿透成孔,当放置到电路板上时,有孔的部分会有电流通过,进而触发之后的动作。这是在当时是一项非常先进的数据分析方法,相较于古老的依赖人去计数,也让大数据的自动化分析成为可能。在20世纪初,要统计数千万人口的信息,需要投入大量的人力资源,而打孔卡这种创世纪的发明,带来了数据分析行业的快速发展。因此可以说IBM的业务主要是提供数据分析的机器,主要的客户场景是联邦政府的人口普查,以及业机构做商业分析。这个时候,数据存储以来打孔卡,而数据计算是机械装置,计算结果输出到打印机。

到20世纪50年代,随着电气化的发展,磁带取代打孔卡成为新的存储设备,电气装置取代机械装置做计数。计算结果可以继续存储到磁带上。磁带的存储空间很大,不过磁带的缺点是只能顺序读写,这导致数据处理的程序不得不适应这种特性按照顺序处理。

到了60、70年代,磁盘被发明出来,磁盘可以被随机读写,这极大的改变了数据处理方式。数据结构无需考虑数据之间的顺序,一些更加复杂的数据模型被发明出来,例如网状模型或者层次化模型。1970年,Edgar Codd定义了关系模型,给出了非过程式的查询数据的方法,关系型数据库诞生了。关系模型非常简洁,并且提供了理论基础。非过程式的查询方法,屏蔽了实现的细节,使用者只需要声明所需要的结果即可,实现的过程则交给优化器给出最优的执行计划,这极大的降低了使用门槛。关系模型的发明者也因此获得了图灵奖。尽管关系模型在学术上非常吸引人,但是在现实中,在性能上还比不上已经存在的数据库。

到了70年代后期、80年代,IBM推出了一个突破性的项目System R,在项目中研发了至关重要的能够使关系型数据库非常高效的技术。在System R中,IBM推出了SQL的最早期版本,称为Sequal,后来演化成了SQL(Structed Query Language结构化查询语言)。这个项目虽然是个原型,但是它促进了之后IBM推出了第一个商用的关系模型的数据库产品System/38(1979),SQL/DS(1981),DB2(1983)。其中DB2目前还是活跃的商用数据库,在大学中也有DB2的使用课程。至此,SQL语言出现了,并且被其他的商用数据库系统所采用,比如Oracle的数据库。在数十年内,SQL语言凭借着其易用性,击败了其他需要关心底层实现的数据库产品,成为了事实上的标准。

1986年ANSI标准推出了SQL标准,称为SQL86,就是我们常说的ANSI SQL。之后标准经过陆续补充,以添加新的特性,陆续出现了SQL89,SQL92,SQL1999(正则式,触发器,OO), SQL2003(XML,窗口函数,Sequence,自增ID),SQL2006, SQL2008(清空表语法,Fancy Sorting), SQL2011(临时表,管道式DML), 最近的是SQL2016(Json,多态表)。

一般来说,一个数据分析系统,不一定完全遵循SQL的标准,这主要是由分析系统的特有特性所决定的,有些特性,在SQL标准里边是没有的,所以一般会在SQL标准上做一些拓展,号称是兼容ANSI SQL。一个系统需要支持的最小功能集合是SQL92标准。

SQL的功能

SQL语法包含了几个类别的功能,分别是

Data Manipulation Language(DML):数据操作语言,用于增删改查数据。

Data Definition Language(DDL):数据定义语言,用于定义表的格式。

Data Control Language(DCL):数据控制语言,用于控制权限等。

虽然DML和DCL是SQL系统的基础功能,本文的关注重点更多是数据处理的技术,以及如何加快数据处理的技术,因此更多关注DDL。 在DDL中,也有增删改查,在这几项中,本文更多关注查的部分内容,即如何加快数据的读取和计算。而数据的写入、存储部分的优化手段,也是为了满足加速数据计算的目的。

SQL的处理过程

SQL全称Structed Query Language(结构化查询语言)。SQL语法简单,易学易

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值