開發人員常在 MySQL 與 Microsoft Access 之間切換,但兩者的 SQL 方言差異極大。本文聚焦最常見的「分頁/限制結果集」語法差異:MySQL 的 LIMIT vs Access 的 TOP,並延伸對比其他關鍵差異點,助你快速移植查詢語句。
-- 取前 25 筆,按 name 排序
SELECT id, name FROM tbl_student WHERE score > 59 ORDER BY name LIMIT 25;
-- 分頁:跳過前 50 筆,取 25 筆 (第 3 頁,頁大小 25)
SELECT id, name FROM tbl_student WHERE score > 59 ORDER BY name LIMIT 50, 25;
-- 或標準語法
SELECT id, name FROM tbl_student WHERE score > 59 ORDER BY name LIMIT 25 OFFSET 50;
LIMIT [offset,] row_count 或 LIMIT row_count OFFSET offset-- 取前 25 筆,按 name 排序
SELECT TOP 25 id, name FROM tbl_student WHERE score > 59 ORDER BY name;
TOP n [PERCENT],不支援 OFFSET(無原生分頁語法)由於 Access 缺乏 OFFSET,分頁需使用子查詢或應用層游標:
-- 方案一:子查詢排除法 (效能較差,適合小數據量)
SELECT TOP 25 id, name
FROM tbl_student
WHERE score > 59
AND id NOT IN (SELECT TOP 50 id FROM tbl_student WHERE score > 59 ORDER BY name)
ORDER BY name;
-- 方案二:應用層游標 (ADO/DAO Recordset)
' VBA 範例
Set rs = db.OpenRecordset("SELECT id, name FROM tbl_student WHERE score > 59 ORDER BY name", dbOpenSnapshot)
rs.PageSize = 25
rs.AbsolutePage = 3 ' 第 3 頁
' 讀取 rs.GetRows(25)
| 功能 | MySQL | Access (ACE/Jet SQL) | 備註 |
|---|---|---|---|
| 限制筆數 | LIMIT n [OFFSET m] | TOP n | Access 無 OFFSET |
| 字串聯接 | CONCAT(str1, str2) 或 \|\| | & 或 + | Access 用 & 最安全 |
| 當前日期時間 | NOW(), CURDATE() | DATE(), NOW() | |
| 日期格式化 | DATE_FORMAT(date, '%Y-%m-%d') | FORMAT(date, 'yyyy-mm-dd') | |
| 條件判斷 | CASE WHEN ... THEN ... ELSE ... END | IIF(condition, true_val, false_val) / SWITCH() | Access 簡化版 CASE |
| 空值處理 | IFNULL(expr, val), COALESCE() | NZ(expr, val), ISNULL() | |
| 自動編號 | AUTO_INCREMENT | AUTOINCREMENT / COUNTER | |
| 註釋 | -- , # , /* */ | 不支援標準註釋 (需用 ' 或 Rem) | |
| 參數化查詢 | ? 或 :name | ? (位置參數) | Access 不支援命名參數 |
| 外連接語法 | LEFT/RIGHT JOIN ... ON | LEFT/RIGHT JOIN ... ON (支援較晚版本) | 舊版 Access 需用 WHERE 關聯 |
MySQL 的 LIMIT 與 Access 的 TOP 雖功能相似,但語法位置、分頁能力截然不同。理解這一核心差異並建立對照表,是跨平台 SQL 移植的第一步。建議在專案中建立「SQL 方言適配層」或使用成熟 ORM(如 Entity Framework、Hibernate、Dapper),屏蔽底層方言差異,專注業務邏輯開發。