欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:數(shù)據(jù)庫 Oracle介紹

柚子快報激活碼778899分享:數(shù)據(jù)庫 Oracle介紹

http://yzkb.51969.com/

1、什么是Oracle Oracle數(shù)據(jù)庫是美國ORACLE公(甲骨文)提供的以分布式數(shù)據(jù)庫為核心的一組軟件產品,是目前最流行的 客戶/服務器(CLIENT/SERVER)或B/S體系結構的數(shù)據(jù)庫之一。 2、Oracle的特點 (1)支持多用戶、大事務量的事務處理 (2)數(shù)據(jù)安全性和完整性控制 (3)支持分布式數(shù)據(jù)處理 (4)可移植性 3、Oracle體系結構介紹【重要】 數(shù)據(jù)庫 Oracle數(shù)據(jù)庫是數(shù)據(jù)的物理存儲。這就包括(數(shù)據(jù)文件 ORA 或者 DBF、控制文件、聯(lián)機日志、參數(shù) 文件)。其實 Oracle 數(shù)據(jù)庫的概念和其它數(shù)據(jù)庫(SQLSERVER、MYSQL)不一樣,這里的數(shù)據(jù)庫是一 個操作系統(tǒng)只有一個庫??梢钥醋魇荗racle 就只有一個大數(shù)據(jù)庫。 實例 一個oracle實例有一系列的后臺進程和內存結構組成,一個數(shù)據(jù)庫可以有n個實例。實例之間互不 干擾。 數(shù)據(jù)文件(.DBF) 數(shù)據(jù)文件是數(shù)據(jù)庫的物理存儲單位。數(shù)據(jù)庫的數(shù)據(jù)是存儲在表空間中,真正是在某一個或多個數(shù)據(jù) 文件中。而一個表空間可以由一個或多個數(shù)據(jù)文件組成,一個數(shù)據(jù)文件只能屬于一個表空間。一旦 數(shù)據(jù)文件被加入到某個表空間后,就不能刪除這個文件,如果要刪除某個數(shù)據(jù)文件,只能刪掉其所 屬于的表空間才行。 表空間 表空間是Oracle對物理數(shù)據(jù)庫上相關數(shù)據(jù)文件(ORA 或者 DBF 文件)的邏輯映射。一個數(shù)據(jù)庫在邏 輯上被劃分成一到若干個表空間,每個表空間包含了在邏輯上相關聯(lián)的一組結構。每個數(shù)據(jù)庫至少 有一個表空間(稱之為 system表空間)。 每個表空間由同磁盤上的一個或多個文件組成,這些文件叫數(shù)據(jù)文件(datafile)。一個數(shù)據(jù)文件只能 屬于一個表空間。 注:表的數(shù)據(jù),是由用戶放入某一個表空間的,而這個表空間會隨機把這些表數(shù)據(jù)放到一個或者多 個數(shù)據(jù)文件中。 由于oracle的數(shù)據(jù)庫不是普通的概念,oracle是有用戶和表空間對數(shù)據(jù)進行管理和存放的。但是表 不是有表空間去查詢的,而是由用戶去查的。因為不同用戶可以在同一個表空間建立同一? 個名字的 表!這里區(qū)分就是用戶了! --------簡單來說Oracle中的表空間類似mysql的database數(shù)據(jù)庫,可以在表空間下創(chuàng)建多個表

二、Oracle表空間和用戶【重點】 1、oracle表空間 (1)、表空間分類 永久表空間 表空間是數(shù)據(jù)庫的邏輯劃分,一個表空間只能屬于一個數(shù)據(jù)庫。所有的數(shù)據(jù)庫對象都存放在指定的表空 間中。但主要存放的是表,所以稱作表空間 臨時表空間 oracle臨時表空間主要用來做查詢和存放一些緩沖區(qū)數(shù)據(jù)。臨時表空間消耗的主要原因是需要對查詢的 中間結果進行排序。重啟數(shù)據(jù)庫可以釋放臨時表空間 (2)、表空間操作 查看所有表空間 創(chuàng)建表空間 select * from sys.dba_tablespaces;

?

創(chuàng)建表空間 select * from sys.dba_tablespaces; create tablespace 永久表空間名稱 datafile ‘永久表空間物理文件位置【數(shù)據(jù)文件】.DBF’ size 100M -- size設置數(shù)據(jù)文件的大小 autoextend on next 10M -- autoextend 設置數(shù)據(jù)文件是否自動擴容,on是開啟【開啟后可以通過 “next xx”設置擴容大小】,off是關閉 maxsize 200M -- maxsize設置上限大小和autoextend配合使用,不設置就是無限 [permanent] -- 設置永久表空間,設置了就是永久表空間 [online]; -- 聯(lián)機狀態(tài) ,以便數(shù)據(jù)庫用戶訪問其中的數(shù)據(jù)。但是數(shù)據(jù)庫管理員可以在對表空間進行維護, 備份或恢復操作時,令表空間脫機(offline)

?

?

表空間重命名

alter tablespace 原表空間名稱 rename to 新表空間名稱;

增加數(shù)據(jù)文件

ps:一個表空間可以有多個數(shù)據(jù)文件的,每個是數(shù)據(jù)文件屬于一個表空間,數(shù)據(jù)文件就是在磁盤上存儲數(shù)據(jù)的媒介?

alter tablespace 表空間名稱 add datafile ‘數(shù)據(jù)文件路徑’ size 大小 autoextend on next 大小 maxsize 大小

修改表空間的數(shù)據(jù)文件 PS1: 想要修改數(shù)據(jù)文件需要先將表空間改為離線狀態(tài)“offline”,否則無法生效,因為online狀態(tài)下,表空間在使用數(shù)據(jù)文件,有這個讀寫保護的 PS2: 修改成的文件需要存在?

alter tablespace 表空間名 rename datafile ‘原來數(shù)據(jù)文件的路徑’ to ‘新的數(shù)據(jù)文件路徑’;

修改數(shù)據(jù)文件大小

alter database datafile ‘數(shù)據(jù)文件路徑’ resize 大小;

修改數(shù)據(jù)文件為自動增長

alter database datafile '數(shù)據(jù)文件路徑' autoextend on next 大小 maxsize 大小;?

?

?

