目录
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、其它汇总
数据类型
ORACLE | MYSQL | 注释 |
---|---|---|
NUMBER | int / DECIMAL | DECIMAL就是NUMBER(10,2)这样的结构INT就是是NUMBER(10),表示整型; |
Varchar2(n) | varchar(n) | |
Date | DATATIME | 日期字段的处理: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 |
INTEGER | int / INTEGER | Mysql中INTEGER等价于int |
EXCEPTION | SQLEXCEPTION | 详见<<2009001-eService-O2MG.doc>>中2.5 Mysql异常处理 |
CONSTANT | VARCHAR2(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没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。 |
NULL | NULL | 空字符的处理:MYSQL的非空字段也有空的内容,ORACLE里定义了非空字段就不容许有空的内容。按MYSQL的NOT NULL来定义ORACLE表结构, 导数据的时候会产生错误。因此导数据时要对空字符进行判断,如果为NULL或空字符,需要把它改成一个空格的字符串。 |