Oracle數(shù)據(jù)庫的安裝

我安裝的Oracle數(shù)據(jù)庫版本為Oracle Database 12c Release 2

具體安裝教程可以參考 百度經(jīng)驗

操作系統(tǒng)為安裝在虛擬機里面的Windows Server 2019 DataCenter

客戶端我是用的是PLSQL Developer 13。官網(wǎng) 激活碼

Oracle體系結(jié)構(gòu)

數(shù)據(jù)庫

Oracle 數(shù)據(jù)庫是數(shù)據(jù)的物理存儲。其實 Oracle 數(shù)據(jù)庫的概念和其它數(shù)據(jù)庫不一樣,這里的數(shù)據(jù)庫是一個操作系統(tǒng) 只有一個庫??梢钥醋魇?Oracle 就只有一個大數(shù)據(jù)庫。

實例

一個 Oracle 實例(Oracle Instance)有一系列的后臺進程(Backguound Processes)和內(nèi)存結(jié)構(gòu) (Memory Structures)組成。一個數(shù)據(jù)庫可以有 n 個實例。

12c 版本已經(jīng)能一個實例有多個數(shù)據(jù)庫了。

用戶

用戶是在實例下建立的。不同實例可以建相同名字的用戶。

在Oracle數(shù)據(jù)庫中用戶是管理表的基本單位,對應MySQL中,某某庫擁有幾張表,而在Oracle中為:某某用戶有幾張表。

表空間

表空間是 Oracle 對物理數(shù)據(jù)庫上相關(guān)數(shù)據(jù)文件(ORA 或者 DBF 文件)的邏輯映射。一個數(shù) 據(jù)庫在邏輯上被劃分成一到若干個表空間,每個表空間包含了在邏輯上相關(guān)聯(lián)的一組結(jié)構(gòu)。每 個數(shù)據(jù)庫至少有一個表空間(稱之為 system 表空間)。

每個表空間由同一磁盤上的一個或多個文件組成,這些文件叫數(shù)據(jù)文件(datafile)。一個數(shù)據(jù)文件 只能屬于一個表空間。

數(shù)據(jù)文件(dbf、ora)

數(shù)據(jù)文件是數(shù)據(jù)庫的物理存儲單位。數(shù)據(jù)庫的數(shù)據(jù)是存儲在表空間中的,真正是在某一個 或者多個數(shù)據(jù)文件中。而一個表空間可以由一個或多個數(shù)據(jù)文件組成,一個數(shù)據(jù)文件只能屬于 一個表空間。一旦數(shù)據(jù)文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數(shù) 據(jù)文件,只能刪除其所屬于的表空間才行。

Oracle的一些特殊機制

最開始的學習的時候,這些細節(jié)就讓我很頭疼

  1. Oracle中,字段名,表名,用戶名等 默認都是大寫的。
  2. 比如:我用Navicat創(chuàng)建了個用戶 sky03 ,登錄的時候用 sky03,提示用戶名/密碼無效,其實Navicat在創(chuàng)建表或用戶的時候,會自動加上雙引號"sky03"(強制使用原大小寫),真正的用戶名為sky03。而Oracle會自動把不加雙引號的 表或用戶名 轉(zhuǎn)大寫,也就是說我登錄的時候的用戶名為SKY03,所以登錄的時候加上雙引號就行了"sky03"。所以為了以后使用方便,以后都用大寫。
  3. 與MySQL不同的是,Oracle的事務是手動提交的,所以增刪改查后都要手動提交事務(commit),不然都是臟數(shù)據(jù)!
  4. Oracle數(shù)據(jù)庫開啟,并且存在會話的時候,不要直接關(guān)機,應該先把會話關(guān)掉,再關(guān)掉數(shù)據(jù)庫(也可以不關(guān)數(shù)據(jù)庫),再關(guān)機。不然的話,下次啟動登錄會報錯:Oracle ORA-01033: ORACLE initialization or shutdown in progress 。

創(chuàng)建表空間

表空間:ORACLE 數(shù)據(jù)庫的邏輯單元。 數(shù)據(jù)庫---表空間 一個表空間可以與多個數(shù)據(jù) 文件(物理結(jié)構(gòu))關(guān)聯(lián)

一個數(shù)據(jù)庫下可以建立多個表空間,一個表空間可以建立多個用戶、一個用戶下可以建立 多個表。

