学习Oracle------Oracle和mysql在SQL 语句上的的异同 (及Oracle在写SQL 语句时的注意事项)

Oracle 和mysql在SQL 语句上的的异同 (及Oracle在写SQL 语句时的注意事项)

以下是 Oracle 与 MySQL 在 SQL 语句上的核心差异对比及 Oracle 专属注意事项的详细解析:


一、SQL 语句核心差异对比

1. 分页查询
场景 Oracle MySQL
标准分页 需嵌套子查询+ROWNUM SELECT * FROM ( SELECT t.*, ROWNUM rn FROM table t WHERE ROWNUM <= 20 ) WHERE rn > 10 原生支持 LIMIT SELECT * FROM table LIMIT 10, 10
12c+新语法 OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY -
2. 日期处理
操作 Oracle MySQL
当前时间 SYSDATE (含时间) CURRENT_DATE (会话时区) NOW() (含时间) CURDATE() (仅日期)
日期计算 直接加减天数: SYSDATE + 1 (明天) 需函数: DATE_ADD(NOW(), INTERVAL 1 DAY)
格式化 TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')
3. 字符串操作
功能 Oracle MySQL
连接 `'str1'
空值处理 NVL(col, 'default') IFNULL(col, 'default')
正则匹配 REGEXP_LIKE(col, 'pattern') col REGEXP 'pattern'
4. 系统函数差异
函数 Oracle MySQL
类型转换 TO_NUMBER('123') TO_DATE('2023-01-01', 'YYYY-MM-DD') CAST('123' AS SIGNED) STR_TO_DATE('2023-01-01', '%Y-%m-%d')
序列生成 CREATE SEQUENCE seq; SELECT seq.NEXTVAL FROM dual; AUTO_INCREMENT (表属性)
伪表 必须 FROM dual SELECT 1+1 FROM dual; 可省略 SELECT 1+1;

二、Oracle SQL 专属注意事项

1. 性能陷阱规避
  • 🚫 禁止隐式类型转换 :

    索引列上的类型转换导致全表扫描

    sql 复制代码
    -- 错误(假设phone是字符串)
    SELECT * FROM users WHERE phone = 13800138000; 
    
    -- 正确
    SELECT * FROM users WHERE phone = '13800138000';
  • ⚠️ 避免全表扫描操作符:

    sql 复制代码
    -- 慎用(导致索引失效)
    WHERE col IS NULL
    WHERE col NOT IN (...)
    WHERE col LIKE '%abc'
  • 💡 绑定变量强制使用:

    sql 复制代码
    -- 错误(硬解析消耗CPU)
    SELECT * FROM orders WHERE order_id = 1001;
    
    -- 正确(绑定变量)
    SELECT * FROM orders WHERE order_id = :order_id;
2. 高级特性使用规范
  • 分析函数优化统计:

    sql 复制代码
    -- 部门工资排名(避免自连接)
    SELECT name, salary,
           RANK() OVER (PARTITION BY dept_id ORDER BY salary DESC) dept_rank
    FROM employees;
  • MERGE 语句代替重复操作:

    sql 复制代码
    MERGE INTO employees e
    USING (SELECT :id id, :name name FROM dual) new
    ON (e.id = new.id)
    WHEN MATCHED THEN UPDATE SET e.name = new.name
    WHEN NOT MATCHED THEN INSERT (id, name) VALUES (new.id, new.name);
3. 开发避坑指南
  • 空字符串处理 :

    Oracle 将 '' 视为 NULL,需特殊处理:

    sql 复制代码
    -- 错误(无结果)
    SELECT * FROM users WHERE name = '';
    
    -- 正确
    SELECT * FROM users WHERE name IS NULL;
  • 事务控制分离 :

    DML 语句必须显式提交:

    sql 复制代码
    UPDATE accounts SET balance = balance - 100 WHERE id = 100;
    COMMIT; -- 必须显式提交
  • DDL 自动提交 :
    CREATE/ALTER/DROP 语句执行后立即提交,无法回滚


三、跨数据库兼容方案

1. 分页查询兼容写法
sql 复制代码
/* 通用分页模板 */
SELECT * FROM (
  SELECT t.*, ROW_NUMBER() OVER (ORDER BY id) rn 
  FROM table t
) WHERE rn BETWEEN :start AND :end
2. 日期处理兼容函数
sql 复制代码
/* 三天后日期 */
-- Oracle
SELECT SYSDATE + 3 FROM dual;

-- MySQL
SELECT DATE_ADD(NOW(), INTERVAL 3 DAY);

-- 兼容方案(应用层计算)
3. 空值处理兼容
sql 复制代码
/* 空值转默认值 */
-- Oracle
SELECT NVL(col, 0) FROM table;

-- MySQL
SELECT IFNULL(col, 0) FROM table;

-- 兼容方案
CREATE FUNCTION safe_null(val NUMBER, def NUMBER) RETURN NUMBER IS
BEGIN
  RETURN COALESCE(val, def);
END;

四、Oracle 性能优化黄金法则

  1. 执行计划分析:

    sql 复制代码
    EXPLAIN PLAN FOR 
    SELECT * FROM large_table WHERE col = :value;
    
    SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
  2. 索引设计原则:

    • 组合索引字段顺序:高选择性列在前
    • 避免在索引列使用函数
    • 位图索引仅适用于低基数列(<100个唯一值)
  3. 批量操作替代循环:

    sql 复制代码
    -- 错误(逐行提交)
    FOR i IN 1..1000 LOOP
       INSERT INTO log VALUES (...);
       COMMIT;
    END LOOP;
    
    -- 正确(批量提交)
    INSERT INTO log SELECT ... FROM bulk_table;
    COMMIT;

终极建议 :在 Oracle 中开发时,始终通过 DBMS_OUTPUT.PUT_LINE 打印执行耗时,对超过 100ms 的 SQL 必须进行执行计划分析。同时善用 AWR 报告定期进行系统级性能诊断。

通过掌握这些差异和注意事项,可显著提升 Oracle SQL 的开发效率和执行性能,避免踩坑。

相关推荐
写后端的胖头鱼4 小时前
【高频面试题】FullText 全文索引(MySQL)
数据库·mysql·索引·全文索引
lie..5 小时前
30天从零开始学AI应用开发(Day 17):ChromaDB 上手:给本地文档建一个“外挂大脑”
数据库·人工智能·oracle
code_whiter6 小时前
01-MySQL数据库基础
数据库·mysql
vx_Biye_Design9 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
Elastic 中国社区官方博客9 小时前
错误最多的服务运行正常:使用 ES|QL 从日志进行根因分析
大数据·运维·数据库·sql·elasticsearch·搜索引擎·全文检索
做运维的阿瑞9 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
Seraphina369 小时前
DVWA(SQL Injection-High,XSS Reflected-Medium,XSS Stored-Medium)
数据库·经验分享·sql·网络安全·xss
2501_9336707910 小时前
2027风控策略岗秋招准备:SQL、Excel、建模的优先级与项目路径
人工智能·sql·excel
java1234_小锋10 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
其实防守也摸鱼10 小时前
DeepSeek Harness 开源贡献手记:从 Issue 到 Merge 的完整旅程
android·数据库·学习·ai·oracle·自动化