为什么SQL被称为基于关系/功能的语言?


14

我们了解到,大多数语言都被分类为“基于关系的”或“高级”这两种语言。我以前从未使用过SQL,但是通过阅读其语法,它似乎更像是命令式/高级语法,而不是基于函数/关系的(Lisp,Haskell)?

或者可能是我对我的教授的讲义的解释是错误的...但是它确实将SQL列为基于关系的语言之一(与高级语言相对),并且将基于关系的语言等同于功能性的语言...或者也许是我不明白为什么SQL处理关系数据库这一事实使函数语言成为应实现的方式?(为什么在对编程语言进行分类时,“基于关系的”等同于“功能的”?)

谢谢 :)

Answers:


14

我们了解到,大多数语言都被分类为“基于关系的”或“高级”这两种语言。

这些概念是正交的。“基于关系”是指语言的语义基于关系的概念,即两组之间的多对多关联(关系是SQL表背后的数学基础)。“高级”表示该语言包含很多抽象,这些抽象隐藏了许多底层技术细节(例如内存位置,CPU寄存器,磁盘访问,按位操作等)。SQL当然是基于关系的,因为它的主要目的是描述关系数据和基于它的操作。SQL也相当高级。它没有提供任何直接访问磁盘上字节的方法,也没有告诉您有关如何存储数据的任何详细信息(至少标准SQL不提供)。

实际上,还有更多的轴可以对编程(和数据)语言进行分类。一个特别有趣的是声明式和命令式。声明性语言描述的东西什么 ; 命令式语言描述了如何事情。SQL的DDL部分主要是声明,尽管必须看的关键字(” CREATE TABLE”,‘ DROP DATABASE’,等等),甚至是数据处理部分(SELECTUPDATEINSERTDELETE)还是蛮声明。SQL的一个非常有趣的特性是它不是图灵完整的:您不能在普通标准ANSI SQL中编写无界循环。

函数式编程围绕着一些核心思想:

  • 函数是一等公民(也就是说,它们可以用作值,其他函数的输入以及其他函数的输出)
  • 高阶函数(对函数进行操作的函数或返回函数的函数)
  • 纯度(纯函数是没有副作用的纯函数;纯函数不能执行任何I / O,不能读取或修改任何全局状态,并且不能采用非const引用参数。纯函数特别有趣,因为它们会给定相同的输入,总是产生相同的输出)

SQL当然不会围绕功能作为建模事物的主要工具,但是它确实包含了纯度的想法-在相同的数据库上运行的同一查询每次都会产生相同的结果(除了排序)。通过IMO将SQL称为“功能性”语言有点麻烦。


ANSI SQL是图灵完备的。您可以使用CTE(在SQL:1999中引入)和Windowing(SQL:2003)来嵌入循环标记系统
约尔格W¯¯米塔格

@JörgWMittag:也许可以用触发器做类似的事情……
jmoreno 2015年

“基于关系意味着语言的语义基于关系的概念,即,两个集合之间的多对多关联(关系是SQL表背后的数学基础)” – RDBMS中的关系,不是beteen数据集的“关系”,而是一组元组。表,视图或查询结果都是“关系”。
David Aldridge

12

SQL不是必需的,因为解析HOW查询和关系的过程不是由程序员定义的,而是由编译器/优化器/解释器定义的。SQL是一种声明性语言 -在SQL中,您声明关系。这将使用插入,更新和删除建立一个数据结构(该结构又不是由语言物理定义,而是由其实现)。

然后使用查询(SELECT语句)来完成关系的使用,查询是有效的,因为它们没有副作用。

整个事情都围绕着关系模型


我认为您可以提出更充分的理由。查询是集合,但它们也是集合上的函数。查询是sql中的一流对象(特别是,您可以嵌套它们或为它们命名)
nomen 2015年

5

SQL实际上不是声明性的功能语言。通常,功能语言强调声明式而不是命令式,以最大程度地减少副作用。这可能会导致某些人将SQL称为功能性的,但这并不准确。它具有过程元素的声明性。


1
但是查询(选择语句)是(纯数学的)函数和语言中的第一类对象。这使语言起作用。
nomen

3

您的笔记是否有可能被打乱?

我从未听说过将编程语言分为“基于关系的”和“高级的”两种语言。低级/高级通常用于区分汇编程序和C语言,以及为更抽象的结构提供直接支持的语言。关系是一个相当抽象的结构,因此我可以说任何支持关系的定义都是高级的。

通常将纯SQL描述为一种声明性语言,各个供应商都在其中附加了一些程序方面的内容。在我看来,SQL不支持将函数用作变量这一事实使我立即丧失了其作为函数语言的资格。


查询是集合/关系上的纯函数,并且是该语言中的第一类对象。益普索功能。
nomen

1

SQL是一种关系型,基于集合的语言,具有程序功能。

我不知道我是否考虑使用SQL函数,但是它确实具有函数语言的某些方面。SQL的现代变体(带有过程位)绝对不起作用。


-1

我认为,SQL是围绕关系代数的语法糖。关系代数具有功能语言的强大功能,它确实利用了非常高的表达能力(选择,投影,重命名,联接,并集,交集...)。但是据我所知,关系代数的基本处理方法通常没有等效的lambda运算符,尽管可以用递归运算符以无缝方式对其进行扩展。

我认为关系代数是一种代数语言。SQL及其子查询已从纯粹的关系代数转变为更具功能性的样式,但是如果没有lambda运算符,我认为它不是一种完整的功能性语言。我不知道它是否可以无缝地扩展为完整的功能语言,我不是该领域的专家。Haskell有一些库,目标是使用非常高级的数据库语言。


-1

我不知道一种语言是否具备功能所需的所有功能,但是Sql Server引入了一种非常有趣的方法来使用功能。特殊子句使函数能够在查询中一起交互。它称为“应用”。当我向一位前APL程序员解释这一点时,他告诉我,APL中存在类似的子句以实现相似的目标。Apply子句允许将表行或表函数行的属性集作为输入传递给另一个函数。话虽这么说,但我对表函数的类型施加了限制,以使其被视为具有功能。必须声明为内联,这意味着表示为单个select语句。这强加了没有变量。可以编写具有很多逻辑的此类查询,前提是您使用公用表表达式,然后允许将表达式转换为列,这是一种不可更改的变量,可以在其他CTE中重用。最终,.function变成了一个非常大的宏,这使优化器可以自由地优化所需的方式。人们唯一缺少的是一些简单的技巧来编写条件逻辑并在查询中声明一些数据支持逻辑。最后,需要一些使用over子句的函数作为将结果作为可从其他行中一行使用的值进行结果的方式,但是在这里要详细说明。人们唯一缺少的是一些简单的技巧来编写条件逻辑,并在查询中声明一些数据支持逻辑。最后,需要一些使用over子句的函数作为将结果作为可从其他行中一行使用的值进行结果的方式,但是在这里要详细说明。人们唯一缺少的是一些简单的技巧来编写条件逻辑,并在查询中声明一些数据支持逻辑。最后,需要一些使用over子句的函数作为将结果作为可从其他行中一行使用的值进行结果的方式,但是在这里要详细说明。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.