SQL是一种什么样的语言?

时间:2014-10-27 19:31:06

标签: sql programming-languages chomsky-hierarchy

SQL是无上下文的语言还是其他类型的语言?

4 个答案:

答案 0 :(得分:6)

根据https://stackoverflow.com/a/31265136 SQL不是常规语言。简短的解释是每个选择查询看起来像

 SELECT x FROM y WHERE z

y本身可以是另一个选择查询,因此无法使用有限状态机进行模拟。如前所述,Backus–Naur Form中的SQL标准有一些CFG,因此SQL是非正规上下文语言。

答案 1 :(得分:2)

@aquinas写道:

  

你的意思是SQL也经常吗? CFG包含常规语言。所以,他们并不是互相排斥的。但要回答你的问题,SQL不是常规语言。

@MSX写道:

  

只是澄清一下,当语言由无上下文语法生成时,语言是无上下文的。在线有无SQL上下文语法定义。只是谷歌周围,你会发现一些。例如,Here's一个。

答案 2 :(得分:0)

任何用于SQL的CFG都可以完成大部分工作,但总是有些许限制。

一个很好的SQL CFG示例来自antlr:https://github.com/antlr/grammars-v4/blob/master/sql/plsql/PlSqlParser.g4#L1982

但是在那一行(1982年)上,您看到在values_clause中,无论指定了多少列,或者另一行中有多少个值,都将递归地添加列值,这是无效的sql:

insert into xyz values
  (1, 'hello'),
  (2, 'bye'),
  (3, 'hi', 'uhm...'); -- invalid!

尝试在此处运行它:https://www.db-fiddle.com/f/6gwgcg6qBLKpFbCEPtB6dy/0

CFG永远无法完全封装此语法,因为它等效于{ (a^n)(b^n)(c^n) : n ≥ 1 }语言,而CFG(but allowed in CSGs)不允许使用这种语言

您可以说这是运行时错误而不是解析错误。但是您可以对每种解释的语言使用相同的参数,因此它有点灰色。

答案 3 :(得分:-1)

在PL / SQL上下文中类似,可以确切地表示它是SQL或PL / SQL的代码 因为如果我们将功能关键字定义为具体关键字,那么如果我们想控制 可以使用哪些功能,必须知道此上下文