創(chuàng)建表空間的語句:

create tablespace "sky03" datafile 'c:\; size 100m autoextend on next 10m;

sky03:為表空間名稱

datafile:指定表空間對應的數(shù)據(jù)文件

size:后定義的是表空間的初始大小

autoextend on:自動增長 ,當表空間存儲都占滿時,自動增長

next:后指定的是一次自動增長的大小。

最后會在安裝Oracle數(shù)據(jù)庫的電腦上創(chuàng)建c:\此文件

刪除表空間的語句為:

drop tablespace "sky03"

創(chuàng)建用戶

創(chuàng)建用戶

創(chuàng)建用戶語句:

CREATE USER "SKY03" IDENTIFIED BY "admin" DEFAULT TABLESPACE "sky03"

CREATE USER:創(chuàng)建用戶,后面是用戶名

IDENTIFIED BY:后邊是用戶的密碼

DEFAULT TABLESPACE:后邊是表空間名稱

Oracle 數(shù)據(jù)庫與其它數(shù)據(jù)庫產(chǎn)品的區(qū)別在于,表和其它的數(shù)據(jù)庫對象都是存儲在用戶 下的。

這里有個東西要注意,就是如果創(chuàng)建的用戶名里有小寫字母,登錄時就要在用戶名上加雙引號,Oracle會自動將不帶雙引號的用戶名轉(zhuǎn)大寫,例如:

創(chuàng)建的用戶名為sky03,登錄時填寫用戶名就必須為"sky03",不然就會提示用戶名/口令無效,如果用戶名為SKY03,登錄時就可以直接填寫SKY03或者sky03,密碼是區(qū)分大小寫的!

密碼為特殊字符時,創(chuàng)建用戶時密碼需要加雙引號,登陸時也需要把密碼用雙引號括起來。

給用戶分配角色

新創(chuàng)建的用戶沒有角色身份,登陸后會提示

Oracle 中已存在三個重要的角色:connect 角色,resource 角色,DBA 角色。

  • CONNECT 角色: --是授予最終用戶的典型權(quán)利,最基本的
  • ALTER SESSION --修改會話
  • CREATE CLUSTER --建立聚簇
  • CREATE DATABASE LINK --建立數(shù)據(jù)庫鏈接
  • CREATE SEQUENCE --建立序列
  • CREATE SESSION --建立會話
  • CREATE SYNONYM --建立同義詞
  • CREATE VIEW --建立視圖
  • RESOURCE 角色: --是授予開發(fā)人員的
  • CREATE CLUSTER --建立聚簇
  • CREATE PROCEDURE --建立過程
  • CREATE SEQUENCE --建立序列
  • CREATE TABLE --建表
  • CREATE TRIGGER --建立觸發(fā)器
  • CREATE TYPE --建立類型
  • DBA 角色: 擁有全部特權(quán),是系統(tǒng)最高權(quán)限,只有 DBA 才可以創(chuàng)建數(shù)據(jù)庫結(jié)構(gòu),并且系統(tǒng) 權(quán)限也需要 DBA 授出,且 DBA 用戶可以操作全體用戶的任意基表,包括刪除

授權(quán)語句:

GRANT "DBA" TO "SKY03"

之后就可以用該用戶名登錄了!

Oracle數(shù)據(jù)類型

?

No數(shù)據(jù)類型描述1Varchar, Varchar2表示一個字符串2NUMBERNUMBER(n)表示一個整數(shù),長度是 nNUMBER(m,n):表示一個小數(shù),總長度是 m,小 數(shù)是 n,整數(shù)是 m-n3DATA表示日期類型4CLOB大對象,表示大文本數(shù)據(jù)類型,可存 4G5BLOB大對象,表示二進制數(shù)據(jù),可存 4G

?

  • Varchar2:常用,它會自動截取掉多余的字符長度

表的管理

SQL的注釋

SQL的單行注釋為 --

多行注釋為 /* ... */

建表

語法:

Create table "用戶名"."表名"(

字段 1 數(shù)據(jù)類型 [default 默認值],

字段 2 數(shù)據(jù)類型 [default 默認值],

... 字段 n 數(shù)據(jù)類型 [default 默認值]

);

