Mysql跟Oracle语法差异

1 数据库

mysql可以创建数据库,而oracle没有这个操作,oracle只能创建实例;
sql数据库操作:database
格式:
* create database 数据库名;
* create database 数据库名 character set 字符集;

CREATE DATABASE j0815_1;
CREATE DATABASE j0815_2 CHARACTER SET utf8;

-查看数据库
SHOW DATABASES;

-查看定义的数据库
SHOW CREATE DATABASE j0815_1;

-删除数据库
DROP DATABASE j0815_1;

-切换数据库
USE j0815_1;
-查看正在使用的数据库:

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 ‘员工’,
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 ‘匿名’,–默认值,用单引号
mgr number(10),
hiredate date,–默认格式DD-MM-YY
sal number(10,2),
comm float,
deptno number(10)
);

2.2 删除表(异)
/*
MySQL:
DROP TABLE IF EXISTS 表名;
或drop table if exists 表名;

Oracle:

drop table 表名;

注:Oracle没有if exists关键字,也没用类似if exists的SQL语法。
*/

–MySQL:

DROP TABLE IF EXISTS emp;

drop table if exists emp;

–Oracle:

drop table emp

3 列

3.1 添加列(异)
/*
MySQL:

A. alter table 表名 add column 字段 数据类型;


B. alter table 表名 add column 字段1 数据类型, add column 字段2 数据类型;


注:其中关键字column可有可无。

Oracle:

A. alter table 表名 add 字段 数据类型;


B. alter table 表名 add (字段 数据类型);


C. alter table 表名 add (字段1 数据类型, 字段2 数据类型); 


注:对于A,只有添加单列的时候才可使用,对于添加多列时需要使用C,不能像MySQL那样重复使用add column关键字。

*/
–MySQL:
ALTER TABLE emp ADD COLUMN marriage VARCHAR(2);
ALTER TABLE emp ADD marriagedate DATE;
ALTER TABLE emp ADD COLUMN lovename VARCHAR(50), ADD COLUMN loveage INT;

–Oracle:
alter table emp add marriage varchar2(2);
alter table emp add (marriagedate DATE);
alter table emp add (lovename varchar2(50),loveage INT);

desc emp;

3.2 删除列(异)
/*
MySQL:

A. alter table 表名 drop column 字段;


B. alter table 表名 drop column 字段, drop column 字段;


注:其中关键字column可有可无。

Oracle:

A. alter table 表名 drop column 字段;


B. alter table 表名 drop (字段);


C. alter table 表名 drop (字段1,字段2);


注:对于A,只有删除单列的时候才可使用,对于删除多列时需要使用C,不能像MySQL那样重复使用drop column关键字。

*/
–MySQL:
ALTER TABLE emp DROP COLUMN marriage;
ALTER TABLE emp DROP COLUMN marriagedate, DROP COLUMN lovename,DROP COLUMN loveage;

–Oracle:
alter table emp drop column marriage;
alter table emp drop (marriagedate);
alter table emp drop (lovename,loveage);

3.3 修改列名(异)
/*
MySQL:

alter table 表名 change column 原来字段 新的字段 字段类型(必须);

Oracle:

alter table 表名 rename column 原来字段 to 新的字段;  注:不能有字段类型     

修改字段类型:alter table 表名 modify(字段 数据类型 约束条件);

*/

–MySQL:
ALTER TABLE emp CHANGE COLUMN mgr manager VARCHAR(20);

–Oracle:
alter table emp rename column mgr to manager;

3.4 修改列类型(说明)
/*
Oracle中,在列有数据的时候,无法修改列类型;没有数据时可以。
alter table 表名 modify(字段 数据类型 约束条件);

MySQL中,无论列是否有数据都可以修改列类型。
alter table 表名 modify column 字段名 类型;

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

A. 添加临时列


B. 将需要更改的列的值经过类型转换的验证后,赋值给临时列


C. 删除原有列


D. 将临时列的列名修改为原有列列名

*/

–MySQL:
ALTER TABLE emp MODIFY COLUMN manager VARCHAR(20);

–Oracle:
alter table emp modify(manager varchar2(20));

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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值