2012-01-13 95 views
1

我想知道在查看查詢語句時,SQL實現之間通常會有哪些不同類型的東西。我認爲有一件事是在WHERE子句中使用IS NULL。例如參見bleow。我正在編寫一個查詢語句解析器,它以自定義語言處理語句和查詢,並且需要考慮更廣泛使用的SQL產品之間的大部分差異。SQL語句語法差異

甲骨文語法:

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

MySQL的語法?

SQL Server語法?

+0

如果您需要擔心各種風格的SQL之間的差異,這本書是非常寶貴的:http://www.amazon.com/SQL-Nutshell-OReilly-Kevin-Kline/dp/0596518846/ref=sr_1_3?s =書籍&即= UTF8&QID = 1326486636&SR = 1-3 – HLGEM 2012-01-13 20:42:44

回答

5

我不確定你會找到所有區別的明確清單。有幾件事情我能想到把我的頭頂部:

  • MySQL使用極限而SQL Server使用TOP。
  • 對於GROUP BY操作,SQL Server比MySQL更嚴格,要求SELECT中的所有非聚合列出現在GROUP BY子句中。
  • SQL Server支持超出ANSI標準的專有UPDATE FROM和DELETE FROM語法。
  • 存在於一個系統中但不是另一個系統中的功能。 MySQL具有SQL Server中不存在的FIND_IN_SET和GROUP_CONCAT。同樣,SQL Server也有MySQL中不存在的ROW_NUMBER()。
5

IS NULL/IS NOT NULL語法是ANSI標準SQL,並且在所有這三種RDBMS中都支持,因爲您已將它列爲Oracle。

2

IS NULL和IS NOT NULL幾乎是無處不在。基本查詢的主要區別與函數調用有關,而且這些差異很大,所以你必須在那裏更加具體。

0

您可以將這兩個查詢應用於所有rdbms。這是標準的ansi。

1

在不同的RDMBS實現之間有很多不同的東西。下面是不使用任何特定功能的一個簡單的例子:

在Oracle中,你可以作如下更新從表B中的數據表答:

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中是無效的,反之亦然,因此您無法解決共同的問題。爲這種特定語法編寫解析器是一項挑戰,因此一般解析器似乎是一項非常重要的任務。

0

大約十年前,我把一個自破裂以來的鏈接加入了一個標題爲「供應商遵從ANSI SQL的級別」的文檔。我保留下來,所以我可以想,「啊,多麼古怪。」該標準現在是ISO(I =國際)而不僅僅是ANSI(A =美國)。沒有人試圖爲多個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中的功能非常接近,以便能夠挖掘用戶!