mysql和oracle 开源_Oracle和Mysql

Oracle和Mysql

开源性

Oracle是闭源且收费

MySQL开源免费

事务性

事务:一组DML语句组成的工作单元

Mysql最早是不支持事务的,采取InnoDB引擎后支持事务

Mysql中事务默认是自动提交的(一条一提)

set auto_commit=false 关闭自动提交

Oracle支持事务

SQL灵活性

Mysql是比较灵活,Oracle比较严格(分组校验性,没有主键自增,Mysql没有检查性约束)

-- mysql 可以这么写,但是结果有问题

select deptno,ename,max(sal)

from emp

where deptno is not null

group by deptno

-- oracle 不能这么写,oracle要求,group by 中必须包含 select 中的所有非函数字段

select deptno,ename,max(sal)

from emp

where deptno is not null

group by deptno

约束

Mysql支持主键,唯一键,非空,外键

-- mysql 中枚举类型可以达到类似效果

create table student2222(

id int(5),

name varchar(50),

gender enum('男','女'),

primary key(id)

)

Oracle支持主键,唯一键,非空,外键,检查性约束

-- oracle 中支持检查性约束

create table student1(

id number(5),

name varchar2(50),

gender varchar2(10),

primary key(id),

check (gender in ('男','女'))

)

线程上的不同

主要体现在Linux系统上

Mysql是单进程多线程的,单个Mysql服务,可以同时登录一个用户

Oracle是多进程的,单个Oracle服务,可以通过切换不同用户操作数据库,但是不能同时登录某一个用户访问

数据库实例上的不同

Mysql用户是基于实例的,当实例创建完毕,用户就已经分配好了

Oracle必须先建库,库分配对象,对象访问到的对象都是自己的,不能跨权

SQL方言

主键

mysql有主键自增

oracle没有主键自增,oracle的主键是依赖 序列 完成的

-- 主键没有自增,使用序列完成

create table test1(

id number(9),

name varchar2(50),

primary key(id)

)

-- 创建序列 : 生成主键,命名规范

create sequence test1_id -- 默认是从1开始,每次递增1

insert into test1 (id,name) values (test1_id.nextval,'bob')

-- 具体语法

create sequence test1_id2

[start with 50]

[increment by 2]

[maxvalue 999999]

[minvalue 1]

[cycle]

[cache 20]

外部连接(左连接,右连接,自连接,全外连接)

mysql 中左连接写法

-- 没有员工的部门也显示

select ename,sal,d.deptno,dname

from dept d

left join emp e

on e.deptno = d.deptno

-- 没有部门的员工也显示

select ename,sal,d.deptno,dname

from emp e

left join dept d

on e.deptno = d.deptno

oracle中也支持上面这种mysql写法,同时还有自己的写法 (+)

-- 没有员工的部门也显示

select ename,sal,d.deptno,dname

from dept d

left join emp e

on e.deptno = d.deptno

-- 没有部门的员工也显示

select ename,sal,d.deptno,dname

from emp e

left join dept d

on e.deptno = d.deptno

-- 没有员工的部门也显示

select ename,sal,d.deptno,dname

from dept d,emp e

where e.deptno(+) = d.deptno

-- 没有部门的员工也显示

select ename,sal,d.deptno,dname

from dept d,emp e

where e.deptno = d.deptno(+)

oracle中支持全外连接,Mysql中不支持

select ename,sal,d.deptno,dname

from dept d

full join emp e

on e.deptno = d.deptno

分页

mysql中分页采取 limit 关键字

select *

from emp

limit 0,10 -- 第一个参数0是查询起始索引,第二个参数10是长度

oracle中采取 ROWNUM 伪列实现

-- 简单使用

select rownum,empno,ename,sal

from emp

where rownum <= 5

-- 注意:它不能在 "本层" 查询中使用 大于,大于等于或between..and 查询,原因是rownum永远从1开始,所以需要嵌套,将查询结果当成普通数据,就可以了

select e.*

from (select rownum rn1,empno,ename,sal

from emp

where rownum < 11) e

where rn1 > 5

-- 有排序

select rownum,e.*

from (select empno,ename,sal

from emp

order by sal desc) e

where rownum < 6

-- 有排序,又有分页

select a.*

from (select rownum rn1,e.*

from (select empno,ename,sal

from emp

order by sal desc) e

where rownum < 11) a

where rn1 > 5

索引(index)

加快查询速度,SQL优化方案之一

-- 简单索引

CREATE TABLE indexTest1(

`id` int(9),

`name` varchar(50),

index(`name`)

)

出现在where条件中,查询时加快查询速度

select *

from emp

where ename like 'S%' -- 索引有效

select *

from emp

where ename like '%S%' -- 索引无效

主键唯一键自带索引,不需要特意加索引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值