注意:"用戶名"."表名",如果所使用的"用戶名"已經(jīng)是當前已經(jīng)登錄的用戶,則可以省略不寫,即:"表名"

范例:創(chuàng)建 person 表

CREATE TABLE "SKY03"."person" ( "pid" NUMBER(10) NOT NULL , "name" VARCHAR2(10) , "gender" NUMBER(1) DEFAULT 1 , "birthday" DATE ); ? INSERT INTO "SKY03"."person"("pid", "name", "gender", "birthday") VALUES ('1', '張三', '1', TO_DATE('2019-04-21 15:42:24', 'SYYYY-MM-DD HH24:MI:SS'));

刪表

三個刪除

  • 刪除表中全部記錄
DELETE FROM "person";
  • 刪除表結(jié)構(gòu)
DROP TABLE "person";
  • 先刪除表,再次創(chuàng)建表。效果等同于 刪除表中全部記錄 。
  • 在數(shù)據(jù)量大的情況下,尤其在表中帶有索引的情況下,該操作效率高。
  • 索引可以提高查詢效率,但是會影響增刪改效率
TRUNCATE TABLE "person";

表結(jié)構(gòu)的增刪改(字段)

在 sql 中使用 alter 可以修改表

  • 添加字段:ALTER TABLE 表名稱 ADD (字段 1 類型 [DEFAULT 默認值],字段 2 類型 [DEFAULT 默認值]...)
  • 修改字段:ALTER TABLE 表名稱 MODIFY (字段 1 類型 [DEFAULT 默認值],字段 2 類型 [DEFAULT 默認值]...)
  • 修改字段名:ALTER TABLE 表名稱 RENAME COLUMN 字段1 TO 字段 2
  • 刪除字段:ALTER TABLE 表名稱 DROP COLUMN 字段

添加字段:

ALTER TABLE "SKY03"."person" ADD ("address" varchar2(10) );

修改字段屬性:

ALTER TABLE "SKY03"."person" MODIFY ("birthday" VARCHAR2(7) );

修改字段名:

ALTER TABLE "SKY03"."person" RENAME COLUMN "pid" TO "id" ;

刪除字段:

ALTER TABLE "SKY03"."person" DROP COLUMN "pid" ;

表數(shù)據(jù)的增刪改(記錄)

INSERT(增)

標準寫法:

INSERT INTO 表名[(列名 1,列名 2,...)]VALUES(值 1,值 2,...)

簡單寫法(不建議):

INSERT INTO 表名 VALUES(值 1,值 2,...)

注意:使用簡單的寫法必須按照表中的字段的順序來插入值,而且如果有為空的字段使用 null

另外,Oracle默認是手動提交事務的,所以此時插入的數(shù)據(jù)為臟數(shù)據(jù),點下rollback,數(shù)據(jù)就沒了,所以以后增刪改都要提交事務。

MySQL中默認是自動提交事務,所以不用手動提交。

java中connection對象是默認自動提交事務的。

提交:commit

回滾:rollback

INSERT INTO "SKY03"."person"("pid", "name", "gender", "birthday") VALUES ('1', '張三', '1', TO_DATE('2019-04-21 15:42:24', 'SYYYY-MM-DD HH24:MI:SS')); COMMIT;

DELETE(刪)

語法 :

DELETE FROM 表名 WHERE 刪除條件;

在刪除語句中如果不指定刪除條件的話就會刪除所有的數(shù)據(jù)

UPDATE(改)

全部修改:UPDATE 表名 SET 字段 1=值 1,字段 2=值 2,....

局部修改:UPDATE 表名 SET 字段 1=值 1,字段 2=值 2,....WHERE 修改條件;

序列 (SEQUENCE)

在MySQL中主鍵一般都是自增、唯一、非空的屬性,在Oracle中也一樣。MySQL用auto_increment完成以上需求,Oracle用的就是序列(SEQUENCE)。

序列是不屬于任何一張表,但是可以和表做綁定。

  1. 創(chuàng)建序列
  • 語法:
  • CREATE SEQUENCE 序列名 [相關(guān)參數(shù)]
