Qua*_*noi 26
SQL
被设计为一种声明性语言,从某种意义上说,你告诉what
你想要得到并且SQL
引擎决定how
.
但是,SQL
对集合进行操作,函数的结果可以是第一类集合Oracle
,SQL Server
和PostgreSQL
.
可以说这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++
编译器试图找到一个乘以两个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
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
减少了一个声明性语言.
我最近在我的博客上发了帖子:
小智 9
SQL中的函数是第一类对象吗?几乎不.所以我会说不.
不,SQL不是一种功能语言.范式有些不同.请注意,除了功能之外还有其他类型的声明性编程语言 - 规范示例是逻辑编程和PROLOG.
从技术上讲,关系代数(SQL的理论基础)实际上并不是完整的.虽然现代SQL方言添加了足够的过程特性,以便可以实现存储过程并在此级别上完成,但单个SQL查询不是完整的计算.关系代数具有哥德尔完备性.Godel完整性意味着能够表达任何可以根据一阶谓词演算定义的计算 - 基本上你会知道普通的逻辑表达式.
我认为SQL和函数式语言彼此非常不同.在功能语言中,计算是通过评估函数来完成的.函数不会改变状态.他们所做的只是从他们的参数中计算出一个值.换句话说,功能不会引起副作用.功能语言是通用的.
SQL是一种用于处理关系数据库管理系统的语言.它可以被视为领域特定语言.它旨在处理数据的"集合".它可以通过使用UPDATE之类的命令来改变全局状态(即数据库).没有函数的概念被评估为值.据我所知,SQL甚至没有图灵完整.