如果您比较 C 与 SQL,这是一个论点:
与描述应该如何做的 C 等过程语言相比,SQL 是非过程语言,描述应该做什么。
那么,像 SQL 这样的语言的部分是由语言本身指定的,是吗?如果我想改变某些查询的工作方式怎么办。假设我想改变 SELECT 的处理方式。那可能吗?
如果您比较 C 与 SQL,这是一个论点:
与描述应该如何做的 C 等过程语言相比,SQL 是非过程语言,描述应该做什么。
那么,像 SQL 这样的语言的部分是由语言本身指定的,是吗?如果我想改变某些查询的工作方式怎么办。假设我想改变 SELECT 的处理方式。那可能吗?
那么,像 SQL 这样的语言的部分是由语言本身指定的,是吗?
不严格由语言(即 SQL),但通常由数据库及其优化器。因此,即使从具有相同结构和相同索引的表中查询相同的数据,某些数据库也会以与其他数据库不同的方式构建结果集。
假设我想改变 SELECT 的处理方式。那可能吗?
在某种程度上,是的。您可以:
Neither of these directly instruct the database engine which approach to use, but both of them will affect how the resultset is returned - this is likely to vary between databases.
Additionally, I understand that some databases have additional interfaces that allow more low-level interaction with the database engine, enabling greater control over how a query is built than is possible from plain SQL. (However, your question did specify SQL.)
这实际上是在夸大差异。没有一个明确的点,一个是告诉事情是如何完成的,另一个是只告诉它做了什么。相反,一个人可能必须比另一个人更详细地指定做什么/如何做事情。典型的 SQL 实现允许用户控制诸如使用(或忽略)哪些索引、要执行哪种锁定等之类的事情。
如果您要在 C 中做同样的工作,您将(在某些时候)必须指定更多的细节(除非您使用类似 ODBC 的东西)。尽管如此,您仍然在告诉应该做什么,而不是应该如何完成的所有细节(例如,尽管缺少汇编语言尽可能低级,但 C 仍会自动进行一些类型转换,所以您不必告诉它如何执行诸如将整数添加到浮点数之类的操作-您只需告诉它添加它们,它就会处理细节)。
底线:试图将一个作为程序性而另一个作为非程序性进行讨论是具有误导性的。SQL 并不总是需要如此多的细节,但这是程度的差异,而不是真正的“如何”与“什么”。