MySQL和Oracle的区别
语言的分类:
MySQL中语言的分类:数据定义语言(DDL):drop,create,alter等语句
数据操作语言(DML):insert,update,delete
数据查询语言(DQL):select等语句
数据控制语言(DCL):grant,revoke,commit,rollback等语句
Oracl中的语言的分类:数据定义语言(DDL):drop,create,alter等语句
数据操作语言(DML):insert,delete,update,select ... for update等语句
数据查询语言(DQL):基本查询语句,及order by子句,grop by 子句
数据控制语言(DCL):grant,revoke
事务控制语言(TCL):commit,savepoint,rollback
登陆不同:
MySQL是以库的形式,每次操作是创建数据库:create datebase 数据库名
Oracle是以用户的形式,每次操作是创建用户:create user 用户名
并且Oracle中用select * from dba_user来查询所有用户
而MySQL中用show database 来显示所有的数据库信息
创建数据库
在MySQL:create table 表名(
列名 数据类型 [列级别约束 ] [默认值],
...
列名 数据类型[列级别的约束][默认值],
[表级别的约束 ]);
注意:像主键或者外键的设置等都是属于表级别的约束
像列的值不能大于到少这就属于是列级别的约束,表级别约束可以写在这,执行也不会出错,但有些设置不成功,类似外键的设置
例子:create table cource(sno int reference student(sno) )--这种是设置不成功的
应该这样设置:在所有列定义完之后使用,constraint 约束名 foreign key 字段名 reference 表名(字段名)
但主键是可以设置成功的。
在Oracle中:create table 表名(
列名 数据类型,
...
列名 数据类型);--oracle中是不区分标记属性和列级属性的
自动增长
在MySQL中使用auto_increment自动增长序列默认从1开始,步长为1使用auto_increment=10可以改变自动增长的初始值
在orcle中使用创建序列的方式来实现
修改字段
在两者均使用中modify来修该字段的属性:alter table 表名 modify 字段名 数据类型
在MySQL中修改字段名是:alter table 表名 change 旧字段名 新字段名 新数据类型
在orcle中修改字段是:alter table 表名 rename column 旧字段名 to 新字段名
添加字段
在MySQL中添加字段是:alter table 表名 add 新字段名 数据类型
[约束条件] [first|after 已存在的字段]
--其中first或者after 已存在的字段是表示可以再指定的位置添加字段
同时在MySQL中还可以通过 alter table 表名 modify 字段1 数据类型 first|after 字段2
在oracle中添加字段是:alter table 表名 add 新字段 数据类型 [约束条件]
删除字段
在MySQL中删除字段是:alter table 表名 Drop 字段名
在orcle中删除字段是:alter table 表名 drop column 字段名
删除表的外键约束
在MySQL中:alter table 表名 drop foreign key 外键约束名
在orcle中:alter table 表名 drop constraint 外键约束名
注意:如果没有没有给外键约束命名那就通过查找系统的user_constraints表找到系统给其的默认外键约束名然后删除
删除表
在MySQL中:drop table [if exists] 表名 --若是没有关联的一些表,表名可以一次性写上中间用','隔开
在Oracle中:drop table 表名
数据类型
整数类型:
在MySQL中:
类型名称 | 说明 | 存储要求 |
tinyint | 很小的整数 | 1个字节 |
smalint | 小整数 | 2个字节 |
mediuint | 中等大小的整数 | 3个字节 |
int | 普通大小的整数 | 4个字节 |
bigint | 大整数 | 8个字节 |
在orcle中只有整数类型
字符串类型:
在MySQL中:
类型名称 | 说明 | 存储要求 |
char(m) | 固定长度二进制 | m个字节 |
varchar(m) | 变长的二进制 | L+1个字节在此L<=M |
tinytext | 非常小的二进制 | L+1个字节在此L<2^8 |
text | 小的二进制字符串 | L+2个字节在此L<2^16 |
mediutext | 中等的二进制字符串 |
L+3个字节在此L<2^24 |
longtext | 大的二进制 | L+4个字节在此L<2^32 |
enum | 枚举类型只能有一个枚举字符串 | 1或者2个字节取决于枚举的数目 |
set | 一个设置,字符串对象可以有多个或者零个set成员 | 1,2,3,4或者8个字节,取决于集合成员的数量 |
在orcle中有:char varchr2 nchar nvarchar2
运算符
算术运算符:
在MySQL中有:= - * / % 其中在oracle中是没有%求余的,在orcle中求余用的是mod()函数
注意在MySQL中可以直接使用=或者:=复制而在oracle中只能使用:=来赋值
比较运算符:
在MySQL中有:> < >= <= != <> <=> in between.. and is null is not null greatest least like regexp
在orcle中是没有<=>安全等于运算符,安全等于运算符是用来判断null值的,当两个操作数均为null是返回是1,当只有一个是null是返回值为0而不为null
逻辑运算符:
在MySQL中有:not(!) and(&&) or(||) xor
在orcle中and是不可以用&&来代替的,or是不可以用||来代替因为在orcle中||表示字符串拼接符,另外在orcle中没有xor逻辑异或的
位操作运算符
在MySQL中有:位与(&) 位或(|) 位非(~) 位异或(^) 左移(<<) 右移(>>) 六种
补充:在MySQL中的比较运算符中regexp的使用:
regexp在使用时常用一下几种通配符:'^'表示以该字符后面字符开头的的字符串例如:select * from student where sname regexp '^刘'
'$'表示以该字符后面字符结尾的字符串例如:select * from student where sanme regexp '$刘'
'.'匹配任一一个单字符select * from student where sname regexp '刘.玲'--匹配名字中包含刘和玲
且中间只有一个字符的记录
'[...]'匹配方框内的任何字符例如[abc] [0-9] [a-z]
'*'匹配零个或者多个在它前面的字符而'.*'匹配任何数量的任何字符
'[^字符集合]'匹配不在指定字符结合的
在MySQL中正则的使用:
select * from student where name regexp '[a]+' --匹配出现字母a多次
'[:digit:]{2}' --匹配两个数字连在一起
'[:alpha:]{3}' --匹配3个字母连在一起
'[:space:]{3}' --匹配3个空格
'[:lower:]{3}' --匹配3个小写字母与一起
'[:alnum:]{3}' --匹配3个字母一起
表中数据的查询
(1)在MySQL中:使用group by 进行分组之后可以再后面再加上with rollup用来统计数量
例如:select scode,count(*) from student group by scode with rollup;返回结果如下:
但是在orcle中是不可以用with rollup的
(2)分页查询:
在MySQL中可以使用:select * from student limit 2,3; --表示从第三行开始长度为三即2表示过2,3表示长度
注意:同时使用limit和order by 时limit必须为于后面
在orcle中使用rownum才可以实现分页查询:select * from(
select rownum m,empno,ename job from emp
where rownum<7
)where m>3;
向表中插入数据
在MySQL中:与orcle最大的不同是MySQL中可以一下插入多行数据,insert into 表名 values(值1),(值2)...(值n);
其它两种方法和orcle中一样。(通过查询出已知表的数据插入和通过创建一个表后从已知表中插入)
删除表中的数据
在MySQL中:delete from 表名 [where 条件]
在orcle中删除可以有from也可以没有from
存储过程的创建及使用:
在MySQL中:
创建存储过程为:
delimiter // --注意delimiter和//之间有空格,这句话的作用将MySQL的结束符设置成'//',为了避免与默认的sal语句结束符';'相冲突,
create procedure 存储过程名字([参数 参数的数据类型])--注意不要忘了'()',参数列表可以没有参数类型有三种in|out|inout
declare 变量名 变量的数据类型 [默认值] --用来定义变量
begin
sql代码块;
end //--之间有空格,这是存储过程的结束
delimiter; --恢复MySQL中默认的结束符';',当然delimiter也可以指定其他符号做结束符
注意:在MySQL中变量的使用是:set 变量名=相应的变量的值; --这种方法在orcle中是不可以使用的
或者通过select...into 的方法赋值
例子:delimiter //
create procedure my()
begin
select * from students;
end //
delimter;
存储过程的调用:
在MySQL中:call 存储过程名([参数列表])
在orcle中:exec 存储过程名([参数列表])
或者是:begin
存储过程名();
end;
流程控制
在MySQL中:
(1)if语句: if 条件 then 条件为真时要处理的事务
[elseif 条件 then 条件为真时要处理的事务] --注意在orcle中此处为:[elsif 条件 then 条件为真时要处理的事务]
[else 要处理的事务]
end if;
(2)loop语句:[loop_lable:]loop
要执行的sql代码
end loop[loop_lable];
例子:delclare id int default 0;
add_loop:loop --此处orcle中是:loop
set id=id+1;
if id>=10 then leave add_loop; --此处orcle中没有leave,leave在此处的做用是退出循环
end if;
end loop add_loop; --此处orcle中为end loop;
leave语句:leave lable;用来退出任何被标注的流程控制构造
leave和循环或者begin end一起使用
iterate语句:iterate lable;用来将执行顺序转到语句段开头处即在此循环
iterate只可以出现在loop,repeat,while语句内
(3)repeat语句:[repeat_lable]repeat
sql语句
until 条件
end repeat;
在orcle中没有repeat带条件的循环。
例子:declare id int default 0;
repeat
set id=id+1;
until id>10;
end repeat;