Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL与Oracle对比

MySQL与Oracle对比及区别说明

作者:web18285482512

这篇文章主要介绍了MySQL与Oracle对比及区别说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、比较

1、MySQL的特点

2、Oracle的特点

3、MySQL的缺点

4、Oracle的缺点

5、技术选型

Oracle适用场景

MySQL适用场景

二、区别对比

1、本质的区别

Oracle数据库是一个对象关系数据库管理系统(ORDBMS)。它通常被称为Oracle RDBMS或简称为Oracle,是一个收费的数据库。

MySQL是一个开源的关系数据库管理系统(RDBMS)。它是世界上使用最多的RDBMS,作为服务器运行,提供对多个数据库的多用户访问。它是一个开源、免费的数据库。

RDBMS和ORDBMS的区别

标准

缩写含义

数据存储方式

数据复杂性

分组

数据处理

主要目标

主键

2、基本操作区别

(1)、用户名、端口号

(2)、登录方式

mysql -u root -p
-- 输入密码
-- 查询所有数据库
show databases;
-- 切换到 "test" 这个数据库
use test;
-- 查询该数据库所有表
show tables;
--修改户密码
set password for 用户名@localhost = password('新密码')
sqlplus
-- 输入用户名
-- 输入密码
-- 查询该用户的表
select TABLE_NAME from user_tables;

--修改密码
ALTER USER 用户名 IDENTIFIED BY 新密码;

(3)、数据库安全性

3、语法区别

(1)、大小写是否敏感

(2)、常用字段类型

(3)、时间日期

(4)、创建表空间 / 数据库

MySQL:创建数据库相对简单,使用 CREATE DATABASE 语句。

CREATE DATABASE my_database;

对于表空间管理,在 MySQL 中可以通过 InnoDB 存储引擎的文件系统来管理表空间,通过设置参数 innodb_data_file_path 等来配置表空间文件。

Oracle:创建表空间使用 CREATE TABLESPACE 语句,并且可以指定数据文件的位置、大小等多种属性。

CREATE TABLESPACE my_tablespace DATAFILE 'my_tablespace.dbf' SIZE 100M;

创建数据库则需要先创建表空间,然后通过数据库配置助手(DBCA)或一系列复杂的 SQL 语句来创建数据库,包括定义控制文件、日志文件等。

(5)、创建临时表

MySQL:可以使用 CREATE TEMPORARY TABLE 语句创建临时表。

CREATE TEMPORARY TABLE temp_table (id INT, name VARCHAR (20));

临时表只在当前会话中可见,当会话结束时,临时表会自动被删除。

Oracle:同样可以创建临时表,分为会话级临时表和事务级临时表。会话级临时表在整个会话期间存在,使用 CREATE GLOBAL TEMPORARY TABLE 语句创建;

CREATE GLOBAL TEMPORARY TABLE temp_table (id NUMBER, name VARCHAR2 (20)) ON COMMIT PRESERVE ROWS;(ON COMMIT PRESERVE ROWS 表示会话级)

事务级临时表在事务结束时自动删除,创建时使用 ON COMMIT DELETE ROWS。

(6)、创建表和插入记录

MySQL:创建表的基本语法是 CREATE TABLE table_name (column1 datatype, column2 datatype, …)

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR (50), age INT);

插入记录使用 INSERT INTO 语句,如

INSERT INTO users (name, age) VALUES ('John', 30)

Oracle:创建表的语法类似,如

CREATE TABLE employees (employee_id NUMBER PRIMARY KEY, employee_name VARCHAR2 (100), department_id NUMBER);

插入记录时

INSERT INTO employees (employee_name, department_id) VALUES ('Alice', 101);

Oracle 还支持通过子查询来插入数据,这在复杂的数据加载场景中很有用。

(7)、事务隔离级别

MySQL:支持四种事务隔离级别,分别是 :

Oracle:默认的事务隔离级别是 READ COMMITTED。

(8)、事务提交方式

(9)、分页

MySQL:在 MySQL 中,分页通常使用 LIMIT 子句。例如,SELECT * FROM table_name LIMIT start, count;,其中 start 是起始行索引(从 0 开始),count 是要返回的行数。这种方式简单直接,适用于简单的分页需求。

Oracle:分页相对复杂一些。可以使用 ROWNUM 伪列来实现分页。例如,

SELECT * FROM (SELECT a.*, ROWNUM rnum FROM (SELECT * FROM table_name) a WHERE ROWNUM <= end_row) WHERE rnum >= start_row;

其中 start_row 和 end_row 分别是起始行和结束行的编号。

从Oracle 12C开始,提供了一种行限制(row limit)的写法,这种写法也可以用于分页查询。

