Qua*_*noi 26

SQL被设计为一种声明性语言,从某种意义上说,你告诉what你想要得到并且SQL引擎决定how.

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

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

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

SELECT  *
FROM    mytable t
JOIN    myfunction(x) f
ON      f.col1 = t.col2
Run Code Online (Sandbox Code Playgroud)

,甚至这个:

SELECT  *
FROM    mytable t
CROSS APPLY
        myfunction(t.col2) f
Run Code Online (Sandbox Code Playgroud)

(中SQL Server)

或这个:

SELECT  t.*, myfunction(t.col2)
FROM    mytable t
Run Code Online (Sandbox Code Playgroud)

(中PostgreSQL)

不过,这不是SQL标准的一部分.

就像C++编译器试图找到一个乘以两个floats 的最佳方式(就普通代数而言),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
Run Code Online (Sandbox Code Playgroud)

对于这个:

SELECT  id, value, SUM(t1.value) OVER (ORDER BY id)
FROM    mytable
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @jalf:喜欢在`functionA(x)CROSS APPLY functionB(functionA.col1)`? (4认同)

小智 9

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

  • 每个SQL查询都是一个函数。也许您只是不喜欢语法。 (2认同)
  • 是的,它们是... SELECT 是一个函数。如果你读过关系代数,你就会知道 SELECTION 和 PROJECTION 是函数/动作。你只是没有看到它写成 `Select(columns/expressions)`; (2认同)

Con*_*lls 9

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

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


Vij*_*hew 5

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

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

  • 功能语言不得不以某种方式引起副作用,不是吗? (2认同)

one*_*hen 5

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


Bar*_*lly 3

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

但它确实是非常面向表达式的,这是它与函数式语言的共同特征。