修改表空間狀態(tài) 刪除表空間 ? 演示案例:移動數(shù)據(jù)文件 ps:在實際的開發(fā)中可能會遇到磁盤損壞,需要移動表空間文件移至安全路徑 alter database datafile ‘數(shù)據(jù)文件路徑’ resize 大小; alter database datafile '數(shù)據(jù)文件路徑' autoextend on next 大小 maxsize 大小; 1、聯(lián)機 alter tablespace 表空間名 online; 2、脫機 alter tablespace 表空間名 offline; 3、修改為只讀表空間 alter tablespace 表空間名 read only; 4、查看表空間狀態(tài) select * from DBA_TABLESPACES where TABLESPACE_NAME=’表空間名’; drop tablespace 表空間名; 第一步:使用管理員用戶操作,查看數(shù)據(jù)文件所在的表空間 select tablespace_name from dba_data_files where file_name=upper(‘數(shù)據(jù)文件路徑’); 第二步:使表空間進行脫機 alter tablespace 表空間名 offline; 第三步:移動數(shù)據(jù)文件至指定的目錄【如果使用linux就用mv指令,window可以用鼠標】 第四步:修改數(shù)據(jù)文件的位置 alter tablespace 表空間名 rename datafile ‘原來數(shù)據(jù)文件的路徑’ to ‘新的數(shù)據(jù)文件路徑’; 第五步:使用表空間聯(lián)機 alter tablespace 表空間名稱 online;

-- 查看全部表空間 select * from sys.dba_tablespaces; ? ? ? 2、Oracle用戶--DCL【重點】 oracle用戶和表空間掛鉤的,每一個表空間下創(chuàng)建多個表,用戶起到分隔數(shù)據(jù)的作用,是oracle權限的 重要組成 創(chuàng)建用戶 -- 創(chuàng)建表空間---類似MySQL中創(chuàng)建數(shù)據(jù)庫 create tablespace mytablespace datafile '/usr/local/dba/testdbf.DBF' ?-- LINUX服 務器沒有磁盤的直接是目錄路徑 size 100M -- size設置數(shù)據(jù)文件的大小 autoextend on next 10M -- autoextend 設置數(shù)據(jù)文件是否自動擴容,on是開啟【開啟后可以通 過“next xx”設置擴容大小】,off是關閉 maxsize 200M -- maxsize設置上限大小和autoextend配合使用,不設置就是無限 permanent -- 設置永久表空間,設置了就是永久表空間 online; -- 聯(lián)機狀態(tài) ,以便數(shù)據(jù)庫用戶訪問其中的數(shù)據(jù)。但是數(shù)據(jù)庫管理員可以在對表空間進行維護,備 份或恢復操作時,令表空間脫機(offline) -- 修改表空間名字 alter tablespace mytablespace rename to newtablespace; --- 追加數(shù)據(jù)文件到表空間 alter tablespace newtablespace add datafile ?'/usr/local/dba/testdbf_02.DBF' size 100M -- 文件多大 autoextend on next 10M -- 每次擴容多少 maxsize 200M; -- 最大上限多少 -- 修改數(shù)據(jù)文件設置 alter database datafile '/usr/local/dba/testdbf_02.DBF' resize 500M; ??-- 大小500 -- 查看某個表空間狀態(tài) select * from sys.dba_tablespaces ?where TABLESPACE_NAME='NEWTABLESPACE'; -- 更改表空間狀態(tài)位offline---離線狀態(tài) alter tablespace NEWTABLESPACE offline; -- 更改表空間狀態(tài)位online--聯(lián)機狀態(tài) alter tablespace NEWTABLESPACE online; create user 用戶名 identified by "密碼" default tablespace 表空間名;?

修改用戶密碼

1、傳統(tǒng)sql語法(11g 可以使用):alter user 用戶名 identified by 新密碼; 2、專用語法:password 用戶名

?刪除用戶

drop user 用戶名 cascade; --- cascades刪除時刪除該用戶所有表

完整演示

問題:用創(chuàng)建的用戶登錄發(fā)現(xiàn)無法登錄,原因是當前用戶創(chuàng)建了卻沒有賦予權限,無權訪問

?

3、權限管理--DCL【重點】 權限管理是Oracle實現(xiàn)安全管理的一部分。通過授予不同用戶的系統(tǒng)權限與對象權限,可以控制用戶對 系統(tǒng)功能的數(shù)據(jù)庫對象的操作 oracle權限可分為三種:系統(tǒng)權限,對象權限,角色權限 (1)、系統(tǒng)權限: 是指在系統(tǒng)級控制數(shù)據(jù)庫的存取和使用的機制,即執(zhí)行某種SQL語句的能力。例如啟動/停止數(shù)據(jù)庫,修 改數(shù)據(jù)庫參數(shù),連接數(shù)據(jù)庫等權限。-----系統(tǒng)權限是針對于用戶設置的,用戶必須被授予相應的系統(tǒng)權 限,才能連接到數(shù)據(jù)庫中進行想要的操作。 ps: 系統(tǒng)權限很多,此處說一下常見的權限,其余的自行百度 CREATE SESSION —————————— 連接數(shù)據(jù)庫 CREATE TABLESPACE —————————— 創(chuàng)建表空間 ALTER TABLESPACE —————————— 修改表空間 DROP TABLESPACE —————————— ??刪除表空間 CREATE USER —————————— ??創(chuàng)建用戶 DROP USER —————————— 修改用戶 CREATE TABLE —————————— ??創(chuàng)建表 語句: grant 系統(tǒng)權限1,系統(tǒng)全選2 ... to 用戶 --- 賦予 revoke 系統(tǒng)權限1,系統(tǒng)全選2 ... from 用戶 --- 收回

2)、對象權限: 是指用戶對數(shù)據(jù)庫對象的操作權限。數(shù)據(jù)庫對象包括表,視圖,序列和存儲過程等。Oracle的對象權限 包括ALTER【更改】,DELETE【刪除】,EXECUTE【執(zhí)行】,INDEX【索引】,INSERT【添加】, SELECT【查詢】和UPDATE【刷新】。這些對象權限適用于不同的對象。 --- 表權限【用于賦予對其他用戶【不同表空間下的】表操作的權限】 grant 權限1,權限2 on 用戶B.表名 to 用戶A;--- 賦予用戶A戶用于對于用戶Bxxx表的xxx權限 revoke 權限1,權限2 on 用戶B.表名 from 用戶A; --- 收回用戶A用于對于用戶Bxxx表的xxx權限

--- 表空間權限: 新建的用戶針對自己所屬表空間的對象默認是無權操作的,想要操作就要使用下列指令賦 予其對于自己所屬表空間對象的操作權限 grant unlimited tablespace to 用戶名; --- 給用戶授予全部的表空間的權限 revoke unlimited tablespace from 用戶名; --- 收回戶授予全部的表空間的權限

(3)、角色權限:

角色是可以授予用戶的相關權限的組,該方法使權限的授予,撤回更加容易管理

常用角色【內置角色】: connect ----- 登陸權限 resource ----- 開發(fā)人員權限 dba ----- 管理員權限[全部權限] 語法: grant 角色名稱1,角色名稱2 to 用戶;

(4)、權限傳遞

ps:這個用于給其他賬戶賦權的,只有允許的傳遞的權限才可以賦予其他賬戶,只有系統(tǒng)權限和對象權限可以設置權限傳遞