select * from emp order by sal fetch first 5 rows only;
            EMPNO ENAME                                                     MGR HIREDATE         SAL        COM     DEPTNO
       ---------- -------------------------------------------------- ---------- --------- ---------- ---------- ----------
               92  Bryana  Worswick                                          80 03-JUL-18       2504          1         10
               99  Rufus  McDermott-Row                                      63 01-MAR-02       2512         61         10
               36  Jacenta  Joust                                            71 31-JAN-05       2515          9         30
                2  Blisse  Adamoli                                           65 12-APR-14       2517         67         20
               98  Simona  Shropshire                                        52 16-AUG-08       2518         24         88

(10)、查询语句

MySQL:基本的查询语法是

 SELECT column1, column2, … FROM table_name WHERE condition;

支持多种连接查询,如内连接(INNER JOIN)、左连接(LEFT JOIN)、右连接(RIGHT JOIN)等。例如

SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;

Oracle:查询语法相似,如

SELECT column1, column2, … FROM table_name WHERE condition;

在连接查询方面,Oracle 也支持标准的 SQL 连接语法,同时还有自己独特的语法,如使用 “(+)” 来表示外连接,不过这种语法现在已经不推荐使用,推荐使用标准的 JOIN 语法。

(11)、id 递增的处理

MySQL:可以在创建表时使用 AUTO_INCREMENT 关键字来定义一个自动递增的主键列。例如

CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR (100));

每次插入新记录时,不需要指定 id 的值,MySQL 会自动为其分配一个唯一递增的值。

Oracle:没有像 MySQL 那样的 AUTO_INCREMENT 关键字。通常使用序列(SEQUENCE)来实现类似的功能。首先创建一个序列,如

CREATE SEQUENCE product_seq START WITH 1 INCREMENT BY 1;

然后在插入记录时,通过调用序列的 NEXTVAL 属性来获取下一个递增的值插入到 id 列中,例如

INSERT INTO products (id, product_name) VALUES (product_seq.NEXTVAL, 'Product A');

(12)、null 值处理

MySQL:在查询中,可以使用 IS NULL 或者 IS NOT NULL 来判断列值是否为 null。例如,

SELECT * FROM table_name WHERE column_name IS NULL;

在函数使用中,一些函数在遇到 null 值时会返回特定的结果,如 SUM 函数在计算包含 null 值的列时会忽略 null 值。

Oracle:同样使用 IS NULL 和 IS NOT NULL 来判断 null 值。在函数处理方面,Oracle 的函数对 null 值的处理方式也有自己的规则,例如 NVL 函数可以将 null 值转换为指定的值,NVL (column_name, 0) 会将 column_name 中的 null 值转换为 0。

(13)、小数格式化

(14)、多条件判断

MySQL:在 WHERE 子句中可以使用 AND、OR 逻辑运算符来组合多个条件。例如,

SELECT * FROM table_name WHERE condition1 AND condition2;

也可以使用 CASE 语句在查询结果中进行多条件判断,例如

SELECT column_name, CASE WHEN condition1 THEN value1 WHEN condition2 THEN value2 ELSE value3 END AS new_column FROM table_name;

Oracle:逻辑运算符 AND 和 OR 的使用方式与 MySQL 相同。Oracle 也支持 CASE 语句,并且还支持 DECODE 函数进行简单的多条件判断,例如

 SELECT column_name, DECODE (condition, value1, result1, value2, result2, default_result) AS new_column FROM table_name;

(15)、单引号的处理

MySQL:在 SQL 语句中,字符串常量通常需要用单引号括起来。如果字符串本身包含单引号,需要使用反斜杠()进行转义,例如

 INSERT INTO table_name (column_name) VALUES ('It's a sample');

Oracle:同样,字符串常量用单引号括起来。如果有单引号,需要使用两个单引号来表示一个单引号,例如

 INSERT INTO table_name (column_name) VALUES ('It''s a sample');

(16)、模糊查询

MySQL:使用 LIKE 关键字进行模糊查询,支持通配符 “%”(表示任意字符序列)和 “_”(表示任意单个字符)。例如,

SELECT * FROM table_name WHERE column_name LIKE '% keyword%';

Oracle:也使用 LIKE 关键字进行模糊查询,通配符的使用方法与 MySQL 相同。此外,Oracle 还提供了一些高级的文本搜索功能,如使用 CONTAINS 函数(需要安装并配置 Oracle Text 组件)来进行更复杂的文本搜索。

(17)、时间相减

oracle对于计算前7天,时间减7就行了,计算前1个小时,时间减1/24就行了,加法同理:

select TO_DATE('2023-03-28 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -7 from dual;
-- 计算前7天,结果:2023-03-21 15:51:20

select TO_DATE('2023-03-28 15:51:20', 'yyyy-mm-dd hh24:mi:ss') -1/24 from dual;
-- 计算前1个小时,结果:2023-03-28 14:51:20

mysql计算前7天,或者前1个小时,需要用不同的关键字:

select date_sub('2023-03-28 15:51:20' ,interval 7 day);
-- 计算前7天,结果:2023-03-21 15:51:20

select date_sub('2023-03-28 15:51:20' ,interval 1 hour);
-- 计算前1个小时,结果:2023-03-28 14:51:20

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文