-- s代表序列,person代表是person表的序列 CREATE SEQUENCE s_person;
  • 參數(shù):(一般不用,了解)
  • INCREMENT BY :序列變化的步進,負值表示遞減。(默認1)
  • START WITH:序列的初始值 。(默認1)
  • MAXVALUE:序列可生成的最大值。(默認不限制最大值,NOMAXVALUE)
  • MINVALUE:序列可生成的最小值。(默認不限制最小值,NOMINVALUE)
  • CYCLE:用于定義當序列產(chǎn)生的值達到限制值后是否循環(huán)(NOCYCLE:不循環(huán),CYCLE:循環(huán))。
  • CACHE:表示緩存序列的個數(shù),數(shù)據(jù)庫異常終止可能會導致序列中斷不連續(xù)的情況,默認值為20,如果不使用緩存可設置NOCACHE
  1. 修改或刪除序列
  • 使用 alter 命令進行修改
  • 使用 drop 命令刪除
  1. 序列的使用
  • currval 表示序列的當前值,剛建好的序列沒有當前值,必須先執(zhí)行一次nextval 才能獲取到值,否則會報錯!
  • nextval 表示序列的下一個值。新序列首次使用時獲取的是該序列的初始值,從第二次使用時開始按照設置的步進遞增。
  • 查詢序列的值:select s_person.[currval/nextval] from dual;
  • 其中dual為虛表,只是為了補全語法,沒有任何意義,因為Oracle中查詢語句必須帶有from關(guān)鍵詞,所以采用虛表。
  • SQL語句中使用:insert into table (id) values )

Scott用戶

簡單來說,Scott用戶是Oracle專門給新手練習用的賬戶,自帶的有一些表。但是12c版本的數(shù)據(jù)庫沒有Scott賬戶,但是有Scott賬戶的SQL文件,可以恢復。具體教程 點這里。

函數(shù)

數(shù)據(jù)庫的增刪改查,難的就是查,尤其是多表查詢,當涉及到復雜查詢,就必須使用函數(shù)。

Oracle中的函數(shù)分為 單行函數(shù) 和 多行函數(shù)

單行函數(shù)

作用于一行,返回一個值

  1. 字符函數(shù)
  • upper('yes') 字符小寫轉(zhuǎn)大寫
select upper('yes') from dual; -- 結(jié)果是 YES
  • lower('YES') 字符大寫轉(zhuǎn)小寫
select upper('YES') from dual; -- 結(jié)果是 yes
  1. 數(shù)值函數(shù)
  • round() 四舍五入
-- 第二個參數(shù):正數(shù),保留小數(shù)點后幾位;負數(shù),保留小數(shù)點前幾位;0或不寫,不保留小數(shù)。 select round) from dual; -- 26.2 select round) from dual; -- 30 select round) from dual; -- 0 select round) from dual; -- 100
  • trunc() 截取數(shù)字
-- 第二個參數(shù):正數(shù),保留小數(shù)點后幾位,其他舍去;負數(shù),保留小數(shù)點前幾位,其他舍去;0或不寫,舍去小數(shù)。 select trunc) from dual; -- 26.1 select trunc) from dual; -- 20 select trunc) from dual; -- 0
  • mod() 求余
-- 第一個參數(shù)對第二個參數(shù)求余 select mod) from dual; -- 0.16 select mod(10,3) from dual; -- 1
  1. 日期函數(shù)
  • sysdate 表示當前系統(tǒng)時間
--查詢出emp表中所有員工入職距離現(xiàn)在幾天。 最后的e是emp的別名 select from emp e; --算出明天此刻 select sysdate+1 from dual; --查詢出emp表中所有員工入職距離現(xiàn)在幾月。 select months_between(sysdate,e.hiredate) from emp e; --查詢出emp表中所有員工入職距離現(xiàn)在幾年。 select months_between(sysdate,e.hiredate)/12 from emp e; --查詢出emp表中所有員工入職距離現(xiàn)在幾周。 select round(()/7) from emp e;
  1. 轉(zhuǎn)換函數(shù)
  • to_char() 日期轉(zhuǎn)字符串
select to_char(sysdate, 'yyyy-mm-dd hh:mi:ss') from dual; -- 2019-04-22 11:49:43 select to_char(sysdate, 'fm yyyy-mm-dd hh:mi:ss') from dual; -- 2019-4-22 11:49:14 (月日不帶0) select to_char(sysdate, 'fm yyyy-mm-dd hh24:mi:ss') from dual; -- 2019-4-22 23:50:10 (24小時制)
  • to_date() 字符串轉(zhuǎn)日期