權限傳遞有兩種方式with admin option 和 with grant option,這兩種方式的特點是 with admin option: 用戶A可以將擁有權限賦予用戶B,如果用戶A的該權限被收回了,用戶B是不會受到 影響,該方式用于系統(tǒng)權限 with grant option:用戶A可以將擁有權限賦予用戶B,如果用戶A的該權限被收回了,用戶B也會被收回, 該方式用于對象權限 with admin option: ps:用戶A可以將擁有權限賦予用戶B,如果用戶A的該權限被收回了,用戶B是不會受到影響,該方式 用于系統(tǒng)權限 with grant option: ps:用戶A可以將擁有權限賦予用戶B,如果用戶A的該權限被收回了,用戶B也會被收回,該方式用于 對象權限 (5)、角色定義 角色在oracle中是一組權限的結合體,角色中可以包含很多權限。當把角色賦予用戶時,用戶就可以具 有角色內的所有權限。Oracle中角色分為兩類 <1> 系統(tǒng)預定義角色 <2> 管理員自建角色 1、新建兩個用戶 create user tim1 identified by "tim1" default tablespace test_ts; create user tim2 identified by "tim2" default tablespace test_ts; 2、system用戶賦予權限create session 給tim1用戶 grant create session to tim1 with admin option; 3、切換用戶至tim1,然后tim1用戶賦予權限create session 給tim2用戶; grant create session to tim2 ; 4、此時tim1和tim2都可以登錄,然后system用戶回收tim1的create session權限,tim1肯定不能登 錄,但是tim2還是可以登錄的。 revoke create session from tim1; 1、scott用戶賦予select權限給tim1 grant select on scott.emp to tim1 with grant option; 2、切換用戶至tim1,然后tim1用戶賦予權限給tim2用戶; grant select on scott.emp to tim2; 3、scott用戶回收tim1用戶的select權限,tim1沒有對scott.emp查詢的權限,tim2用戶也會消失掉對 scott.emp表的查詢權限 revoke select on scott.emp from tim1; connect ----- 登陸權限 resource ----- 開發(fā)人員權限 dba ----- 管理員權限 1、創(chuàng)建角色語法:create role 角色名; 2、給角色授權:grant 權限 to 角色名; ps:角色與角色之間也可以互相授權。例如:grant resource,dba to r1 3、把權限從角色中移除:revoke 權限 from 角色名; 4、刪除角色:drop role 角色名;

(6)、profile口令文件【了解】 ps:對賬戶進行高級管理【有效期,密碼重復次數(shù)...】 <1>、賬戶鎖定 <2>、賦予用戶口令 create profile 口令名稱 limit 參數(shù) 下面這些limit的可選參數(shù): password_life_time (天/unlimited[無限]) ---- 有效天數(shù) password_grace_time (天) --- 寬限天數(shù) failed_login_attempts 次數(shù) --- 輸入錯誤多少次 password_lock_time (天); --- 鎖定幾天 .... alter user 用戶名 profile 口令;

?

<3>、用戶解鎖

alter user 用戶名 account unlock;

<4>、用戶鎖定

alter user 用戶名 account lock; --- 永久鎖定

<5>、刪除口令

drop profile 口令名稱 cascade; <6>、修改口令

alter profile 口令名 limit 口令限制代碼;

三、數(shù)據(jù)類型

oracle中數(shù)據(jù)類型分三類:數(shù)字型、字符型、日期型

1、數(shù)字類型

(1). number:長度不限,只要是數(shù)字就行 (2). number(x):為整數(shù),并且長度不超過x位 (3). number(x,y):存在小數(shù)部分,總長度不超過x位,小數(shù)部分為y位 ps:也可以使用int和decimal之類的,number相當于int+double整合版本

2、字符型

(1). varchar2(x):長度不超過x位【oracle推薦】 (2). varchar(x):長度不超過x位 (3). char(x):固定長度是x位,不夠則補空格 ps: 1、char是固定長度,如果內容無法填充滿,會將剩余的用空格補充;varchar2/varchar都是可變長度,設 置只是一個最大長度,如果沒有填充滿也不會補空格 2、varchar是標準sql里面的;varchar2是oracle提供的獨有的數(shù)據(jù)類型。 3、varchar對于漢字占兩個字節(jié),對于數(shù)字,英文字符是一個字節(jié),占的內存??;varchar2一般情況下把所 有字符都占兩字節(jié)處理。 具體要看數(shù)據(jù)庫使用的字符集,比如GBK,漢字就會占兩個字節(jié),英文1個,如果是UTF-8,漢字一般占3個字 節(jié),英文還是1個。 4、varchar對空串不處理;varchar2將空串當做null來處理。 5、varchar存放固定長度的字符串,最大長度是2000;varchar2是存放可變長度的字符串,最大長度是 4000。

3、日期型

(1)、date:只需要日期 ,占用8字節(jié),yyyy-MM-dd (2)、timestamp:需要日期+時間,占用12字節(jié)

四、自增主鍵

ps:oracle和mysql不同,不能使用auto_increment 設置主鍵,需要先創(chuàng)建一個自增序列【序列就是一個對象】

-- 1.先創(chuàng)建一個自增序列對象 create sequence 序列名【自定義】 屬性 ; 可選屬性: increment by 1 -- 每次自增1,寫負數(shù)就是自動減少 start with 1 -- 開始值 nomaxvalue -- 沒有最大值 cache 20 -- 設置取值緩存數(shù),先緩存一些數(shù)出來,效率快 end with 65535 -- 結束值 ,一般不用設置上限---和nomaxvalue二選一 nominvalue -- 沒有最小值,一般用于自減的時候

-- Oracle 12 c 可以利用默認約束+自增序列實現(xiàn)主鍵自增 -- 自增序列.nextval:獲取下一個值 create table tab02( ??tid number(11) default 自增序列.nextval, ??price number(11,2), ??address varchar2(111), ??addtime date, ??primary key(tid) );

?舊版本--11g【通用寫法】 create table tab01( ??tid number(11), ??price number(11,2), ??address varchar2(111), ??addtime date, ??primary key(tid) ); -- 在插入時,使用自增序列 insert into tab01 values(my_auto_increment.nextval,20.50,'濟南',to_date('2023-01- 03','yyyy-MM-dd'));

五、DML語句 Oracle自帶事務,執(zhí)行DML語句后需要手動commit【提交】/rollback【回滾】 1、添加語句

基礎版: insert into 表名(字段1,字段2,字段3) values(值1,值2,值3...); --- 如果表后寫字段,values 值對應表后聲明字段;如果沒寫,就對應表字段---和mysql的規(guī)則一樣 ps: 1、一次只能插入一行 2、時間類型不能直接寫字符串,需要用函數(shù)to_date轉換 to_date(時間,格式): 格式有兩種對應兩種不同時間類型, 字段為date類型時”yyyy-MM-dd”。字段為 timestamp類型時“yyyy-MM-dd hh24:mi:ss”

