首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 與 MySQL 9 大關鍵差異:群組函數、自增、引號、分頁、長字串、日期、空值、模糊查詢、資源釋放

     編輯:MySQL 資料庫相關知識

從 Oracle 遷移 MySQL 或雙資料庫開發時的 9 大關鍵差異對照表,含語法、函數、行為差異與遷移建議。

差異對照總表

#項目OracleMySQL遷移建議
1群組函數SELECT 非群組欄位需在 GROUP BY允許非 GROUP BY 欄位(唯一值任取)MySQL 啟用 ONLY_FULL_GROUP_BY 對齊
2自動遞增Sequence + TriggerAUTO_INCREMENT / IDENTITY改用 MySQL 原生自增
3字串引號僅單引號 'str'單/雙引號皆可統一用單引號
4分頁查詢ROWNUM 子查詢多層嵌套LIMIT offset, countMySQL 簡潔得多
5長字串>4000 需 CLOB + DBMS_LOBTEXT/LONGTEXT 直支援MySQL 無 4000 限制
6日期型別DATE 含時分秒,SYSDATEDATE/TIME/DATETIME/TIMESTAMP 分離注意型別對應
7空字串/NULLNOT NULL 真正禁止空值NOT NULL 仍可存空字串匯入時空字串轉 ' '
8模糊查詢INSTR(col, 'str')>0 可用索引LIKE '%str%' 不用索引MySQL 考慮全文索引
9游標/結果集嚴格要求關閉釋放相對寬鬆養成好習慣显式關閉

詳細補充說明

1. 群組函數:MySQL 5.7+ 預設啟用 ONLY_FULL_GROUP_BY

-- Oracle 必須寫
SELECT deptno, COUNT(*) FROM emp GROUP BY deptno;

-- MySQL 舊版允許(隨機取一筆 ename)
SELECT deptno, ename, COUNT(*) FROM emp GROUP BY deptno;
-- 新版報錯,需加入 GROUP BY 或用 ANY_VALUE(ename)

2. 自增:Oracle Sequence 模擬

CREATE SEQUENCE seq_emp_id INCREMENT BY 1 START WITH 1 MAXVALUE 999999;
INSERT INTO emp (id, name) VALUES (seq_emp_id.NEXTVAL, 'John');

4. 分頁:Oracle 標準寫法

SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT * FROM emp ORDER BY hiredate
    ) a WHERE ROWNUM <= 100
) WHERE rn > 80;

6. 日期函數對照

功能OracleMySQL
目前時間SYSDATENOW()
字串轉日期TO_DATE('2024-01-01','YYYY-MM-DD')STR_TO_DATE('2024-01-01','%Y-%m-%d')
日期轉字串TO_CHAR(sysdate,'YYYY-MM-DD HH24:MI:SS')DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s')
7天前SYSDATE - 7DATE_SUB(NOW(), INTERVAL 7 DAY)

8. 模糊查詢效能

  • Oracle INSTR 可使用索引(函數索引)
  • MySQL LIKE '%str%' 導致全表掃描
  • MySQL 方案:FULLTEXT INDEX、ngram parser(中文)、外部搜尋引擎
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved