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é)就讓我很頭疼
- Oracle中,字段名,表名,用戶名等 默認都是大寫的。
- 比如:我用Navicat創(chuàng)建了個用戶 sky03 ,登錄的時候用 sky03,提示用戶名/密碼無效,其實Navicat在創(chuàng)建表或用戶的時候,會自動加上雙引號"sky03"(強制使用原大小寫),真正的用戶名為sky03。而Oracle會自動把不加雙引號的 表或用戶名 轉(zhuǎn)大寫,也就是說我登錄的時候的用戶名為SKY03,所以登錄的時候加上雙引號就行了"sky03"。所以為了以后使用方便,以后都用大寫。
- 與MySQL不同的是,Oracle的事務是手動提交的,所以增刪改查后都要手動提交事務(commit),不然都是臟數(shù)據(jù)!
- 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'));刪表
三個刪除
- 刪除表中全部記錄
- 刪除表結(jié)構(gòu)
- 先刪除表,再次創(chuàng)建表。效果等同于 刪除表中全部記錄 。
- 在數(shù)據(jù)量大的情況下,尤其在表中帶有索引的情況下,該操作效率高。
- 索引可以提高查詢效率,但是會影響增刪改效率
表結(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)。
序列是不屬于任何一張表,但是可以和表做綁定。
- 創(chuàng)建序列
- 語法:
- CREATE SEQUENCE 序列名 [相關(guān)參數(shù)]
- 參數(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
- 修改或刪除序列
- 使用 alter 命令進行修改
- 使用 drop 命令刪除
- 序列的使用
- 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ù)
作用于一行,返回一個值
- 字符函數(shù)
- upper('yes') 字符小寫轉(zhuǎn)大寫
- lower('YES') 字符大寫轉(zhuǎn)小寫
- 數(shù)值函數(shù)
- round() 四舍五入
- trunc() 截取數(shù)字
- mod() 求余
- 日期函數(shù)
- sysdate 表示當前系統(tǒng)時間
- 轉(zhuǎn)換函數(shù)
- to_char() 日期轉(zhuǎn)字符串
- to_date() 字符串轉(zhuǎn)日期
- 通用函數(shù)
- nvl(參數(shù)1,參數(shù)2) 如果參1為null值,就返回參2,如果參1不為null,則返回參1
通用函數(shù)
通用函數(shù),在MySQL和Oracle里通用!
- when then 條件表達式
- 用法一:
- 用法二:
- 用法三:
- decode() Oracle專用表達式,作用和 when then 一樣
- 我們開發(fā)人員講究代碼可重用,最好使用通用函數(shù),MySQL和Oracle都能用!
多行函數(shù)(聚合函數(shù))
作用于多行,返回一個值
- count() 統(tǒng)計記錄數(shù)
- sum() 求和函數(shù)
- max() 最大值
- min() 最小值
- avg() 平均值
查詢
分組查詢
關(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是無效的
- 正確:
- where和having的區(qū)別
- 查詢出平均工資高于2000的部門信息
- 查詢出每個部門工資高于800的員工的平均工資
- where是過濾分組前的數(shù)據(jù),having是過濾分組后的數(shù)據(jù)。
- 表現(xiàn)形式:where必須在group by之前,having是在group by之后。
- 先查詢出每個部門工資高于800的員工的平均工資,然后再查詢出平均工資高于2000的部門:
多表查詢
多表查詢中的一些概念
- 笛卡爾積
- emp有14條記錄,dept有4條記錄,查詢出來的結(jié)果為14*4=56條記錄,其中大部分沒有意義
- 等值連接
- 內(nèi)連接(老版的等值連接)
- 外連接(左連接和右連接)
- oracle中專用外連接
- 自連接:其實就是站在不同的角度把一張表看成多張表。
子查詢
在一個查詢的內(nèi)部還包括另一個查詢,則此查詢稱為子查詢。
Sql的任何位置都可以加入子查詢。
- 單列子查詢,返回一列的一個內(nèi)容
- 單行子查詢,返回多個列,有可能是一個完整的記錄
- 多行子查詢,返回多條記錄
分頁查詢
---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ù)來自于原表。
- 創(chuàng)建視圖
創(chuàng)建視圖必須有DBA權(quán)限
- 語法1:CREATE VIEW 視圖名稱 AS 子查詢
- 語法2:CREATE OR REPLACE VIEW 視圖名稱 AS 子查詢
- 如果視圖已經(jīng)存在我們可以使用語法2來創(chuàng)建視圖,這樣已有的視圖會被覆蓋。
- 查詢視圖
- 跟普通查詢沒什么區(qū)別:
- 修改視圖
- 跟普通update沒什么區(qū)別,視圖修改的是原表的數(shù)據(jù),不推介修改視圖
- 創(chuàng)建只讀視圖
- 為了防止修改視圖還可以創(chuàng)建只讀視圖
- 視圖的作用
- 視圖可以屏蔽掉一些敏感字段。
- 保證總部和分部數(shù)據(jù)及時統(tǒng)一。
索引
- 概念
- 索引就是在表的列上構(gòu)建一個二叉樹。
- 達到大幅度提高查詢效率的目的,但是索引 會影響增刪改的效率。
- 索引分為 單列索引 和 復合索引
- 單列索引
- 創(chuàng)建單列索引
- 語法:CREATE index 索引名 on 表名(列名)
- 單列索引觸發(fā)規(guī)則
- 查詢條件必須是索引列中的原始值。
- 單行函數(shù),模糊查詢,都會影響索引的觸發(fā)。
- 復合索引
- 創(chuàng)建復合索引
- 復合索引觸發(fā)規(guī)則
- 復合索引中第一列為優(yōu)先檢索列。
- 觸發(fā)復合索引,必須包含有優(yōu)先檢索列中的原始值。
- 示例:
- 假設以上單列索引和復合索引同時存在
PL/SQL編程語言
- pl/sql編程語言是對sql語言的擴展,使得sql語言具有過程化編程的特性。
- pl/sql編程語言比一般的過程化編程語言,更加靈活高效。
- pl/sql編程語言主要用來編寫存儲過程和存儲函數(shù)等。
基本語法
declare 說明部分 (變量說明,游標申明,例外說明 〕 begin 語句序列 (DML語句〕… exception 例外處理語句 End;示例:
- 賦值操作可以使用:=也可以使用into查詢語句賦值
if判斷語句
需求:
- 輸入小于18的數(shù)字,輸出未成年
- 輸入大于18小于40的數(shù)字,輸出中年人
- 輸入大于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)
- exit循環(huán)
- for循環(huán)
游標
游標可以存放多個對象,多行記錄。
需求:輸出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