Oracle和Mysql
開源性
Oracle是閉源且收費(fèi)
MySQL開源免費(fèi)
事務(wù)性
事務(wù):一組DML語句組成的工作單元
Mysql最早是不支持事務(wù)的甚负,采取InnoDB引擎后支持事務(wù)
Mysql中事務(wù)默認(rèn)是自動(dòng)提交的(一條一提)
set auto_commit=false 關(guān)閉自動(dòng)提交
Oracle支持事務(wù)
SQL靈活性
Mysql是比較靈活侨歉,Oracle比較嚴(yán)格(分組校驗(yàn)性拍埠,沒有主鍵自增,Mysql沒有檢查性約束)
-- mysql 可以這么寫毁兆,但是結(jié)果有問題
select deptno,ename,max(sal)
from emp
where deptno is not null
group by deptno
-- oracle 不能這么寫想许,oracle要求,group by 中必須包含 select 中的所有非函數(shù)字段
select deptno,ename,max(sal)
from emp
where deptno is not null
group by deptno
約束
Mysql支持主鍵沃呢,唯一鍵年栓,非空,外鍵
-- mysql 中枚舉類型可以達(dá)到類似效果
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 ('男','女'))
)
線程上的不同
主要體現(xiàn)在Linux系統(tǒng)上
Mysql是單進(jìn)程多線程的否副,單個(gè)Mysql服務(wù),可以同時(shí)登錄一個(gè)用戶
Oracle是多進(jìn)程的崎坊,單個(gè)Oracle服務(wù)备禀,可以通過切換不同用戶操作數(shù)據(jù)庫(kù),但是不能同時(shí)登錄某一個(gè)用戶訪問
數(shù)據(jù)庫(kù)實(shí)例上的不同
Mysql用戶是基于實(shí)例的奈揍,當(dāng)實(shí)例創(chuàng)建完畢曲尸,用戶就已經(jīng)分配好了
Oracle必須先建庫(kù),庫(kù)分配對(duì)象男翰,對(duì)象訪問到的對(duì)象都是自己的另患,不能跨權(quán)
SQL方言
主鍵
mysql有主鍵自增
oracle沒有主鍵自增,oracle的主鍵是依賴 序列 完成的
-- 主鍵沒有自增蛾绎,使用序列完成
create table test1(
id number(9),
name varchar2(50),
primary key(id)
)
-- 創(chuàng)建序列 : 生成主鍵昆箕,命名規(guī)范
create sequence test1_id -- 默認(rèn)是從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寫法肺稀,同時(shí)還有自己的寫法 (+)
-- 沒有員工的部門也顯示
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
分頁(yè)
mysql中分頁(yè)采取 limit 關(guān)鍵字
select *
from emp
limit 0,10 -- 第一個(gè)參數(shù)0是查詢起始索引,第二個(gè)參數(shù)10是長(zhǎng)度
oracle中采取 ROWNUM 偽列實(shí)現(xiàn)
-- 簡(jiǎn)單使用
select rownum,empno,ename,sal
from emp
where rownum <= 5
-- 注意:它不能在 "本層" 查詢中使用 大于话原,大于等于或between..and 查詢夕吻,原因是rownum永遠(yuǎn)從1開始诲锹,所以需要嵌套,將查詢結(jié)果當(dāng)成普通數(shù)據(jù)涉馅,就可以了
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
-- 有排序归园,又有分頁(yè)
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優(yōu)化方案之一
-- 簡(jiǎn)單索引
CREATE TABLE indexTest1(
`id` int(9),
`name` varchar(50),
index(`name`)
)
出現(xiàn)在where條件中稚矿,查詢時(shí)加快查詢速度
select *
from emp
where ename like 'S%' -- 索引有效
select *
from emp
where ename like '%S%' -- 索引無效
主鍵唯一鍵自帶索引庸诱,不需要特意加索引