除了声明性语言,SQL是一种函数式语言吗?

时间:2009-07-20 12:52:06

标签: sql functional-programming

为什么是或为什么不呢?

9 个答案:

答案 0 :(得分:27)

SQL被设计为一种声明性语言,从某种意义上讲,您告诉what您希望得到SQL引擎决定how

但是,SQL对集合进行操作,函数的结果可以是OracleSQL ServerPostgreSQL中的第一类集。

可以说SQL是函数式语言,只要函数将一个集合作为其输入并生成一个集合作为其输出。

也就是说,你可以这样写:

SELECT  *
FROM    mytable t
JOIN    myfunction(x) f
ON      f.col1 = t.col2

,甚至是这个:

SELECT  *
FROM    mytable t
CROSS APPLY
        myfunction(t.col2) f

(在SQL Server

或者这个:

SELECT  t.*, myfunction(t.col2)
FROM    mytable t

(在PostgreSQL

但这不是SQL标准的一部分。

就像C++编译器试图找到一个乘以两个float s(就普通代数而言)的最佳方法一样,SQL优化器试图找到一个乘以两个的最佳方法集合(就关系代数而言)。

C++中,您只需编写a * b并依赖编译器为此生成最佳程序集。

SQL中,您编写SELECT * FROM a NATURAL JOIN b并依赖优化程序。

但是,在所有SQL声明的声明性(没有双关语)的情况下,大多数真正的优化器只能进行非常基本的查询重写。

说,我知道没有优化器能够为此查询使用相同的有效计划:

SELECT  t1.id, t1.value, SUM(t2.value)
FROM    mytable t1
JOIN    mytable t2
ON      t2.id <= t1.id
GROUP BY
        t1.id, t1.value

并为此:

SELECT  id, value, SUM(t1.value) OVER (ORDER BY id)
FROM    mytable

,更不用说更复杂的查询了。

这就是为什么你仍然需要制定你的查询以便他们使用一个有效的计划(同时仍然产生相同的结果),从而使SQL相当于一种声明性语言。

我最近在我的博客上发了帖子:

答案 1 :(得分:9)

SQL中的函数是第一类对象吗?几乎不。所以我会说不。

答案 2 :(得分:8)

不,SQL不是一种功能语言。范式有些不同。请注意,除了功能之外还有其他类型的声明性编程语言 - 规范示例是逻辑编程和PROLOG。

从技术上讲,关系代数(SQL的理论基础)实际上并不是完整的。虽然现代SQL方言添加了足够的过程特性,以便可以实现存储过程并在此级别上完成,但单个SQL查询不是完整的计算。关系代数具有哥德尔完备性。 Godel完整性意味着能够表达任何可以用一阶谓词演算定义的计算 - 基本上你会知道普通的逻辑表达式。

答案 3 :(得分:5)

我认为SQL和函数语言彼此非常不同。在功能语言中,计算是通过评估函数来完成的。函数不会改变状态。他们所做的只是从他们的参数中计算出一个值。换句话说,功能不会引起副作用。功能语言是通用的。

SQL是一种用于处理关系数据库管理系统的语言。它可以被视为领域特定语言。它旨在处理数据的“集合”。它可以通过使用UPDATE之类的命令来改变全局状态(即数据库)。没有函数的概念被评估为值。据我所知,SQL甚至没有图灵完整。

答案 4 :(得分:5)

声明性和功能性?那将是一个电子表格。

答案 5 :(得分:2)

一般来说,由于没有语法扩展(例如PL / SQL,T-SQL),您无法编写函数。

但它肯定非常注重表达,这是与功能语言共有的一个特性。

答案 6 :(得分:2)

对于功能语言是什么(或者就此而言,程序性或面向对象语言是什么),没有一个真正的定义。

但我真的没有想到SQL指向功能。 它没有函数,它没有递归,它没有闭包,它没有嵌套函数,它没有函数作为第一类类型。

一个更常见的问题是SQL是否是的编程语言。它并不完美。

答案 7 :(得分:0)

由于函数式语言的意思是你用函数编程,我会说不。 SQL是用关系编程的(如果你甚至可以将SQL称为编程语言 - 在它的基本形式中,SQL不是图灵完成的。)

答案 8 :(得分:0)

从某种意义上说:是的,SQL 是函数式的。 看看

  • import openpyxl as xl from openpyxl import Workbook wb = xl.load_workbook('transactions.xlsx') sheet = wb['Sheet1'] book = Workbook() x = input("row name") y=int(x) book.save("sample.xlsx") for row in sheet.rows: print(row[y].value) SELECT,
  • map()WHERE,
  • filter()ORDER BY,
  • sort()DISTINCT