2、修改語句

update 表 set 字段=值,字段=值 ... where 條件

3、刪除語句

delete from 表 where 條件

where條件

1、算數(shù)運算: + , - ,* , / 2、比較運算:=,!= ,< , > ,>=,<= 3、介于之間:between A and B 4、包含不包含: in , not in 5、非空不非空:is null ,is not null 6、關系運算: and ,or 7、模糊查詢: like 8、子查詢的全部/任意: any , all 9、字段類型轉換: ps:有一些類型需要進轉換才可以使用,比如:時間和字符串的互轉 --- to_date (字符串時間,字符串格式) 字段為date類型時”yyyy-MM-dd”。字段為timestamp類型時“yyyy-MM-dd hh24:mi:ss” --- to_char(其他類型,字符串格式) 可以將其他類型數(shù)據(jù)轉為字符串類型的數(shù)據(jù) --- to_number(字符串類型數(shù)字,數(shù)字的格式) 可以將字符串數(shù)字格式化為純數(shù)字

六、DQL語句

1、基本結構

select 字段 from 表 where 分組前條件 group by 分組條件 having 分組后條件 order by 排序 條件; --- 和mysql相比沒有l(wèi)imit分頁

2、Oracle偽列【獨有,重點】 Oracle表的使用過程中,實際上表中除了我們設置的字段外,還有一些附加列,稱為偽列;偽列可以和 正常字段一樣被查詢使用【不能增刪改】,但是不存在于表中。

(1)、rownum(重點) 解釋:rownum會在你的查詢結果集中,為每一行標識一個行號【從1開始】,可以利用rownum查詢行 數(shù) 注意:如果篩選條件中用rownum,那么只能用 < 或 <= 來查詢,其余的都查詢不到 作用:可以用于oracle分頁查詢

問題:如果后6行?rownum不能用除了

分頁實現(xiàn)【重點】:

ps:oracle沒有l(wèi)imit,想分頁須使用rownum

(2)、rowid

解釋:表中每一行數(shù)據(jù)再數(shù)據(jù)文件中有一個物理地址,rowid偽列返回的就是該物理地址

作用:

數(shù)據(jù)包準備: -- 定義表people create table peopletab( pname varchar(10), pmoney number(11,2), pcity varchar(10) ); -- 插入數(shù)據(jù) insert into peopletab values('zhangsan',2500.00,'jinan'); insert into peopletab values('zhangsan',2500.00,'jinan'); insert into peopletab values('lisi',3000.00,'jinan'); insert into peopletab values('zhangsan',2500.00,'qingdao'); -- 提交 commit;

3、連接查詢

(1)、傳統(tǒng)sql寫法

<1>、內連接/自然連接:將左右兩個表中相關的數(shù)據(jù)查詢出來 select 字段 from 表A inner join【或者簡寫為jion】 表B on 連表條件 <2>、外連接: 1、左外連接:左邊表為驅動表,會查詢出全部數(shù)據(jù),右邊是被驅動表,只出相對應的數(shù)據(jù) select 字段 from 表A left outer join【left jion】 表B on 連表條件 2、右外連接:右邊表為驅動表,會查詢出全部數(shù)據(jù),做邊是被驅動表,只出相對應的數(shù)據(jù) select 字段 from 表A right outer join【right jion】 表B on 連表條件 3、全外連接:左右連邊表都是全部出來,就沒有驅動被驅動了 select 字段 from 表A full outer join【full jion】 表B on 連表條件

(2)、笛卡爾積寫法

<1>、內連接/自然連接的笛卡爾積寫法: ps:普通連接查詢就是自然連接查詢的笛卡爾積寫法,這倆是一個東西,因此性能一樣的 select 字段 from 表1,表2... where 連表條件 and 其他條件 <2>、外連接笛卡爾積寫法: 1、左外連接笛卡爾積寫法 ps: 其中這個(+) 就相當于告訴數(shù)據(jù)庫以xxx表為被驅動表,另外一邊全出 select 字段 from 表1,表2... where 表1的關系字段 = 表2的關系字段(+) and 其他條件 2、右外連接笛卡爾積寫法 select 字段 from 表1,表2... where 表1的關系字段(+) = 表2的關系字段 and 其他條件

七、函數(shù)

1、數(shù)學函數(shù)

(1)、nvl(目標字段,默認數(shù)字【number類型】)---判斷字段是否為空,如果不為空返回字段值,為空返回 默認值 (2)、abs(數(shù)字) --- 絕對值 (3)、mod(被除數(shù),除數(shù)) --- 模運算,取余數(shù) (4)、power(x,y) --- 冪函數(shù),返回x的y次方 (5)、ceil(x) --- 向上取整,ceil(3.3) = 4 (6)、floor(x) --- 向下取整 (7)、round(x,y) --- 四舍五入,x被四舍五入的值,y保留幾位小數(shù)

2、字符函數(shù)

(1)、add_months(d【時間類型,手寫日期需要to_date轉換】,n) --- 返回d這個日期完后n個月的日期

(2)、last_day(d) --- 返回d日期所屬月份的最后一天

(3)、months_between(d1,d2) --- 返回兩個日期的月份差

(4)、round(d,fmt) --- 對日期d根據(jù)不同維度進行四舍五入 fmt的格式有:yyyy/MM/dd/day[星期]/q[季度]/w[當月第幾周]/iw[當年第幾周]

3、聚合函數(shù)

(1)、sum ---- 求和 (2)、min 和 max --- 最值 (3)、avg --- 平均值 (4)、count --- 計數(shù)

4、分析函數(shù)

(1)、聚合函數(shù)分析函數(shù)

聚合函數(shù)(字段)over([partition by 字段][order by 字段]) --- 可以對聚合函數(shù)進行分析 --- partition by 字段 :以xxx分組,是對聚合函數(shù)的結果進行分組 --- order by 字段 : 排序

(2)、排名類分析

row_number()over([partition by 字段] order by 字段 ) --- 對每行數(shù)據(jù)進行一個排名, row_number()類似于偽列rownum

rank()over([partition by 字段] order by 字段 ) ---對每行數(shù)據(jù)進行一個排名,如果數(shù)據(jù)相同會 標記相同的序號,后面的序號會越過

dense_rank()over([partition by 字段] order by 字段 ) ---對每行數(shù)據(jù)進行一個排名,如果數(shù) 據(jù)相同會標記相同的序號,后面的序號不會越過

5、行列轉換

