Oracle与MySQL语句上的部分区别(整理-转)

本文详细对比了MySQL与Oracle在数据库创建、表结构管理、索引处理等方面的差异,并针对空字符串处理、数据类型等方面进行了深入探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、数据库

mysql可以创建数据库,而oracle没有这个操作,oracle只能创建实例;
sql数据库操作:database
格式:

-创建数据库
create database 数据库名;
create database 数据库名 character set 字符集;

-查看所有数据库
SHOW DATABASES;
-查看定义的数据库
SHOW CREATE 数据库名;
-删除数据库
DROP DATABASE 数据库名;
-切换数据库
USE 数据库名;
-查看正在使用的数据库:
SELECT database();

2、表

2.1 创建表(异)

mysql
1、mysql没有number、varchar2()类型;
2、mysql可以声明自增长:auto_increment;
3、mysql有double类型;
oracle
1、oracle没有double类型、有int类型但多数会用number来代替int;
2、oracle不可以声明自增长:auto_increment,主键自带自增长;
3、oracle小数只有float类型;

-- MySQL:
create TABLE emp(
  eno INT PRIMARY KEY AUTO_INCREMENT, -- 主键,自增
  ename VARCHAR(20) NOT NULL UNIQUE, -- 非空,唯一
  job VARCHAR(10) DEFAULT '员工', -- 默认job项为员工
  mgr INT(10),
  hiredate  DATE,
  comm DOUBLE 
);
-- Oracle:
create table emp(
  empno number(10) primary key ,--主键
  ename varchar2(20) not null unique,--非空,唯一
  job varchar2(10) default '匿名',--默认job项为匿名,用单引号
  mgr number(10),
  hiredate date,--默认格式DD-MM-YY
  sal number(10,2), -- 10位有效数字,两位小数位
  comm float,
  deptno number(10)
);

2.2 删除表(异)

MySQL:

drop table if exists 表名;

Oracle:

drop table 表名;
-- Oracle没有if exists关键字,也没用类似if exists的SQL语法。

3、列

3.1 添加列(异)

MySQL:

alter table 表名 add column 字段名 数据类型;
alter table 表名 add column 字段名1 数据类型, add column 字段名2 数据类型;
-- 其中关键字column可省略。

Oracle:

alter table 表名 add 字段 数据类型;
alter table 表名 add (字段 数据类型);
alter table 表名 add (字段1 数据类型, 字段2 数据类型); 
-- 只有添加单列的时候才可使用第一种方法,对于添加多列时需要使用第三种方法,建议使用中习惯加括号。

3.2 删除列(异)

MySQL:

alter table 表名 drop column 字段名;
alter table 表名 drop column 字段名1, drop column 字段名2;
-- 其中关键字column可省略。

Oracle:

alter table 表名 drop column 字段;
alter table 表名 drop (字段);
alter table 表名 drop (字段1,字段2);
-- 只有删除单列的时候才可使用第一种方法,对于删除多列时需要使用第三种方法,建议使用第二、三种方法。

3.3修改列名及字段类型(异)

MySQL:

-- 修改字段名
alter table 表名 change column 旧字段名 新字段名 字段类型; -- 必须含有字段类型
-- 修改字段类型
alter table 表名 modify column 字段名 类型;

Oracle:

-- 修改字段名
alter table 表名 rename column 旧字段名 to 新字段名;-- 不能有字段类型
-- 修改字段类型
alter table 表名 modify(字段 数据类型 约束条件);
  • MySQL中,无论列是否有数据都可以修改列类型。
  • Oracle中,在列有数据的时候,无法修改列类型;没有数据时可以。

但是当有数据时,直接修改列类型都可能对数据造成丢失等,所以一般需要结合具体的业务来对列数据做处理后,再修改列类型类型。所以修改列的类型并非使用SQL语句进行一步到位的修改,而是通过以下流程:

1.添加辅助列
2.将需要更改的列的值经过类型转换的验证后,赋值给辅助列
3.删除原有列
4.将辅助列的列名修改为原有列列名

4、索引

在整个数据库内,MySQL的索引可以同名,也就是说MySQL的索引是表级别的;但是Oracle索引不可以同名,也就是说Oracle的索引是数据库级别的。

4.1 创建索引(同)

create index indexName on tableName (columnName);

4.2 删除索引(异)

MySQL:

alter table tableName drop index indexName

Oracle:

drop index indexName

4.3 查询表的索引(异)

MySQL:

show index from tableName

Oracle:

select index_name, table_name, column_name from user_ind_columns where table_name=' tableName ' 

5、空字符串问题

Oracle中空字符串 ’ ’ 就是null(也就是说,只有null,没有空字符),而MySQL是区分null和 ’ ’ 的。

对于使用语句:select * from table1 where user_name <> ''来查询列user_name不为空(不为null且不为空字符)时,Oracle会查不出任何结果,而MySQL可以正常运行。这里MySQL之所以可以得到正确结果,还因为比较符号<>会先将列为null的内容进行过滤,然后再比较内容是否为空字符串。

这就要求一方面,以后在编写代码的时候,尽量保证不会往数据库插入空字符串 ’ ’ 这样的值,要么保持有数据,要么保持为null。另外,对于MySQL中已经同时存在Null和 ’ ’ 时,所有判断是否为null或者 ’ ’ 的地方改为判断列的长度是否为0。

6、其它汇总

数据类型

ORACLEMYSQL注释
NUMBERint / DECIMALDECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型;
Varchar2(n)varchar(n)
DateDATATIME日期字段的处理:MYSQL日期字段分DATE和TIME两种,ORACLE日期字段只有DATE,包含年月日时分秒信息,用当前数据库的系统时间为 SYSDATE, 精确到秒,或者用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)年-月-日 24小时:分钟:秒的格式YYYY-MM-DD HH24:MI:SS TO_DATE()还有很多种日期格式, 可以参看ORACLE DOC.日期型字段转换成字符串函数TO_CHAR(‘2001-08-01’,’YYYY-MM-DD HH24:MI:SS’)。日期字段的数学运算公式有很大的不同。MYSQL找到离当前时间7天用DATE_FIELD_NAME > SUBDATE(NOW(),INTERVAL 7 DAY)ORACLE找到离当前时间7天用 DATE_FIELD_NAME >SYSDATE - 7;MYSQL中插入当前时间的几个函数是:NOW()函数以`'YYYY-MM-DD HH:MM:SS’返回当前的日期时间,可以直接存到DATETIME字段中。CURDATE()以’YYYY-MM-DD’的格式返回今天的日期,可以直接存到DATE字段中。CURTIME()以’HH:MM:SS’的格式返回当前的时间,可以直接存到TIME字段中。例:insert into tablename (fieldname) values (now()),而oracle中当前时间是sysdate
INTEGERint / INTEGERMysql中INTEGER等价于int
EXCEPTIONSQLEXCEPTION详见<<2009001-eService-O2MG.doc>>中2.5 Mysql异常处理
CONSTANTVARCHAR2(1)mysql中没有CONSTANT关键字 从ORACLE迁移到MYSQL,所有CONSTANT常量只能定义成变量
TYPE g_grp_cur IS REF CURSOR;光标 : mysql中有替代方案详见<<2009001-eService-O2MG.doc>>中2.2 光标处理
TYPE unpacklist_type IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;数组: mysql中借助临时表处理或者直接写逻辑到相应的代码中,直接对集合中每个值进行相应的处理详见<<2009001-eService-O2MG.doc>>中2.4 数组处理
自动增长的序列自动增长的数据类型MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。
NULLNULL空字符的处理:MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值