news 2026/6/9 21:03:41

HoRain云--MySQL与Oracle语法核心差异详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--MySQL与Oracle语法核心差异详解

🎬 HoRain 云小助手:个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

MySQL 与 Oracle 语法核心区别详解

一、基础查询差异

1. FROM子句要求

2. 分页查询实现

二、数据类型差异

1. 字符串类型

2. 数值类型

3. 日期类型

三、自增主键实现

四、字符串与日期函数

1. 字符串函数

2. 日期函数

五、高级语法支持

1. 递归查询

2. 公共表表达式(CTE)

六、DML语句差异

1. 删除语句

2. 更新语句

七、其他重要差异

1. 字符串拼接

2. 事务控制

3. 空值处理

八、迁移注意事项


MySQL 与 Oracle 语法核心区别详解

一、基础查询差异

1. FROM子句要求

-- Oracle:必须包含FROM子句,无表时需用虚拟表 SELECT SYSDATE FROM DUAL; -- MySQL:允许省略FROM直接查询 SELECT NOW();

2. 分页查询实现

-- Oracle:使用ROWNUM伪列,需嵌套子查询 SELECT * FROM ( SELECT t.*, ROWNUM rn FROM ( SELECT * FROM employees ORDER BY id ) t WHERE ROWNUM <= 20 ) WHERE rn > 10; -- MySQL:直接通过LIMIT简化分页 SELECT * FROM employees ORDER BY id LIMIT 10, 10; -- 跳过10条,取10条

二、数据类型差异

1. 字符串类型

-- Oracle VARCHAR2(4000) -- 变长字符串,最大4000字节(12c后可扩展至32767) CHAR(2000) -- 定长字符串,最大2000字节 -- 注意:Oracle不区分NULL和空字符串,空字符串会被转换为NULL -- MySQL VARCHAR(65535) -- 变长字符串,最大65535字节 CHAR(255) -- 定长字符串,最大255字节 -- 注意:MySQL区分NULL和空字符串

2. 数值类型

-- Oracle NUMBER(10,2) -- 总共10位,小数点后2位 -- MySQL DECIMAL(10,2) -- 等同于Oracle的NUMBER INT -- 整数类型

3. 日期类型

-- Oracle DATE -- 包含日期和时间 TIMESTAMP -- 包含日期、时间和时区 -- MySQL DATE -- 仅包含日期(YYYY-MM-DD) DATETIME -- 包含日期和时间(YYYY-MM-DD HH:MM:SS) TIMESTAMP -- 包含日期和时间,范围较小

三、自增主键实现

-- MySQL:通过AUTO_INCREMENT自动管理 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) ); -- Oracle:需手动创建序列实现自增 CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1; CREATE TABLE users ( id NUMBER PRIMARY KEY, name VARCHAR2(50) ); -- 插入数据时使用序列 INSERT INTO users VALUES (user_seq.NEXTVAL, 'John');

四、字符串与日期函数

1. 字符串函数

-- 获取字符串长度 -- Oracle SELECT LENGTH('Hello') FROM DUAL; -- 返回5 -- MySQL SELECT CHAR_LENGTH('Hello'); -- 返回5 -- 查找子串位置(注意参数顺序相反) -- Oracle SELECT INSTR('Hello World', 'World') FROM DUAL; -- 返回7 -- MySQL SELECT LOCATE('World', 'Hello World'); -- 返回7

2. 日期函数

-- 获取当前时间 -- Oracle SELECT SYSDATE FROM DUAL; SELECT SYSTIMESTAMP FROM DUAL; -- MySQL SELECT NOW(); SELECT CURRENT_TIMESTAMP; -- 日期格式化 -- Oracle SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS') FROM DUAL; -- MySQL SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');

五、高级语法支持

1. 递归查询

-- Oracle:提供专门的START WITH ... CONNECT BY PRIOR语法 SELECT employee_id, manager_id, LEVEL FROM employees START WITH manager_id IS NULL CONNECT BY PRIOR employee_id = manager_id; -- MySQL:8.0+版本支持WITH RECURSIVE WITH RECURSIVE employee_hierarchy AS ( SELECT employee_id, manager_id, 1 AS level FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.employee_id, e.manager_id, eh.level + 1 FROM employees e INNER JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id ) SELECT * FROM employee_hierarchy;

2. 公共表表达式(CTE)

-- Oracle:支持WITH语法 WITH dept_avg AS ( SELECT department_id, AVG(salary) AS avg_sal FROM employees GROUP BY department_id ) SELECT e.name, e.salary, d.avg_sal FROM employees e JOIN dept_avg d ON e.department_id = d.department_id; -- MySQL:8.0+版本支持WITH RECURSIVE WITH dept_avg AS ( SELECT department_id, AVG(salary) AS avg_sal FROM employees GROUP BY department_id ) SELECT e.name, e.salary, d.avg_sal FROM employees e JOIN dept_avg d ON e.department_id = d.department_id;

六、DML语句差异

1. 删除语句