CREATE TABLE student( id number(20) NOT NULL, name varchar(50), course varchar(50), score number(3) ) INSERT INTO student VALUES (1,'zhangsan', 'yuwen', 95); INSERT INTO student VALUES (2,'lisi', 'yuwen', 99); INSERT INTO student VALUES (3,'wangwu', 'yuwen', 80); INSERT INTO student VALUES (4,'zhangsan', 'shuxue', 86); INSERT INTO student VALUES (5,'lisi', 'shuxue', 96); INSERT INTO student VALUES (6,'wangwu', 'shuxue', 81); INSERT INTO student VALUES (7,'zhangsan', 'yingyu', 78); INSERT INTO student VALUES (8,'lisi', 'yingyu', 88);

INSERT INTO student VALUES (9,'wangwu', 'yingyu', 87); commit

一般顯示方式

行列轉換

八、存儲過程語法

-- 定義 create procedur 存儲過程名(參數(shù)列表【參數(shù)名 參數(shù)類型(in,out,inout) 數(shù)據(jù)類型】) is -- 聲明部分 標量之類的 begin -- 流程 end; -- 調用 call 存儲過程名(...)

1、if else

if 條件1 then 操作 ; elsif 條件2 then 操作; ... else 操作; end if;

2 、case

case when 條件1 then 操作; when 條件2 then 操作; ... else 操作; end case;

3、loop循環(huán)

loop -- 循環(huán)體 if 條件 then ??exit; -- mysql結束符 leave,oracle是exit; end if; end loop;

4、while

while 條件 loop ??-- 循環(huán)體 end loop

5、for

for 循環(huán)變量 in (select 語句) loop -- 循環(huán)體 end loop;

6、游標

(1)、隱式游標

select 字段 into 變量 ....

(2)、顯示游標

create procedure 名... is cursor 游標名 is select語句; begin ??for 變量 in 游標 loop ????-- 循環(huán)體 ??end loop; end;

九、表分區(qū)

當表中的數(shù)據(jù)量不斷增大,查詢數(shù)據(jù)的速度就會變慢,應用程序的性能就會下降,這時就應該考慮對表 進行分區(qū)。 表進行分區(qū)后,邏輯上表仍然是一張完整的表,只是將表中的數(shù)據(jù)在物理上存放到一個或多個表空間, 這樣查詢數(shù)據(jù)時,不至于每次都掃描整張表。

1、表分區(qū)創(chuàng)建 <1>、范圍分區(qū)【range】 就是根據(jù)數(shù)據(jù)庫表中某一字段的值的范圍來劃分分區(qū)

格式:

CREATE TABLE 表名 (字段 數(shù)據(jù)類型 約束...) -- 這一塊是建表語句 PARTITION BY RANGE (某個字段) -- range范圍分區(qū) ( ????PARTITION 分區(qū)名1 VALUES LESS THAN【LESS THAN是小于】 (值) [TABLESPACE 表 空間1], ????PARTITION 分區(qū)名2 VALUES LESS THAN (值) [TABLESPACE 表空間2], ????.... ????PARTITION 分區(qū)名n VALUES LESS THAN (MAXVALUE) [TABLESPACE 表空間n] ) ps:表分區(qū)語法mysql和oracle基本一致,但是oracle可以將分區(qū)和tablespace進行組合

演示:

(1)、準備3個表空間

create tablespace pts01 datafile 'F:/java/oracle/product/11.2.0/tablespaces/pts01.DBF' size 100M autoextend on next 10M maxsize 200M permanent online; create tablespace pts02 datafile 'F:/java/oracle/product/11.2.0/tablespaces/pts02.DBF' size 100M autoextend on next 10M maxsize 200M permanent online; create tablespace pts03 datafile 'F:/java/oracle/product/11.2.0/tablespaces/pts03.DBF' size 100M autoextend on next 10M maxsize 200M permanent online;

(2)、創(chuàng)建表分區(qū)

create table graderecord ( sno varchar2(10), -- 編號 sname varchar2(20),-- 學生名 dormitory varchar2(3),-- 科目 grade int -- 分數(shù) ) partition by range(grade) -- 創(chuàng)建范圍表分區(qū),以grade字段為范圍條件,分成3分區(qū) ( -- 例如:分區(qū) '不及格' 當grade 值小于 60 數(shù)據(jù)存儲到該分區(qū),該分區(qū)所在表空間為pts01 partition bujige values less than(60) TABLESPACE pts01, --不及格 partition jige values less than(85) TABLESPACE pts02, --及格 -- maxvalue相當于條件分支語句的else條件,不滿足上方的都會進來,如果是空值也會進入maxvalue partition youxiu values less than(maxvalue) TABLESPACE pts03 --優(yōu)秀 );

(3)、插入實驗數(shù)據(jù)

insert into graderecord values('511601','魁','229',92); insert into graderecord values('511602','凱','229',62); insert into graderecord values('511603','東','229',26); insert into graderecord values('511604','亮','228',77); insert into graderecord values('511605','敬','228',47); insert into graderecord(sno,sname,dormitory) values('511606','峰','228');-- 缺考 insert into graderecord values('511607','明','240',90); insert into graderecord values('511608','楠','240',100); insert into graderecord values('511609','濤','240',67); insert into graderecord values('511610','博','240',75); insert into graderecord values('511611','錚','240',60); commit;

(4)、查看數(shù)據(jù)

select * from graderecord; -- 查看全部數(shù)據(jù) select * from graderecord partition(bujige); -- 查看bujige分區(qū)數(shù)據(jù) select * from graderecord partition(jige);-- 查看jige分區(qū)數(shù)據(jù) select * from graderecord partition(youxiu);-- 查看youxiu分區(qū)數(shù)據(jù)

<2>、散列分區(qū)【hash】

散列分區(qū)是根據(jù)字段的hash值進行均勻分布,盡可能的實現(xiàn)各分區(qū)所散列的數(shù)據(jù)相等。

語法:

CREATE TABLE 表名 (字段 數(shù)據(jù)類型 約束...) PARTITION BY HASH (某個字段) -- hash是散列 ( ????PARTITION 分區(qū)名1 [TABLESPACE 表空間1], ????PARTITION 分區(qū)名2 [TABLESPACE 表空間2], ????.... ????PARTITION 分區(qū)名n [TABLESPACE 表空間n] );

演示:

create table graderecord2 ( sno varchar2(10), sname varchar2(20), dormitory varchar2(3), grade int ) partition by hash(grade) ( partition p1, partition p2, partition p3 ); insert into graderecord2 values('511601','魁','229',92); insert into graderecord2 values('511602','凱','229',62); insert into graderecord2 values('511603','東','229',26); insert into graderecord2 values('511604','亮','228',77); insert into graderecord2 values('511605','敬','228',47); insert into graderecord2(sno,sname,dormitory) values('511606','峰','228'); insert into graderecord2 values('511607','明','240',90); insert into graderecord2 values('511608','楠','240',100); insert into graderecord2 values('511609','濤','240',67); insert into graderecord2 values('511610','博','240',75); insert into graderecord2 values('511611','錚','240',60); insert into graderecord3 values('511611','錚','240',60); commit; select * from graderecord2; -- 查看全部數(shù)據(jù) select * from graderecord2 partition(p1); -- 查看p1分區(qū)數(shù)據(jù) select * from graderecord2 partition(p2);-- 查看p2分區(qū)數(shù)據(jù) select * from graderecord2 partition(p3);-- 查看p3分區(qū)數(shù)據(jù)

