MySQL和Oracle常见语法差异详解

发布于:2025-04-05 ⋅ 阅读:(58) ⋅ 点赞:(0)

MySQL和Oracle常见语法差异详解

引言

在数据库开发中,MySQL和Oracle是两个最常用的关系型数据库管理系统。虽然它们都遵循SQL标准,但在具体实现上存在一些差异。本文将详细介绍MySQL和Oracle在SQL语法上的主要区别,帮助开发人员更好地处理跨数据库开发。

1. 日期时间处理

1.1 日期格式化

  • MySQL:
DATE_FORMAT(date, '%Y-%m-%d %H:%i:%s')
STR_TO_DATE(str, '%Y-%m-%d %H:%i:%s')
  • Oracle:
TO_DATE(str, 'YYYY-MM-DD HH24:MI:SS')
TO_CHAR(date, 'YYYY-MM-DD HH24:MI:SS')

1.2 获取当前时间

  • MySQL:
NOW()
CURDATE()
CURTIME()
  • Oracle:
SYSDATE
TRUNC(SYSDATE)  -- 获取当前日期
TO_CHAR(SYSDATE, 'HH24:MI:SS')  -- 获取当前时间

2. 字符串处理

2.1 字符串连接

  • MySQL:
CONCAT(str1, str2, str3)
  • Oracle:
str1 || str2 || str3

2.2 字符串替换

  • MySQL:
REPLACE(str, from_str, to_str)
  • Oracle:
REPLACE(str, from_str, to_str)
TRANSLATE(str, from_str, to_str)  -- 字符级替换

3. 分页查询

3.1 基本分页

  • MySQL:
SELECT * FROM table LIMIT offset, count
  • Oracle:
SELECT * FROM (
    SELECT a.*, ROWNUM rnum FROM (
        SELECT * FROM table
    ) a WHERE ROWNUM <= end_row
) WHERE rnum > start_row

3.2 获取前N条记录

  • MySQL:
SELECT * FROM table LIMIT N
  • Oracle:
SELECT * FROM table WHERE ROWNUM <= N

4. 序列处理

4.1 自增主键

  • MySQL:
CREATE TABLE table_name (
    id INT AUTO_INCREMENT PRIMARY KEY
)
  • Oracle:
CREATE SEQUENCE seq_name
    START WITH 1
    INCREMENT BY 1
    NOCACHE
    NOCYCLE;

CREATE TABLE table_name (
    id NUMBER PRIMARY KEY
)

4.2 获取序列值

  • MySQL:
LAST_INSERT_ID()
  • Oracle:
seq_name.NEXTVAL
seq_name.CURRVAL

5. 空值处理

5.1 空值判断

  • MySQL:
IFNULL(expr1, expr2)
COALESCE(expr1, expr2, ...)
  • Oracle:
NVL(expr1, expr2)
NVL2(expr1, expr2, expr3)
COALESCE(expr1, expr2, ...)

6. 字符串聚合

6.1 多行字符串合并

  • MySQL:
GROUP_CONCAT(column ORDER BY column SEPARATOR ',')
  • Oracle:
LISTAGG(column, ',') WITHIN GROUP (ORDER BY column)

7. 数据类型差异

7.1 数值类型

  • MySQL:
INT, BIGINT, DECIMAL
  • Oracle:
NUMBER, NUMBER(p,s), INTEGER

7.2 日期时间类型

  • MySQL:
DATETIME, DATE, TIME, TIMESTAMP
  • Oracle:
DATE, TIMESTAMP

8. 函数差异

8.1 日期计算

  • MySQL:
DATE_ADD(date, INTERVAL expr unit)
DATE_SUB(date, INTERVAL expr unit)
  • Oracle:
date + INTERVAL '1' DAY
date - INTERVAL '1' DAY

8.2 字符串长度

  • MySQL:
LENGTH(str)
CHAR_LENGTH(str)
  • Oracle:
LENGTH(str)
LENGTHB(str)  -- 字节长度

9. 事务处理

9.1 事务隔离级别

  • MySQL: 默认REPEATABLE-READ
  • Oracle: 默认READ-COMMITTED

9.2 事务回滚

  • MySQL:
ROLLBACK TO SAVEPOINT savepoint_name
  • Oracle:
ROLLBACK TO SAVEPOINT savepoint_name

10. 性能优化

10.1 索引使用

  • MySQL: 支持前缀索引
  • Oracle: 不支持前缀索引

10.2 执行计划

  • MySQL: EXPLAIN
  • Oracle: EXPLAIN PLAN FOR

网站公告

今日签到

点亮在社区的每一天
去签到