-- Oracle:两种格式都合法,可以使用别名 DELETE FROM table_name; DELETE table_name; DELETE FROM table_name t WHERE t.id = 1; -- MySQL:必须使用DELETE FROM格式,不能直接在DELETE后使用别名 DELETE FROM table_name; DELETE FROM table_name WHERE id = 1; -- 不能写成:DELETE table_name t WHERE t.id = 1;

2. 更新语句

-- Oracle:支持在UPDATE中使用子查询 UPDATE employees e SET salary = (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id) WHERE department_id = 10; -- MySQL:语法类似,但有一些限制 UPDATE employees e JOIN (SELECT department_id, AVG(salary) AS avg_sal FROM employees GROUP BY department_id) d ON e.department_id = d.department_id SET e.salary = d.avg_sal WHERE e.department_id = 10;

七、其他重要差异

1. 字符串拼接

-- Oracle:使用||操作符 SELECT 'Hello' || ' ' || 'World' FROM DUAL; -- MySQL:使用CONCAT函数或||(需设置PIPES_AS_CONCAT) SELECT CONCAT('Hello', ' ', 'World'); -- 或设置:SET sql_mode='PIPES_AS_CONCAT'; -- 然后:SELECT 'Hello' || ' ' || 'World';

2. 事务控制

-- Oracle:默认开启事务,需要显式COMMIT UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10; COMMIT; -- 或 ROLLBACK; -- MySQL:取决于存储引擎,InnoDB支持事务 -- 默认自动提交,可通过设置关闭 SET autocommit = 0; UPDATE employees SET salary = salary * 1.1 WHERE department_id = 10; COMMIT; -- 或 ROLLBACK;

3. 空值处理

-- Oracle:空字符串会被转换为NULL INSERT INTO test_table (name) VALUES (''); -- 实际存储为NULL -- MySQL:区分空字符串和NULL INSERT INTO test_table (name) VALUES (''); -- 存储为空字符串 INSERT INTO test_table (name) VALUES (NULL); -- 存储为NULL

八、迁移注意事项

  1. 数据类型映射:迁移时注意类型转换,如Oracle的NUMBER对应MySQL的DECIMAL
  2. 日期处理:Oracle的DATE包含时间,MySQL的DATE仅包含日期
  3. 分页查询:重写分页逻辑,从ROWNUM改为LIMIT
  4. 自增主键:将序列逻辑改为AUTO_INCREMENT
  5. 字符串函数:替换LENGTH为CHAR_LENGTH,INSTR为LOCATE等
  6. 空值处理:注意Oracle中空字符串与NULL的等价性

掌握这些核心差异,可以有效避免在跨数据库开发和迁移过程中遇到的常见问题,提高开发效率和代码质量。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 18:28:23

MGW-10000微机控制静载锚固试验机

MGW-10000微机控制静载锚固试验机 一、产品主要功能  本机主要用于混凝土结构和构件用预应力钢绞线锚具、夹具和连接器&#xff0c;预应力钢结构钢绞线锚具、夹具和连接器&#xff0c;拉索锚具、夹具和连接器&#xff0c;预应力筋锚具、夹具和连接器的静载锚固性能测试…

作者头像 李华
网站建设 2026/6/6 6:45:12

Python 异步编程实战:深入理解背压机制与 asyncio.Queue 的流量控制艺术

Python 异步编程实战:深入理解背压机制与 asyncio.Queue 的流量控制艺术 引言:当数据洪流遇见处理瓶颈 在我十多年的 Python 开发生涯中,曾亲眼见证过一个生产环境中的"惨案":一个实时数据采集系统在运行三小时后突然崩溃,原因是内存溢出。事后分析发现,数据…

作者头像 李华
网站建设 2026/6/5 18:26:28

告别低效自动化:这套五步框架,让你的Workflow进化为高阶Skill

Workflow 的天花板极低。你无法在节点里表达复杂的递归逻辑&#xff0c;难以复用模块&#xff0c;更无法进行版本管理&#xff08;GitOps&#xff09;。当你想要把一个写好的工作流分享给别人时&#xff0c;导出导入的过程充满了环境依赖的深坑。 这是典型的「低代码陷阱」在 …

作者头像 李华
网站建设 2026/6/6 12:25:59

荣耀“宣布清仓”,16GB+512GB+2亿像素,从3999元跌至2947元

手机分屏 摄像头像素越高&#xff0c;不代表拍照效果就一定越好&#xff0c;这一点很多人都明白&#xff0c;但是关注手机行业人应该能明显感知到&#xff0c;这一年时间里&#xff0c;配备2亿像素摄像头的手机数量越来越多了&#xff0c;无论是小米、OPPO、vivo还是荣耀&#…

作者头像 李华
网站建设 2026/6/8 7:10:56

多功能场馆预约系统源码,支持分时计价、节假日设置与多端预订

温馨提示&#xff1a;文末有资源获取方式 在全民健身和体育产业政策利好的大背景下&#xff0c;各类场馆迎来了发展黄金期&#xff0c;但竞争也日趋激烈。实现精细化、数字化运营&#xff0c;是场馆脱颖而出的关键。源码获取方式在源码闪购网。 详细功能列表阐述&#xff1a; …

作者头像 李华