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%' -- 索引无效
主键唯一键自带索引,不需要特意加索引