站内搜索

搜索

06-02 13:26
05-31 17:11

Oracle和MySQL的对比

47

主题

38

点数

151

积分

地衡测影

积分
151

柴到了

发表于 2025-3-21 02:10:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x

Oracle和MySQL的对比

基本配置

Oracle 默认端口 : 1521 默认用户 :system

MySQL默认端口 : 3306 默认用户 :root

连接MySQL:

mysql -u root -p
-- 输入密码

-- 查询所有数据库
show databases;

-- 切换到‘spring’ 数据库
use spring;

-- 查询该数据库所有的表
show tables;

连接Oracle:

sqlplus
-- 输入用户名
-- 输入密码

-- 查询该用户的表
select TABLE_NAME from user_tables;

注意 :Oracle登录需要授予用户session权限,建表需要分配限额;

常用字段类型

字段类型 MySQL Oracle
数值 tinyint;smallint;int;bigint;decimal number;number(10);number(10,2)
字符串 varchar(10);char varchar2;varchar2(20)
日期 data;time;datetime;year;timestamp date

DML语句

Oracle:

create table t_student(
    sid int primary key ,
    sname varchar2(10) not null ,
    enterdate date,
    gender char(2),
    mail unique,   -- 唯一性约束
    age number check (age>19 and age<30)
)
insert into t_student values(stuseq.nextval,'Test',to_date('1990-3-4','YYYY-MM-DD'),'男','1@outlook.com',20);
commit;

MySQL:

create table t_student(
    sid int primary key auto_increment,
    sname varchar(1) not null ,
    enterdate date,
    gender char(1),
    age int,
    mail varchar(10) UNIQUE
)

insert into t_student values(null,'Test','1990-3-4','男',30,'2@outlook.com')

MySQL插入日期可以使用now()或者sysdate(),可以插入多条,用逗号分隔

删表数据:Oracle可以省略from:delete [from] t_student [where 条件]

外键约束:Oracle是constraints,MySQL是constraint

递增:MySQL可以插入时,直接给null值,Oracle插入时,使用序列名.nextval;

多表操作

Oracle:

​ 92语法:可以内连接,可以外连接(可以使用“+”来表示) 左外+在右,右外+在左

​ 99语法:可以内连接,外连接,全外连接(full join)

-- left outer join:左外连接
select e.last_name,e.department_id,d.department_name
from employees e
left outer join departments d
on (e.department_id = d.department_id);

等价于:

select e.last_name,e.department_id,d.department_name
from employees e,departments d
where e.department_id = d.department_id(+)

MySQL:只支持内连接和外连接,无全外连接

SQL语句

Oracle:

是Oracle大小写不敏感的,前提条件是在没有使用双引号 "" 的前提下(表名、字段名)

CREATE TABLE "TableName"("id" number); // 如果创建表的时候是这样写的,那么就必须严格区分大小写

SELECT * FROM "TableName"; // 不仅要区分大小写而且要加双引号,以便和上面的第三种查询方式区分开
Oracle默认是大写,对字段的具体值是敏感的

MySQL:

大小写不敏感(关键字和字段名都不区分)

阿里巴巴Java开发手册,在MySQL建表规约里有:
【强制】表名、字段名必须使用小写字母或数字 , 禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑

Windows 大小写不敏感,文件名同名大小写不同会覆盖

MySQL 在 Windows 下不区分大小写,但在 Linux 下默认是区分大小写。因此,数据库名、 表名、字段名,都不允许出现任何大写字母,避免节外生枝
MySQL 的字段 大小写都可以查到

分页

Oracle:

-- 利用rownum 
-- rownum从0开始
select * from
(select rownum rr,stu.* from (select * from t_student order by sid desc) stu )
where rr>=1 and rr<=5;

MySQL:

-- 记录从0开始
-- 从第0条开始,取5条数据
select * from test2 order by sid desc  limit 0,5

时间日期

Oracle

Java中常用的 "yyyy-MM-dd mm:HH;ss" -> "2021-02-03 16:25:48"
在 Oracle 中的表示方式:'yyyy-mm-dd hh24:mi:ss'

MySQL

-- 获取当前时间戳 
select unix_timestamp(); 
-- 1612340981

-- 获取当前日期时间
select now();
2021-02-03 16:30:22

-- 获取当前日期
select date(now());
-- 2021-02-03

-- timestamp -> datetime
select FROM_UNIXTIME(1612340981);
-- 2021-02-03 16:29:41

-- datetime -> varchar  (time与之类似:time_format(time,format))
select  DATE_FORMAT('2008-08-08 22:23:01','%Y %m %d %H %i %s');
-- 2008 08 08 22 23 01

-- varchar -> date   str_to_date(str, format)
select str_to_date('08.09.2008 08:09:30', '%m.%d.%Y %h:%i:%s'); 
-- 2008-08-09 08:09:30

Oracle

Oracle DML 需要手动提交或回滚事务
DML(Data Manipulation Language): 数据操纵语言 针对表数据的增删改查
Oracle select 查询必须有from 所以可以用from dual(这是一张神奇的表)

类型转换

date <--> varchar2 <--> number

date --> varchar2 : to_char(sysdate,'yyyy-mm-dd')
varchar2 --> date : to_date('2020-02-02','yyyy-mm-dd')

number --> varchar2: to_char(1111111.11,'999,999,999') -- 输出:1,111,111 使用'999,999,999'去匹配数字
varchar2 --> number :to_number('¥001,111,111','L000,000,000') from dual; -- 输出:1111111

L表示:当地的货币符号 字符串在运算时会自动隐式转换,含有非数字字符会报错:无效数字

温馨提示:看帖回帖是一种美德,您的每一次发帖、回帖都是对论坛最大的支持,谢谢! [这是默认签名,点我更换签名]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入社群

加入社群

Pixtech

Powered by Pixtech

© 2025 Pixtech Team.