<3>、列表分區(qū)【list】

列表分區(qū)明確指定了根據(jù)某字段的某個具體值進行分區(qū),而不是像范圍分區(qū)那樣根據(jù)字段的值范圍來劃分的。

語法:

CREATE TABLE 表名 (字段 數(shù)據(jù)類型 約束...) PARTITION BY LIST (某個字段) -- list是列表 ( ????PARTITION 分區(qū)名1 values(值,值,值...) [TABLESPACE 表空間1], ????PARTITION 分區(qū)名2 values(值,值,值...) [TABLESPACE 表空間2], ????.... ????PARTITION 分區(qū)名n values(值,值,值...) [TABLESPACE 表空間n] );

演示:

create table graderecord3 ( sno varchar2(10), sname varchar2(20), dormitory varchar2(3), grade int ) partition by list(dormitory) ( partition p1 values('229') , partition p2 values('228'), partition p3 values('240') ); insert into graderecord3 values('511601','魁','229',92); insert into graderecord3 values('511602','凱','229',62); insert into graderecord3 values('511603','東','229',26); insert into graderecord3 values('511604','亮','228',77); insert into graderecord3 values('511605','敬','228',47); insert into graderecord3(sno,sname,dormitory) values('511606','峰','228'); insert into graderecord3 values('511607','明','240',90); insert into graderecord3 values('511608','楠','240',100); insert into graderecord3 values('511609','濤','240',67); insert into graderecord3 values('511610','博','240',75); insert into graderecord3 values('511611','錚','240',60); commit;

select * from graderecord3; -- 查看全部數(shù)據(jù) select * from graderecord3 partition(p1); -- 查看p1分區(qū)數(shù)據(jù) select * from graderecord3 partition(p2);-- 查看p2分區(qū)數(shù)據(jù) select * from graderecord3 partition(p3);-- 查看p3分區(qū)數(shù)據(jù)

<4>、復合分區(qū)

(1)、范圍-散列分區(qū)

語法:

CREATE TABLE 表名 (字段 數(shù)據(jù)類型 約束...) PARTITION BY RANGE (某個字段) -- 先進行范圍的字段,只能是一個字段 subpartition by hash(字段1,字段2...) -- 后進行散列的字段,注意此處可以設置多個字段散列 ( partition 范圍分區(qū)1 values less than(值1) [TABLESPACE 表空間] ??????????( ??????????????subpartition 散列分區(qū)1 [TABLESPACE 表空間], ??????????????subpartition 散列分區(qū)2 [TABLESPACE 表空間] ??????????????... ??????????), .... partition 范圍分區(qū)n values less than(maxvalue) [TABLESPACE 表空間] ??????????( ??????????????subpartition 散列分區(qū)3 [TABLESPACE 表空間], ??????????????subpartition 散列分區(qū)4 [TABLESPACE 表空間] ??????????????... ??????????) );

演示:

create table graderecord4 ( sno varchar2(10), sname varchar2(20), dormitory varchar2(3), grade int ) partition by range(grade) -- 范圍 subpartition by hash(sname,dormitory) -- 散列 ( ??partition p1 values less than(60) -- 成績小于60的會被散列到sp1和sp2中 ??( ??????subpartition sp1, ??????subpartition sp2 ??), ??partition p2 values less than(maxvalue) -- 其他成績的會被散列到sp3和sp4中 ??( ??????subpartition sp3, ??????subpartition sp4 ??) );

insert into graderecord4 values('511601','魁','229',92); insert into graderecord4 values('511602','凱','229',62); insert into graderecord4 values('511603','東','229',26); insert into graderecord4 values('511604','亮','228',77); insert into graderecord4 values('511605','敬','228',47);

insert into graderecord4(sno,sname,dormitory) values('511606','峰','228'); insert into graderecord4 values('511607','明','240',90); insert into graderecord4 values('511608','楠','240',100); insert into graderecord4 values('511609','濤','240',67); insert into graderecord4 values('511610','博','240',75); insert into graderecord4 values('511611','錚','240',60); commit; select * from graderecord4; -- 查看全部數(shù)據(jù) select * from graderecord4 partition(p2); -- 查看60分上成績 select * from graderecord4 subpartition(sp3); -- 查看p2下散列的分區(qū) select * from graderecord4 subpartition(sp4);

(2)、范圍-列表分區(qū)

語法:

CREATE TABLE 表名 (字段 數(shù)據(jù)類型 約束...) PARTITION BY RANGE (某個字段) -- 先進行范圍的字段,只能是一個字段 subpartition by LIST(字段1,字段2...) -- 后進行散列的字段,注意此處可以設置多個字段散列 ( partition 范圍分區(qū)1 values less than(值1) [TABLESPACE 表空間] ??????????( ??????????????subpartition 列表分區(qū)1 values(值,值,值...) [TABLESPACE 表空間], ??????????????subpartition 列表分區(qū)2 values(值,值,值...) [TABLESPACE 表空間] ??????????????... ??????????), .... partition 范圍分區(qū)n values less than(maxvalue) [TABLESPACE 表空間] ??????????( ??????????????subpartition 列表分區(qū)3 values(值,值,值...) [TABLESPACE 表空間], ??????????????subpartition 列表分區(qū)4 values(值,值,值...) [TABLESPACE 表空間] ??????????????... ??????????) );

演示:

