SQL语句语法差异

时间:2012-01-13 20:25:21

标签: mysql sql sql-server oracle

我想知道在查看查询语句时,SQL实现之间通常会有哪些类型的东西。我想到的一件事是在WHERE子句中使用IS NULL。例如,见bleow。我正在编写一个查询语句解析器,它以自定义语言处理语句和查询,并且需要考虑更广泛使用的SQL产品之间的大多数一般差异。

Oracle语法:

SELECT * FROM TABLE WHERE COLUMN_A IS NULL 
SELECT * FROM TABLE WHERE COLUMN_A IS NOT NULL

MySQL语法?

SQL Server语法?

6 个答案:

答案 0 :(得分:5)

IS NULL / IS NOT NULL语法是ANSI标准SQL,并且在您为Oracle列出的所有三个RDBMS中都受支持。

答案 1 :(得分:5)

我不确定你是否会找到所有差异的最终清单。我能想到的一些事情就在我的脑海中:

  • MySQL使用LIMIT,而SQL Server使用TOP。
  • SQL Server在GROUP BY操作上要比MySQL严格得多,要求SELECT中的所有非聚合列都出现在GROUP BY子句中。
  • SQL Server支持超出ANSI标准的专有UPDATE FROM和DELETE FROM语法。
  • 一个系统中存在但不存在另一个系统的功能。 MySQL具有SQL Server中不存在的FIND_IN_SET和GROUP_CONCAT。同样,SQL Server具有MySQL中不存在的ROW_NUMBER()。

答案 2 :(得分:2)

IS NULL和IS NOT NULL几乎无处不在。基本查询的主要区别与函数调用有关,而且这些差异大不相同,所以你必须在那里更具体。

答案 3 :(得分:1)

在不同的RDMBS实施之间有很多不同的东西。这是一个不使用任何特定功能的简单示例:

在Oracle中,您可以从表B中的数据更新表A,如下所示:

UPDATE A
SET (COL1,COL2) = (SELECT B.COL3, B.COL4 FROM B WHERE B.COL5 = A.COL6)
WHERE A.COL7 = 3
AND EXISTS (SELECT 1 FROM B WHERE B.COL5 = A.COL6);

但在SQL Server中,可以按如下方式完成相同的任务:

UPDATE A
SET COL1 = B.COL3, COL2 = B.COL4
FROM B
WHERE B.COL5 = A.COL6 
AND A.COL7 = 3;

此外,Oracle语法在SQL Server中无效,反之亦然,因此您无法满足于共同点。为这种特定语法编写解析器是一项挑战,因此一般的解析器似乎是一项非常重要的任务。

答案 4 :(得分:0)

您可以将这两个查询应用于所有rdbms。这是标准的ansi。

答案 5 :(得分:0)

大约十年前,我将一个链接加入了一个名为“供应商遵守ANSI SQL的级别”的文档。我保留了它,所以我能想到,“啊,多么古怪。”该标准现在是ISO(I =国际),而不仅仅是ANSI(A = USA)。没有人试图为不止一种SQL产品记录这种事情。

所有供应商都密切关注SQL标准,并将逐个功能地声明级别合规性。即使没有这样的声明,你也知道他们已经阅读了标准规范,即使这意味着一个有意义的决定来扩展或完全不同地做事。如果您对可移植性感兴趣,那么习惯于编写标准SQL,该标准SQL由您希望定位的SQL产品实现或类似于语法。

以mySQL和SQL Server为例。我猜想有些mySQL功能(例如ORDER BY LIMIT)比SQL Server(TOP)更接近标准,因为mySQL以后来参加派对并且实际上有一个标准规范要遵循而没有遗留版本兼容。我猜想mySQL中的其他功能(update on duplicate key)更远离标准(SQL Server从标准扩展MERGE)因为他们想要更容易实现的东西和更简单的用户。我猜一些mySQL功能与SQL Server中的功能接近,以便能够挖走用户!