这是今天在办公室发生的事。我没有这样做的计划,但理论上你能写一个SQL编译器吗?乍一看,我觉得它是图灵完备的,尽管对于许多类型的问题来说非常麻烦。

如果它不是图灵完整的,它需要什么才能变成图灵完整的?

注意:我不想做任何事情,比如用SQL编写编译器,我知道这将是一件愚蠢的事情,所以如果我们可以避免这个讨论,我会很感激。


当前回答

甲骨文的PLSQL和微软的TSQL都是图灵完备的。 Oracle的select语句本身也是图灵完成的。

其他回答

严格地说,SQL现在是一种图灵完备的语言,因为最新的SQL标准包含了“持久存储模块”(psm)。简而言之,PSM是Oracle中PL/SQL语言的标准版本(以及当前DBMS的其他类似过程扩展)。

随着这些psm的加入,SQL变得图灵完备

甲骨文的PLSQL和微软的TSQL都是图灵完备的。 Oracle的select语句本身也是图灵完成的。

简单地,执行这个查询:

select * 
from (SELECT 0 union SELECT 1) 
JOIN (SELECT 0 union SELECT 1) 
JOIN (SELECT 0 union SELECT 1)  
JOIN (SELECT 0 union SELECT 1)  
JOIN (SELECT 0 union SELECT 1) 
JOIN (SELECT 0 union SELECT 1)  
JOIN (SELECT 0 union SELECT 1) 
JOIN (SELECT 0 union SELECT 1) 

然后生成8位数字的前256位。 现在使用SELECT, and和or的组合,你可以编写任何8位机器。

正如你所看到的,没有表涉及,只有选择,联合和连接

在我看来,图灵完成了

事实证明,即使没有真正的“脚本”扩展,如PL/SQL或PSM(它们被设计成真正的编程语言,所以这有点作弊),SQL也可以是图灵完备的。

在这组幻灯片中,Andrew Gierth通过构造一个循环标记系统证明了CTE和Windowing SQL是图灵完备的,这个循环标记系统已被证明是图灵完备的。然而,CTE特性是重要的部分——它允许您创建可以引用自己的命名子表达式,从而递归地解决问题。

值得注意的有趣的事情是,添加CTE并不是为了将SQL转换为编程语言——只是为了将声明式查询语言转换为更强大的声明式查询语言。有点像c++,它的模板被证明是图灵完备的,尽管它们并不打算创建一个元编程语言。

哦,SQL中Mandelbrot集合的例子也非常令人印象深刻:)

最初在SQL-86中定义的ANSI选择语句不是图灵完全语句,因为它总是终止(除了递归cte,并且只有在实现支持任意深度递归时)。因此,不可能模拟任何其他图灵机。存储过程是图灵完整的,但这是作弊;-)