create table graderecord5 ( sno varchar2(10), sname varchar2(20), dormitory varchar2(3), grade int ) partition by range(grade) -- 成績范圍,分成及格/不及格 subpartition by list(dormitory) -- 列表,只按照科目分 ( ??partition bujige values less than(60) -- 不及格 ??( ??????subpartition sp229_bjg values('229'), -- 229不及格 ??????subpartition sp228_bjg values('228'), -- 228不及格 ??????subpartition sp240_bjg values('240') -- 240不及格 ??), 2、分裂表分區(qū) 拆分分區(qū)將一個分區(qū)拆分兩個新分區(qū),拆分后原來分區(qū)不再存在。注意不能對HASH類型的分區(qū)進行拆 分。 語法: 演示: ??partition jige values less than(maxvalue) -- 及格 ??( ??????subpartition sp229_jg values('229'), -- 229及格 ??????subpartition sp228_jg values('228'), -- 228及格 ??????subpartition sp240_jg values('240') -- 240及格 ??) ); insert into graderecord5 values('511601','魁','229',92); insert into graderecord5 values('511602','凱','229',59); insert into graderecord5 values('511603','東','229',26); insert into graderecord5 values('511604','亮','228',77); insert into graderecord5 values('511605','敬','228',47); insert into graderecord5 values('511606','峰','228',99); insert into graderecord5 values('511607','明','240',90); insert into graderecord5 values('511608','楠','240',100); insert into graderecord5 values('511609','濤','240',32); insert into graderecord5 values('511610','博','240',75); insert into graderecord5 values('511611','錚','240',60); commit; select * from graderecord5; -- 查看全部數(shù)據(jù) select * from graderecord5 partition(jige); -- 及格區(qū) select * from graderecord5 subpartition(sp228_jg);-- 228及格的 alter table 表 split partition 分區(qū)名 at【在】(值) into(partition 新分區(qū)1,partition 新分區(qū)2); ? drop table tstable; CREATE TABLE tstable ( ??tsid number(11) primary key, ??tsname varchar2(20), ??tssex varchar2(10), ??tsgrade number(11) ) ? PARTITION BY range (tsgrade) -- 基于成績來范圍分為及格不及格 ( ????PARTITION p1 values less than(60), -- 不及格 ????PARTITION p2 values less than(maxvalue) -- 及格 ) 3、合并分區(qū) 合并分區(qū)是將相鄰的分區(qū)合并成一個分區(qū),結果分區(qū)將采用較高分區(qū)的界限,注意的是,不能將分區(qū)合 并到界限較低的分區(qū)。 語法:

ALTER TABLE 表名 MERGE PARTITIONS 分區(qū)1【低界限】,分區(qū)2【高界限】 INTO PARTITION 分區(qū)2 【高界限】; 演示: insert into tstable values(1,'張三','男',30); insert into tstable values(2,'張四','女',40); insert into tstable values(3,'張五','男',50); insert into tstable values(4,'張六','女',60); insert into tstable values(5,'張七','男',70); insert into tstable values(6,'張八','女',80); insert into tstable values(7,'張九','男',90); insert into tstable values(8,'張十','女',100); commit; -- 拆分分區(qū),及格中還有良好和優(yōu)秀兩種分類,就要將p2【及格分區(qū)】分為LH 和YX 以80分分界 alter table tstable split partition p2 at(80) into(partition LH,partition YX); ? select * from tstable; select * from tstable partition(p1); select * from tstable partition(p2); -- 拆分后p2不存在 select * from tstable partition(LH); -- 新分區(qū)LH不包含80的 select * from tstable partition(YX); -- 新分區(qū)YX包含80的

演示:

drop table tstable; CREATE TABLE tstable ( ??tsid number(11) primary key, ??tsname varchar2(20), ??tssex varchar2(10), ??tsgrade number(11) ) ? PARTITION BY range (tsgrade) -- 基于成績來范圍分為及格不及格 ( ????PARTITION bjg values less than(60), -- 不及格 ????PARTITION jg values less than(80), -- 及格 ????PARTITION yx values less than(maxvalue) -- 優(yōu)秀 ) insert into tstable values(1,'張三','男',30); insert into tstable values(2,'張四','女',40); insert into tstable values(3,'張五','男',50); insert into tstable values(4,'張六','女',60); insert into tstable values(5,'張七','男',70); insert into tstable values(6,'張八','女',80); insert into tstable values(7,'張九','男',90); insert into tstable values(8,'張十','女',100); 4、追加分區(qū) 注意:添加的分區(qū)界限應該高于最后一個分區(qū)界限。 語法: 演示: 5、刪除分區(qū) commit; -- 要將及格和優(yōu)秀統(tǒng)稱為yx,就要合并分區(qū)jg和yx ALTER TABLE tstable MERGE PARTITIONS jg,yx INTO PARTITION yx; -- ps: 合并分區(qū)不能將內容合并到界限低的分區(qū)中;所謂界限就是分區(qū)創(chuàng)建時的values的范圍 -- 例如: jg的values less than 80 , yx的values less than maxvalue,所以yx界限高 -- 因此只能將jg合并到y(tǒng)x中 select * from tstable partition(yx); ALTER TABLE 表名 ADD PARTITION 分區(qū)名 VALUES LESS THAN(值); --追加范圍分區(qū) ALTER TABLE 表名 ADD PARTITION 分區(qū)名; -- 追加hash分區(qū) ALTER TABLE 表名 ADD PARTITION 分區(qū)名 values(值,值,值...); -- 追加list分區(qū) drop table tstable; CREATE TABLE tstable ( ??tsid number(11) primary key, ??tsname varchar2(20), ??tssex varchar2(10), ??tsgrade number(11) ) ? PARTITION BY range (tsgrade) -- 基于成績來范圍分為及格不及格 ( ????PARTITION bjg values less than(60), ????PARTITION jg values less than(80) -- 最大只能到80一下【79】 ) -- 正常追加80之前的都可以,因為有分區(qū) insert into tstable values(1,'張三','男',30); insert into tstable values(2,'張四','女',40); insert into tstable values(3,'張五','男',50); insert into tstable values(4,'張六','女',60); insert into tstable values(5,'張七','男',70); commit; -- 追加80以上的因為沒有分區(qū),所以不行,因此要追加80以上的分區(qū) ALTER TABLE tstable ADD PARTITION ps VALUES LESS THAN(120); -- 將范圍設置到120下 【119】 insert into tstable values(6,'張八','女',80); insert into tstable values(7,'張九','男',90); insert into tstable values(8,'張十','女',100); commit; 語法: 演示: 6、截斷分區(qū)【重置分區(qū)】 截斷某個分區(qū)是指刪除某個分區(qū)中的數(shù)據(jù),并不會刪除分區(qū),也不會刪除其它分區(qū)中的數(shù)據(jù)。當表中即 使只有一個分區(qū)時,也可以截斷該分區(qū)。 語法: ALTER TABLE 表名 DROP PARTITION 分區(qū)名; drop table tstable; CREATE TABLE tstable ( ??tsid number(11) primary key, ??tsname varchar2(20), ??tssex varchar2(10), ??tsgrade number(11) ) ? PARTITION BY range (tsgrade) -- 基于成績來范圍分為及格不及格 ( ????PARTITION p1 values less than(60), ????PARTITION p2 values less than(80), ????PARTITION p3 values less than(maxvalue) ) insert into tstable values(1,'張三','男',30); insert into tstable values(2,'張四','女',40); insert into tstable values(3,'張五','男',50); insert into tstable values(4,'張六','女',60); insert into tstable values(5,'張七','男',70); insert into tstable values(6,'張八','女',80); insert into tstable values(7,'張九','男',90); insert into tstable values(8,'張十','女',100); commit; -- 先查詢一下 select * from tstable; -- 刪除p2分區(qū) alter table tstable DROP partition p2; -- 再查詢一下 select * from tstable; select * from tstable partition(p1); select * from tstable partition(p3); select * from tstable partition(p2); -- 沒有 ALTER TABLE 表名 TRUNCATE PARTITION 分區(qū)名; 演示: 7、分區(qū)重命名 語法: 演示: drop table tstable; CREATE TABLE tstable ( ??tsid number(11) primary key, ??tsname varchar2(20), ??tssex varchar2(10), ??tsgrade number(11) ) ? PARTITION BY range (tsgrade) -- 基于成績來范圍分為及格不及格 ( ????PARTITION p1 values less than(60), ????PARTITION p2 values less than(80), ????PARTITION p3 values less than(maxvalue) ) insert into tstable values(1,'張三','男',30); insert into tstable values(2,'張四','女',40); insert into tstable values(3,'張五','男',50); insert into tstable values(4,'張六','女',60); insert into tstable values(5,'張七','男',70); insert into tstable values(6,'張八','女',80); insert into tstable values(7,'張九','男',90); insert into tstable values(8,'張十','女',100); commit; -- 先查詢一下 select * from tstable; -- 截斷p2分區(qū) alter table tstable TRUNCATE partition p2; -- 再查詢一下 select * from tstable; select * from tstable partition(p1); select * from tstable partition(p3); select * from tstable partition(p2); -- 存在分區(qū),但是數(shù)據(jù)沒了 ALTER TABLE 表名 RENAME PARTITION 原分區(qū)名 TO 新分區(qū)名; drop table tstable; CREATE TABLE tstable ( ??tsid number(11) primary key, ??tsname varchar2(20), ??tssex varchar2(10), ??tsgrade number(11) ) ? PARTITION BY range (tsgrade) -- 基于成績來范圍分為及格不及格 ( ????PARTITION p1 values less than(60), 十、Oracle索引 索引可以提高查詢效率 1、Oracle索引注意: (1)、索引列盡量再where子句中提取,對使用頻繁的字段加入合適的索引 (2)、一個表中不是索引越多越好,索引的維護也要資源開銷 (3)、將表和索引建立到相同表空間中,可以簡化表空間管理;將表和索引建立到不相同表空間中,可 以提高訪問性能 (4)、最好不要小表上建立索引【沒必要】 (5)、當在大表上建立索引時,最好加上NOLOGGING【日志模式】選項, 可以節(jié)省重做日志的空間, 降低索引建立時間,提高效率 (6)、連表時,建議在連接列上建立索引 2、Oracle索引分類 (1)、btree索引 Btree索引是oracle默認索引類型,結構和mysql的是一樣的 ????PARTITION p2 values less than(80), ????PARTITION p3 values less than(maxvalue) ) insert into tstable values(1,'張三','男',30); insert into tstable values(2,'張四','女',40); insert into tstable values(3,'張五','男',50); insert into tstable values(4,'張六','女',60); insert into tstable values(5,'張七','男',70); insert into tstable values(6,'張八','女',80); insert into tstable values(7,'張九','男',90); insert into tstable values(8,'張十','女',100); commit; -- 將p2重命名為jg ALTER TABLE tstable RENAME PARTITION p2 TO jg; -- 就要用重命名的新名來查詢 select * from tstable partition(jg); oracle日志模式分為(logging,force logging,nologging),默認情況是logging,就是會記錄到 redo日志中,force logging是強制記錄日志,nologging是盡量減少日志