select to_date('2018-6-7 16:39:50', 'fm yyyy-mm-dd hh24:mi:ss') from dual; -- 2018/6/7 16:39:50 注意結(jié)果是日期類型的
  1. 通用函數(shù)
  • nvl(參數(shù)1,參數(shù)2) 如果參1為null值,就返回參2,如果參1不為null,則返回參1
--算出emp表中所有員工的年薪。 --獎金里面有null值,如果null值和任意數(shù)字做算術(shù)運算,結(jié)果都是null。 select e.sal*12+nvl, 0) from emp e;

通用函數(shù)

通用函數(shù),在MySQL和Oracle里通用!

  • when then 條件表達式
  • 用法一:

---給emp表中員工起中文名 ---等值判斷 select e.ename, case e.ename when 'SMITH' then '曹賊' when 'ALLEN' then '大耳賊' when 'WARD' then '諸葛小兒' else '無名' end from emp e; -- 結(jié)果:emp表的員工名前三個會自動改掉,其他的走else


  • 用法二:

---給emp表中員工起中文名 ---等值判斷 select e.ename, case e.ename when 'SMITH' then '曹賊' when 'ALLEN' then '大耳賊' when 'WARD' then '諸葛小兒' --else '無名' end from emp e; -- 結(jié)果:沒有指定名字的,全部變成null值 -- 一般可以用于批量將記錄的某字段變?yōu)閚ull值 -- 其實這里的when后相當于 e.ename='SMITH'


  • 用法三:

---判斷emp表中員工工資,如果高于3000顯示高收入,如果高于1500低于3000顯示中等收入, -----其余顯示低收入 -----范圍判斷 select e.sal, case when e.sal>3000 then '高收入' when e.sal>1500 then '中等收入' else '低收入' end from emp e;


  • decode() Oracle專用表達式,作用和 when then 一樣
----oracle專用條件表達式 ----oracle中除了起別名,都用單引號。 select e.ename, decode, 'SMITH', '曹賊', 'ALLEN', '大耳賊', 'WARD', '諸葛小兒', '無名') "中文名" --雙引號可以去掉,但是不能用單引號 from emp e;


  • 我們開發(fā)人員講究代碼可重用,最好使用通用函數(shù),MySQL和Oracle都能用!

多行函數(shù)(聚合函數(shù))

作用于多行,返回一個值

  1. count() 統(tǒng)計記錄數(shù)
select count(1) from emp;---查詢總數(shù)量 -- 有時候?qū)懙氖莄ount(*),其實底層走的還是count(1) -- count(1)的意思是count(第一個字段)
  1. sum() 求和函數(shù)
select sum(sal) from emp;---工資總和
  1. max() 最大值
select max(sal) from emp;---最大工資
  1. min() 最小值
select min(sal) from emp;---最低工資
  1. avg() 平均值
select avg(sal) from emp;---平均工資

查詢

分組查詢

關(guān)鍵字 group by

語法:SELECT 分組字段 [聚合函數(shù)] FROM 表名 {GROUP BY 分組字段}

select e.sex, avg) --, e.ename from emp e group by e.sex; -- 整個語句意思是 以性別為組,統(tǒng)計男女的平均年齡
  • 分組查詢中,出現(xiàn)在group by后面的原始列,才能出現(xiàn)在select后面
  • 沒有出現(xiàn)在group by后面的列,想在select后面,必須加上聚合函數(shù)。

  • 不能使用別名當條件
  • 因為一般條件的執(zhí)行順序高于查詢
  • 例如: where的執(zhí)行優(yōu)先級高于select,所以s是無效的
select ename, sal s from emp where s>1500; --不能執(zhí)行
  • 正確:
select ename, sal s from emp where sal>1500;
  • where和having的區(qū)別
  • 查詢出平均工資高于2000的部門信息

select e.deptno, avg) from emp e group by e.deptno having avg)>2000;
  • 查詢出每個部門工資高于800的員工的平均工資

select e.deptno, avg) asal from emp e where e.sal>800 group by e.deptno;
  • where是過濾分組前的數(shù)據(jù),having是過濾分組后的數(shù)據(jù)。
  • 表現(xiàn)形式:where必須在group by之前,having是在group by之后。
  • 先查詢出每個部門工資高于800的員工的平均工資,然后再查詢出平均工資高于2000的部門:
