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%' -- 索引无效

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

你可能感兴趣的:(Oracle和Mysql)