是否曾使用过至少两种顶级数据库产品(例如 Oracle、SQL Server、Informix、Sybase、DB2、Teradata)在 SQL 方面进行过扩展工作的人是否知道数据库供应商的 SQL 方言彼此之间有多么不同。由于我来自 Oracle 背景,因此我特别感兴趣
- 分析函数
- 示范条款
- 分层查询(
start with .. connect by
想到) - 任何其他超出常规的功能 (
select x, y from a, b where...
)
问题可能归结为这些特征是否以及在何种程度上受 ansi 标准的监管。
实际上,我想知道是否有“经验法则”表明我是否(以及如何)可以采用在一个数据库上运行的 SQL DML 语句并让它在另一个数据库上运行。
ANSI是一个创建自愿标准的私人非营利组织。因此,它实际上并没有监管任何东西。遵循公认的标准通常对公司有利,这就是为什么许多数据库公司遵循 SQL 的 ANSI 标准。当然,随着每家公司寻求使他们的产品与众不同,他们将开发超出标准的附加功能。
来自w3schools:
在您列出的更专业的领域中,SQL 方言之间的差异太大,无法将问题简化为“经验法则”。在这些情况下,您可能应该为每个数据库转换整个语句。通过这样做,可以利用每个数据库可以提供的特殊功能为每个平台优化每个语句。将 SQL 写入最低公分母 (ANSI) 可能会简化迁移,但会以性能为代价。
SQL Dialects Reference对 SQL 变体进行了一些有用的比较。有关更多信息,我建议您搜索您正在切换的特定方言,如下所示:
differences between mysql and oracle sql
我曾经使用过您提到的所有数据库。不幸的是,除了最简单的 SELECT、INSERT、UPDATE 和 DELETE 之外,我发现语法偏离自己的风格并不需要很长时间。当它到达您建议的某些类别时,它将很快获得特定于供应商的信息。我几乎总是不得不将我的 SQL 从一个平台“移植”到另一个平台。尽管回到几年前,我对 SQL Server 和 Teradata SQL 的不同之处感到惊讶,即使是包含几个连接的 UPDATE 也是如此。
每个供应商通常都遵循标准语法的最低核心。SQL-92 通常是最符合的标准。然后他们在此基础上添加额外的功能。SQL3 向语法标准添加了过程功能。对这个标准的符合性要低得多。供应商通常会声称某些符合性。符合标准仅意味着它们“至少”提供此功能。它们可以提供任何数量的功能,因此可以提供超出该标准的语法。每个数据库供应商还添加了特定于他们实现其数据库结构的方式的功能。这就是每个数据库供应商试图在竞争中提供优势的方式。
只是把它扔出去讨论,即使它也可能是一个评论。这就是为什么现在大多数人喜欢使用各种框架,如 EntityFramework 和 LINQ,其中所有查询的底层抽象都降级到应用程序层,而数据层只是平面存储。
请注意,这给 NoSQL 人群带来了另一个好处,因为数据库只是一种存储介质。
一些数据库供应商提供有关其 ANSI SQL 标准合规性的详细信息。对于 Teradata,他们专门列出了 ANSI 标准的每个元素以及每个详细项目的 SQL 标准——比如每个函数、数据类型等。我没有看到关于 Teradata 合规性的一般断言,但我确实搜索了两个文档“SQL:2”,它将获得任何最近的 ANSI 合规性。它们与 ANSI SQL:2011 兼容,但触发器、存储过程和十六进制文字与 SQL:2008 兼容。
魔鬼在细节中,您必须让它们来确定数据库是否在任何级别都符合 ANSI SQL。此外,它还不足以适应 SQL-92(又名 SQL2)的旧标准。如果供应商为较新的标准提供了良好的支持,那么这是否说明了数据库质量的很多方面?
比较数据库信息的好地方是“SQL In a Nutshell”,第 2 版或第 3 版,由 Kline、Kline 和 Hunt 编写,由 O'Reilly 出版。他们有几个表来比较 SQL:2003 的不同数据库特性。Teradata 不在列表中,但由于它们至少符合 SQL:2003,因此我可以使用该列表来比较数据库功能。
查看 O'Reilly 书中的列表,我可以找到 Oracle 中不支持 SQL:2003 标准的特性。当然,我需要查看 Oracle 文档以验证这些事实,因为那本书已经过时了。然后 Oracle 到 SQL:2003 的比较将帮助我完成从 Oracle 到 Teradata 的大型转换项目。