select e.deptno, avg) asal from emp e where e.sal>800 group by e.deptno having avg)>2000;

多表查詢

多表查詢中的一些概念

  • 笛卡爾積
select * from emp e, dept d;
  • emp有14條記錄,dept有4條記錄,查詢出來的結(jié)果為14*4=56條記錄,其中大部分沒有意義
  • 等值連接
select * from emp e, dept d where e.deptno=d.deptno; -- 查詢出主鍵相等的信息 14條信息
  • 內(nèi)連接(老版的等值連接)
select * from emp e inner join dept d on e.deptno = d.deptno;
  • 外連接(左連接和右連接)
--查詢出所有部門,以及部門下的員工信息 select * from emp e right join dept d on e.deptno=d.deptno; ---查詢所有員工信息,以及員工所屬部門 select * from emp e left join dept d on e.deptno=d.deptno;
  • oracle中專用外連接
select * from emp e, dept d where e.deptno(+) = d.deptno;
  • 自連接:其實就是站在不同的角度把一張表看成多張表。
-- 查詢出員工姓名,員工領(lǐng)導姓名,員工和領(lǐng)導都在emp表 select e1.ename, e2.ename from emp e1, emp e2 where e1.mgr = e2.empno;

子查詢

在一個查詢的內(nèi)部還包括另一個查詢,則此查詢稱為子查詢。

Sql的任何位置都可以加入子查詢。

  • 單列子查詢,返回一列的一個內(nèi)容
---查詢出工資和SCOTT一樣的員工信息 select * from emp where sal in --如果確定是ename是惟一的,in可以換成= (select sal from emp where ename = 'SCOTT');
  • 單行子查詢,返回多個列,有可能是一個完整的記錄
---查詢出工資和10號部門任意員工一樣的員工信息 select * from emp where sal in (select sal from emp where deptno = 10);
  • 多行子查詢,返回多條記錄
---查詢出每個部門最低工資,和最低工資員工姓名,和該員工所在部門名稱 ---1,先查詢出每個部門最低工資 select deptno, min(sal) msal from emp group by deptno; ---2,三表聯(lián)查,得到最終結(jié)果。 select t.deptno, t.msal, e.ename, d.dname from (select deptno, min(sal) msal from emp group by deptno) t, emp e, dept d where t.deptno = e.deptno and t.msal = e.sal and e.deptno = d.deptno;

分頁查詢

---rownum行號:當我們做select操作的時候, --每查詢出一行記錄,就會在該行上加上一個行號, --行號從1開始,依次遞增,不能跳著走。 ----排序操作會影響rownum的順序 select rownum, e.* from emp e order by e.sal desc ----如果涉及到排序,但是還要使用rownum的話,我們可以再次嵌套查詢。 select rownum, t.* from( select rownum, e.* from emp e order by e.sal desc) t; ----emp表工資倒敘排列后,每頁五條記錄,查詢第二頁。 ----rownum行號不能寫上大于一個正數(shù)。 select * from( select rownum rn, tt.* from( select * from emp order by sal desc ) tt where rownum<11 ) where rn>5

視圖

視圖的概念:視圖就是封裝了一條復雜查詢的語句,提供一個查詢的窗口,所有數(shù)據(jù)來自于原表。

  1. 創(chuàng)建視圖

創(chuàng)建視圖必須有DBA權(quán)限

  1. 語法1:CREATE VIEW 視圖名稱 AS 子查詢
create view v_emp as select ename, job from emp;
  1. 語法2:CREATE OR REPLACE VIEW 視圖名稱 AS 子查詢
  2. 如果視圖已經(jīng)存在我們可以使用語法2來創(chuàng)建視圖,這樣已有的視圖會被覆蓋。
  3. 查詢視圖
  4. 跟普通查詢沒什么區(qū)別:
select * from v_emp;
  1. 修改視圖
  2. 跟普通update沒什么區(qū)別,視圖修改的是原表的數(shù)據(jù),不推介修改視圖
update v_emp set job='CLERK' where ename='ALLEN'; commit;
  1. 創(chuàng)建只讀視圖
  2. 為了防止修改視圖還可以創(chuàng)建只讀視圖
