Navicat 部落格

尋找通用 SQL 語法 2024 年 9 月 12 日,由 Robert Gravelle 撰寫

在九十年代中期,Sun Microsystems 推出了一種可以「一次編寫,到處執行」的語言。這種語言就是 Java。儘管 Java 後來成為迄今為止最受歡迎的程式語言之一,但他們的口號事實證明有點樂觀。Java 語言的發展過程與 SQL 的發展過程確實有一些相似之處。它也可以從一個資料庫移植到另一個資料庫,甚至跨作業系統,而且幾乎不需要進行任何修改。至少,這是夢想。在現實世界中,生產級程式碼往往需要一些調整才能在新環境中運作。本篇文章將概述不同資料庫供應商之間 SQL 語法可能不同的一些原因。

ANSI SQL 規範

ANSI 是美國國家標準協會(American National Standards Institute)的縮寫,它定義了用於與關聯式資料庫互動所需使用的基本語法規則和命令集。然而,與 HTML、CSS 和 ECMAScript 的瀏覽器實作一樣,大多數 SQL 資料庫實作存在不完善或不完整的情況。ANSI SQL 允許在一致性層級上具有一定的靈活性,因此對於供應商實施完整的規範沒有嚴格的要求。但即使在最低的基本層面上,所有供應商也至少有一點分歧。

除此之外,還有各種非標準擴展,所有供應商都以某種形式支援這些擴展。即使像索引這樣簡單的功能也是非標準的。ANSI SQL 規範沒有提及索引,因此每個供應商的索引實作都是對標準的補充。這為供應商提供了機會,可以使用他們認為適合或對品牌最有利的任何語法。結果就是出現了多種 SQL 方言,它們大致相同,但也有一些差異。

編寫靈活適用的 SQL

如果你希望 SQL 程式碼可以在所有類型的資料庫上執行,你應該堅持使用標準的 SQL 陳述式,例如 SELECT、WHERE、GROUP BY、ORDER BY 等。彙總函式如 SUM()、AVG()、MIN() 和 MAX() 也被所有流行的資料庫類型理解,包括 SQL Server、MySQL、PostgreSQL、SQLite 和 Oracle。以下是一個應該適用於任何資料庫的查詢:

Select    
    c.customer_id,
    c.customer_name,
    SUM(p.amount) AS total_sales
FROM customers AS c
    LEFT JOIN purchases AS p
    ON c.customers_id = p.customer_id
WHERE
    c.customer_location = 'Canada'
GROUP BY
    c.customer_name ASC;

學習 SQL

如果你剛開始接觸資料庫管理或開發,應該專注於盡可能適用於大多數資料庫類型的 SQL。你還應該使用高度符合 ANSI SQL 且流行的資料庫,比如 MySQL。在過去幾十年中,MySQL 一直是最受歡迎的資料庫。它還具有高度合規性,是一個優秀的學習工具。有許多關於 MySQL 的文章,大多數 SQL 範例都是在 MySQL 上開發和執行的。Microsoft SQL Server 緊跟在後。但是,它使用 Microsoft 的 SQL 方言,稱為 T-SQL。由於 SQL Server 的 SQL 與其他平台最不同,因此 SQL Server 不是理想的入門資料庫。你最好選擇 PostgreSQL 或 SQLite,它們也很受歡迎並符合 ANSI 標準。SQLite 對新手特別有吸引力,因為它小巧且高便攜性。

以下是你可能在各種資料庫之間發現的一些差異:

區分大小寫

考慮子句 WHERE name = 'Rob' 或 WHERE name = 'rob':

MySQL PostgreSQL SQLite SQL Server
等效 不等效 不等效 不等效

引號的使用

有些資料庫僅支援單引號,而其他一些允許使用單引號和雙引號:

MySQL PostgreSQL SQLite SQL Server
兩者 僅單引號 兩者 僅單引號

欄位和資料表別名

MySQL、PostgreSQL 和 SQLite 都使用「AS」關鍵字來表示別名,例如 SELECT SUM(score) AS avg_score 而 SQL Server 則使用等號,例如 SELECT SUM(score) = avg_score

日期/時間函式

每個資料庫都實作自己的日期和時間函式:

MySQL PostgreSQL SQLite SQL Server
CURDATE() CURTIME() EXTRACT() CURRENT_DATE() CURRENT_TIME() EXTRACT() DATE('now') strftime() GETDATE() DATEPART()

Navicat Premium:萬能工具

Navicat Premium 是處理各種資料庫類型的首選工具。它不僅可以同時連接到多個資料庫,而且其程式碼片段功能使編寫針對你所選資料庫類型的查詢變得比以往更加容易。程式碼片段功能可讓你在 SQL 編輯器中工作時將可重複使用程式碼插入 SQL 陳述式中。除內建了常見控制流陳述式和函式的片段集合外,你還可以定義自己的片段。

code_snippets (119K)

你可以下載 Navicat 17 進行 14 天的全功能免費試用。它適用於 Windows、macOS 和 Linux 作業系統。

Navicat 文章
頻道記錄
分享
部落格封存檔