Btree:多叉樹或平衡多路查找樹【概念重點】,一顆m叉的的BTREE特性如下: 1.m叉樹中每個節(jié)點最多包含m個元素; 2.除根節(jié)點與葉子節(jié)點【沒有子分支節(jié)點】外,每個節(jié)點至少有ceil(m/2)個孩子 3.若根節(jié)點不是葉子節(jié)點,則至少有兩個孩子 4.所有的葉子節(jié)點都在同一層 5.每個非葉子節(jié)點【帶有分支的節(jié)點】由n個key【上圖藍色小塊】與n+1個指針【上圖黃色小塊】組成,其中 key范圍是ceil(m/2)-1<=n<=m-

語法

創(chuàng)建索引: create index 索引名 on 表名(字段,字段,....) [tablespace 表空間] 刪除索引: drop index 索引名;

演示

創(chuàng)建索引: create index 索引名 on 表名(字段,字段,....) [tablespace 表空間] 刪除索引: drop index 索引名;

演示

(2)、位圖索引 對于一些特殊的表,比如一個表中只有一列、數(shù)據(jù)重復度高【例如性別】,此時建立Btree索引對表進行 檢索時,回返回將進一半的數(shù)據(jù),Btree索引效率很低,此時就可以使用位圖索引。具體什么時候用有一 個參考的變量“基數(shù)” oracle推薦如果一個列的“基數(shù)”小于1%適合建立位圖索引【基數(shù)越小,重復率越 高】,例如一個表中10000條數(shù)據(jù),一列中可取的值有100種,此時基數(shù)就是1%【值種類/總行數(shù) *100%】,一個表中10000條數(shù)據(jù),一列中可取的值有10種,此時基數(shù)就是0.1% 語法:

創(chuàng)建索引: create bitmap index 索引名 on 表名(字段) [tablespace 表空間] 刪除索引: drop index 索引名;

演示

補充:oracle有個變量CREATE_BITMAP_AREA_SIZE 【位圖區(qū)大小】,該變量值越大位圖索引效率越 高,默認8MB

alter system set CREATE_BITMAP_AREA_SIZE=字節(jié)數(shù)【默認:8388608 (8MB)】

(3)、反向鍵索引 數(shù)據(jù)庫會自動的表的主鍵創(chuàng)建Btree索引【主鍵索引】,通常的主鍵都是自增序列,如果使用默認的 Btree索引,當數(shù)據(jù)量巨大時會導致索引數(shù)據(jù)分布不均,葉子節(jié)點會偏向某一個方向,索引的鍵值會基本 分布在同一個葉塊中,容易出現(xiàn)索引塊爭用問題。因此就可以使用反向鍵索引,將鍵值分散到不同葉塊 中,減少索引塊爭用問題,提高效率 ps:反向鍵索引就是將索引鍵給倒轉過來,例如:1001,1002,1003 反轉為1001,2001,3001,這 樣就會分散到不同的葉塊中,從而降低索引塊爭用

語法

創(chuàng)建索引: create [bitmap] index 索引名 on 表名(字段) reverse [tablespace 表空間] 刪除索引: drop index 索引名;

演示

注意

反向鍵索引雖然解決了索引葉爭用問題,提高了效率;但是反向鍵索引會將索引散列到多個葉塊中了, 如果進行范圍查詢時只能進行全表的掃描了,性能反而降低了

柚子快報激活碼778899分享:數(shù)據(jù)庫 Oracle介紹

http://yzkb.51969.com/

好文鏈接

評論可見,查看隱藏內容

本文內容根據(jù)網絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://m.gantiao.com.cn/post/18932460.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