create view v_emp1 as select ename, job from emp with read only;
  1. 視圖的作用
  2. 視圖可以屏蔽掉一些敏感字段。
  3. 保證總部和分部數(shù)據(jù)及時統(tǒng)一。

索引

  • 概念
  • 索引就是在表的列上構(gòu)建一個二叉樹。
  • 達到大幅度提高查詢效率的目的,但是索引 會影響增刪改的效率。
  • 索引分為 單列索引 和 復合索引
  • 單列索引
  • 創(chuàng)建單列索引
  • 語法:CREATE index 索引名 on 表名(列名)
create index idx_ename on emp(ename);
  • 單列索引觸發(fā)規(guī)則
  • 查詢條件必須是索引列中的原始值。
  • 單行函數(shù),模糊查詢,都會影響索引的觸發(fā)。
  • 復合索引
  • 創(chuàng)建復合索引
create index idx_enamejob on emp(ename, job);
  • 復合索引觸發(fā)規(guī)則
  • 復合索引中第一列為優(yōu)先檢索列。
  • 觸發(fā)復合索引,必須包含有優(yōu)先檢索列中的原始值。
  • 示例:
  • 假設以上單列索引和復合索引同時存在

select * from emp where ename='SCOTT' and job='xx'; ---觸發(fā)復合索引 select * from emp where ename='SCOTT'; ---觸發(fā)單列索引。 select * from emp where ename='SCOTT' or job='xx'; ---這個相當于兩條查詢語句,一個條件為or的前者,觸發(fā)單列索引;一個條件為or的后者,不觸發(fā)任何索引。 ---or到一起,就是不觸發(fā)索引

PL/SQL編程語言

  • pl/sql編程語言是對sql語言的擴展,使得sql語言具有過程化編程的特性。
  • pl/sql編程語言比一般的過程化編程語言,更加靈活高效。
  • pl/sql編程語言主要用來編寫存儲過程和存儲函數(shù)等。

基本語法

declare 說明部分 (變量說明,游標申明,例外說明 〕 begin 語句序列 (DML語句〕… exception 例外處理語句 End;

示例:

  • 賦值操作可以使用:=也可以使用into查詢語句賦值
declare i number(2) := 10; -- `:=`是賦值的意思,相當于Java里的 `=` s varchar2(10) := '小明'; ena emp.ename%type;---引用型變量 emprow emp%rowtype;---記錄型變量 begin dbm(i); --輸出變量 dbm(s); select ename into ena from emp where empno = 7788; dbm(ena); select * into emprow from emp where empno = 7788; dbm || '的工作為:' || em); -- 雙豎線`||`是連接字符串的符號 end;

if判斷語句

需求:

  1. 輸入小于18的數(shù)字,輸出未成年
  2. 輸入大于18小于40的數(shù)字,輸出中年人
  3. 輸入大于40的數(shù)字,輸出老年人

語法:

declare i number(3) := &i; -- &i表示鍵盤輸入,&后可以跟任何變量 begin if i<18 then dbm('未成年'); elsif i<40 then -- elsif相當于else if dbm('中年人'); else dbm('老年人'); end if; --if語句結(jié)束再加分號; end;

loop循環(huán)

需求: 用三種方式輸出1到10是個數(shù)字

  • while循環(huán)
declare i number(2) := 1; begin while i<11 loop i小于11,就一直循環(huán) dbm(i); i := i+1; end loop; end;
  • exit循環(huán)
declare i number(2) := 1; begin loop exit when i>10; -- 當i大于10的時候推出循環(huán) dbm(i); i := i+1; end loop; end;
  • for循環(huán)
declare begin for i in 1..10 loop -- 變量i 從1循環(huán)到10結(jié)束 dbm(i); end loop; end;

游標

游標可以存放多個對象,多行記錄。

需求:輸出emp表中所有員工的姓名

declare cursor c1 is select * from emp; emprow emp%rowtype; begin open c1; loop fetch c1 into emprow; exit when c1%notfound; dbm); end loop; close c1; end;

1.《oracle8.0.5如何使用》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關(guān),侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《oracle8.0.5如何使用》僅供讀者參考,本網(wǎng)站未對該內(nèi)容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉(zhuǎn)載時請保留本站內(nèi)容來源地址,http://f99ss.com/keji/3213194.html