事務(Transaction)是一個操做序列。這些操做要麼都作, 要麼都不作, 是一個不可分割的工做單元, 是數據庫環境中的最小工做單元。sql
原子性是指事務包含的全部操做要麼所有成功, 要麼所有失敗回滾, 所以事務的操做若是成功就必需要徹底應用到數據庫, 若是操做失敗則不能對數據庫有任何影響.數據庫
一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態, 也就是說一個事務執行以前和執行以後都必須處於一致性狀態.服務器
隔離性是當多個用戶併發訪問數據庫時, 好比操做同一張表時, 數據庫爲每個用戶開啓的事務, 不能被其餘事務的操做所幹擾, 多個併發事務之間要相互隔離.session
持久性是指一個事務一旦被提交了, 那麼對數據庫中的數據的改變就是永久性的, 即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做.併發
a) 提交, 在確保事務執行成功時, 應該將事務進行提交. 提交後, 數據被永久保存, 不能進行回滾.oracle
commit;ide |
b) 回滾, 當事務執行出現故障時, 應該進行事務的回滾操做, 本次事務的全部操做將被還原, 保證數據庫的一致性.函數
rollback;工具 |
c)設置回滾點 savepoint 測試
insert into emp values(2,'dsfs',3000);
savepoint A;
insert into emp values(3,'oldu',4000);
savepoint B;
delete from emp;
rollback to A;
commit;
須要咱們手動的提交或者回滾
DML語言中的全部操做都是顯示事務。
數據庫自動提交不須要咱們作任何處理,同時也不具有回滾性。
DDL、DCL語言都是隱式事務。
create table dept
( deptno number(2),
dname varchar2(14),
loc varchar2(2) );
用戶表:
由用戶建立和維護的表的集合。
包含用戶信息。
數據字典:
由oracle服務器建立和維護的表的集合
包含數據庫信息
查看本用戶所擁有的表的名稱
select table_name
from user_tables;
查看本用戶所擁有的不一樣的對象類型
select distinct object_type
from user_objects;
查看本用戶所擁有的表、視圖、同義詞、和序列
select * from
from user_catalog;
create table dept as select employee_id,last_name,salary,hire_date from employees e where e.department_id=80;
alter table語句能夠修改表的信息。
添加一個新列
修改一個已存在的列
刪除一個列
alter table table
add ( column datatype [default expr][,column datatype]....);
alter table dept add(salary number(8,2))
修改數據數據類型
alter table dept modify(dname varchar2(40));
修改默認值
alter table dept modify(salary number(8,2) default 1000);
alter table dept80 modify location_id not null;
修改列名
alter table emp rename column dname to name;
刪除一個列
alter table table
drop colum [ziduan];
修改表以下
rename dept80 to dept90;
特色:
1.直接將全部的數據刪除,可是表結構是留着的。
2.在截斷表時不能指定條件。
3.截斷表是隱式事務。
truncate table dept90
drop table dept90;
非空約束(NOT NULL)
惟一性約束(UNIQUE)
主鍵約束(PRIMARY KEY)
外鍵約束(FOREIGN KEY): 在列和引用表的一個列之間創建而且強制一個外鍵關係
用戶自定義約束(CHECK)
建立一個約束:在建立表的同時,或者在建立表以後均可以定義約束。能夠給約束起名字,可是約束名不能相同,必須是惟一的。若是沒有爲約束起名字,oracle服務器會將默認格式SYS_Cn產生一個名字,這裏n是一個惟一的整數,因此約束名是惟一的。
create table dept80(
id number,
name varchar2(20) not null,
salary number constraint dept_80_notn not null);
)
create table(
employee_id number(6),
last_name varchar2(25) not null,
email varchar2(25),
salary number(8,2),
commission_pct number(2,2)
hire_date date not null,
....
constraint emp_email_uk unique(email);
)
create table dept90(id number constraint dept90_uk unique, name varchar2(20));
alter table dept90 modify(name unique);
create table department(
department_id number(4),
department_name varchar2(30),
CONSTRAINT dept_name_nn not null,
manager_id number(6),
location_id number(4),
CONSTRAINT dept_id_pk primary key(department id);
);
create table dept70(id number constraint dept70_pk primary key);
alert table dept60 modify(id constraint dept60_pk primary key);
兩個列的主鍵定義方式
create table dept50(id number,name varchar2(20),constraint dept50_pk primary key(id,name));
create table employee(
employee number(6),
last_name varchar2(25),
email varchar2(25),
salary number(8,2),
......
department_id number(4),
constraint emp_dept_fk foreign key (department_id)
references departments(department_id),
constrant emp_email_uk unique(email);
)
alter table dept50 add(constraint dept50_fk foreign key(d_id)references dept60(id));
...salary number(2)
constraint emp_salary_min
check(salary>0)....
create table dept30 (id number,salary number(8,2) constraint dept30_ck check(salary>1000));
alter table dept50 add(constraint dept50_ck check(d_id>1000));
select constraint_name ,cnstraint_type,
search_condition
from user_constraints
where table_name='EMPLOYEES';
alter table employee disable constraint emp_emp_id_pk cascade ;
alter table dept40 disable constraint dept40_ck;
alter table dept60 disable constraint dept60_pk cascade;
使用級聯操做會使被操參照的外鍵約束也失效;
alter table employees
enable constraint emp_emp_id_pk;
alter table dept40 enable constraint dept40_ck;
能夠經過建立表的視圖來表現數據的邏輯子集或者數據的組合。視圖是基於表或另外一個視圖的邏輯表,
一個視圖並不包含它本身的數據,它像一個窗口,經過該窗口能夠查看或改變表中的數據。視圖基於其上的表稱爲基表。
視圖限制數據的訪問,由於視圖可以選擇性的顯示錶中的列。
視圖能夠用來構成簡單的查詢以取出複雜查詢的結果。例如,視圖能用於從多表查詢信息,而用戶沒必要知道怎樣寫鏈接語句。
視圖對特別的用戶和應用程序提供數據獨立性,一個視圖能夠從表中取回數據。
簡單視圖和複雜視圖
特性 | 簡單視圖 | 複雜視圖 |
表的數目 | 一個 | 一個或者多個 |
包含函數 | 無 | 有 |
包含數據分組 | 無 | 有 |
經過視圖進行DML操做 | 是 | 不容許 |
視圖有兩種分類:簡單和複雜,基本區別涉及DML(insert、update和delete)操做。
數據僅來自一個表
不包括函數或數據分組
能經過視圖執行DML操做
數據來自多個表
包含函數或者數據分組
不容許經過視圖進行DML操做
create view empvu80
as select employee_id,last_name,salary
from employees
where department_id=80;
建立一個視圖,視圖中包含部門id爲80的員工的id,名字以及薪水。
create view empvu80
as select employee_id,last_name,salary
from employees
where department_id=80;
若是在建立視圖的查詢語句中包含有列別名,那麼列別名將做爲視圖的別名。
建立一個視圖,包含部門id爲50的員工id使用ID_NVMBER命名該列,包含員工名字使用name命名該列,包含員工的年薪使用ANN_SALARY命名該列。
create view emp50 as select e.employee_id id_number,e.last_name,12*e.salary ann_salary from employee e;
1.7從視圖中取回數據
示例一:
查詢部門id爲80的員工信息,包含他們的id,名字以及薪水。
select * from emp80;
實例二:
查詢部門id爲50的員工信息,包含他們的id和薪水。
select e.id_number, e.ann_salary from emp50 e;
不能查詢視圖中未包含的列。
create view dept_sum_vu
(name,minsal,maxsal,avgsal)
as( select d.department_name,MiN(e.salary),
MAX(e.salary),AVG(e.salary)
from employees e, departments d
where e.department_id=d.department_id
group by d.department_name;
建立一個視圖,包含每一個部門的部門名稱,部門最低薪水、部門最高薪水以及部門的平均薪水。
select d.department_name,min(e.salary) min,max(e.salary) max,avg(e.salary) avg from employees e ,departments d where e.department_id=d.department_id group by d.department_name;
1.9.1示例
建立一個視圖,包含每一個部門的部門名稱、部門最低薪水、部門最高薪水以及部門的平均薪水。將部門名稱爲 name 、最低薪水命名爲minsal、最高薪水命名爲 maxsal 、平均薪水命名爲avgsal。
加別名1
create view dept_name as select d.department_name,min(e.salary) min,max(e.salary) max,avg(e.salary) avg
from employees e ,departments d
where e.department_id=d.department_id
group by d.department_name;
加別名2
create view dept_name1 (name,minsal,maxsal,avgsal)as select d.department_name,min(e.salary) ,max(e.salary),avg(e.salary)
from employees e ,departments d
where e.department_id=d.department_id
group by d.department_name;
若是視圖中 包含下面的部分 就不能修改數據:
組函數
groupby 子句
distinct關鍵字
用表達式定義的列
刪除emp80視圖中僱員ID爲100的僱員。
create or replace view empvu10
(employee_number, employee_name,job_title)
as select employee_id, last_name ,job_id
from empoyees
where department_id=10
with read only;
建立一個簡單視圖、包含employees表中的全部數據,單該視圖拒絕DML操做。
create view v_emp as select * from employees with read only;
drop view view
刪除視圖不會丟失數據,由於視圖是基於數據庫中的基本表的。
示例
刪除名稱爲emp90的視圖。
1.14.1什麼是內建視圖
內建視圖是一個帶有別名(或者相關名)的能夠在sql語句中使用的子查詢
一個主查詢的在from子句中指定的子查詢就是一個內建視圖。
內建視圖:內建視圖由位於from子句中命名了別名的子查詢建立。該子查詢定義一個能夠在主查詢中引用數據源。
示例:
顯示那些僱員低於他們部門最高薪水的僱員的名字、薪水、部門號和他們部門最高的薪水。
select em.last_name,em.salary,em.department_id ,e.maxsal
from employees em ,(select e. department_id , max(e.salary) maxsal from
employees e group by e.department_id) e
where em.department_id=e.department_id
em.salary<e.maxsal;
1.15Top-N分析
1.15.1什麼是「TOP-N」分析
top-n 查詢在須要基於一個條件,從表中顯示最前面的n條記錄或最後的n條記錄是有用的。該結果能夠用於進一步分析,例如,用top-n分析你能夠執行下面的查詢類型。
1.15.2執行top分析
top-n查詢使用一個帶有下面描述的元素的一致的嵌套查詢結構:
子查詢或者內建視圖產生數據的排序列表,該子查詢或者內建視圖包含order by 子句來確保排序以想要的順序排序。爲了取回最大值,須要用desc參數。
在最後的結果集中用外查詢限制行數。外查詢包括下面的組成部分:
--rownum 僞列,它爲從子查詢返回的每一行指定一個從1開始連續的值
--一個where子句,它指定被返回的行,外where子句必須用一個<或者《=操做。
工資最高的三我的。
select rownum ,last_name,salary from(select last_name,salary from employees order bysalary desc) where rownum <=3;
當查詢的結果集數據量過大時,可能會致使各類各樣的問題發生,例如,服務器資源被耗盡,因數據傳輸量過大而使處理超時,等等。最終都會致使查詢沒法完成。解決這個問題的一個策略就是分頁查詢,也就是說不要一次性查詢全部的數據,每次查詢一部分數據。這樣分批地進行處理,能夠呈現出很好的用戶體驗,對服務資源的消耗也不大。
分頁查詢原則:
在內建視圖中經過rownum僞劣值的判斷來指定獲取數據的數量。
1.16.2示例。
查詢僱員表中數據,每次只返回10條數據。
select * from (select rownum rn,e.* from employees e)em where em.rn >=1 and em.rn<=10;
select * from (select rownum rn,e.* from employees e)em where em.rn between 11 and 20;
2.1什麼是序列
序列是用戶建立的數據庫對象,序列會產生惟一的整數。序列的一個典型的用途是建立一個主鍵的值,它對於每一行必須是惟一的。序列由一個oracle內部程序產生並增長或者減小。
序列是一個節省時間的對象,由於它能夠減小應用程序的代碼量。序列號獨立於表被存儲和產生,所以,相同的序列能夠被多個表使用。
2.2建立序列
2.2.1經過ddl語句建立序列
create sequence sequencce
[increment by n]
[start with n]
[{maxvalue n| nomaxvalue}]
[{minvalue n | nominvalue}]
[{cycle | nocycle}]
[{cache n|nocache}];
在語法中:
squence是序列發生器的名字
increment by n 指的是序列號之間的間隔,在這兒 n是一個整數(若是該子句被省略,序列量爲1)
start with n 指的是要產生的第一個序列數(若是該子句被省略,序列從1開始)
maxvalue n 指定序列能產生的最大值
nomaxvalue 對於升序序列指定10^27爲最大值,對於降序序列指定-1爲最大值(這裏是默認選項)
minvalue n 指定最小序列值
nominvalue 對於升序序列指定1爲最小值,對於降序序列指定-(10^27)爲最小值
cycle|nocycle指定序列在達到它的最大或者最小值以後,是否繼續產生(nocycle是默認選項)
cache n|nocache 指定oracle服務器預先分配多少值,而且在內存中(默認狀況下,oracle服務器緩衝20個值)
cteate sequence dept_seq increment by 10 start with 120 maxvalue 9999 nocache nocycle;
select sequence_name min_value,max_value,increment_by,last_number
from user_sequences;
NEXTVAL和curral僞列
nextval返回下一個可用的序列值,它每次返回一個惟一的被引用值,即便對於不一樣的用戶也是如此。
currval獲取當前的序列值
在currval獲取一個值之前,nextval對該序列必須發佈
select test_seq.currval from dual;
在location ID2500中插入一個新的部門名稱support。
insert into departments(department_id,department_name,location_id)
values(dept_seq.nextval,'Support',2500);
alter sequence dept_deptid_seq
increment by 20
maxvalue 9999999
nocache
nocycle;
必須是被修改序列的全部者,或者有alter權限。
用alter sequence 語句,只有之後的序列數會受到影響。
用alter sequence語句,startwith選項不能被改變。爲了以不一樣的數從新開始一個序列,該序列必須被刪除和從新建立。
將dept_seq序列中的增加量修改成20,最大爲999999.
alter sequence dept_seq increment by 20 maxvalue 999999 nocache nocycle
drop sequence dept_deptid_seq;
2.4.3.1示例
刪除dept_seq序列。
在關係型數據庫中,索引是一種單獨的、物理的對數據庫表中一列或者多列的值進行排序的一種存儲結構,它是某個表中一列或者若干列的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。索引的做用至關於圖書的目錄,能夠根據目錄中的頁碼快速找到所須要的內容。
索引提供對錶中行的直接和快速訪問。它的目的是用已索引的路徑快速定位數據以減小磁盤I/O。索引由oracle服務器自動使用和維護,索引邏輯的和物理的獨立於他們索引的表,這意味着索引能夠在任什麼時候候被建立或者刪除,而且不影響基表或其餘的索引。
當刪除表時,相應的索引也被刪除。
惟一性索引:當你在一個表中定義一個列爲主鍵,或者定義一個惟一建約束時oracle服務器自動建立該索引,索引的名字習慣上是約束的名字。
非惟一性索引:由用戶建立,例如,能夠建立一個foreign key列索引用於一個查詢中的鏈接來改進數據取回的速度。
自動:在一個表的定義中,當定義一個primary key或者unique約束時,一個惟一索引被自動建立
手動:用戶可以在列上建立非惟一的索引來加速對行的訪問。
過多也是壞事。
在表上創建更多的索引並不意味着更快地查詢,在帶索引地表上被提交地每一個dml操做意味着索引必須跟新:與表聯繫地索引越多,對oracle數據庫地影響越大,oracle數據庫每次dml操做以後必須跟新全部的索引。
表很小
不常常在查詢中做爲條件被使用的列
大多數查詢指望取回多於表中百分之2到4行
表常常被更新
被索引的列做爲表達式的一部分被引用
oracle的非惟一性索引:單行索引,複合索引(組合索引),函數索引
create index index on
table (column[,column]......)
3.5.2.1.1示例
爲employees表中的last_name建立一個索引並命名爲emp_index。
create index emp_index on employees(last_name);
3.5.2.2.2示例
爲departments表建立一個包括manager_id與location_id複合索引並命名爲dept_man_loc。
create index dept_man_loc on departments(manager_id,location_id);
爲department表中的department_name建立一個帶有大寫函數的索引dept_upper2。
create index dept_upper2 on departments(upper(department_name));
3.5.3查詢索引
USER_INDEXES數據字典視圖包含索引和它惟一的名字。
USER_IND_COLUMNS視圖包含索引名、表名和列名。
select ic.index_name ,ic.column_name,
ic.column_position col_pos, ix.uniqueness
from user_indexes ix, user_ind columns ic
where ic.index_name=ix.index_name
and ic.table_name='EMPLOYEES',
select ic.index_name,ic.column_name,ic.column_position,in.uniqueness from user_indexes ix ,user_ind_columns ic where ix.index_name=ic.index_name and ic.table_name=''departments;
drop index index;
3.5.4.1示例
刪除名稱爲dept_upper的索引。
drop index dept_upper。
同義詞能夠除去對象名必須帶的方案限制,並提供給你一個可替換表名、視圖名、序列名和存儲過程名或者其餘對象名。
該該方法對具備特別長的對象的名字頗有用。
create sysnonym d_sum
for dept_sum_vu;
create synonym dep for departments;
drop synonym dep;
oracle用戶是來鏈接數據庫和訪問數據庫對象的。
須要具有建立用戶的權限可使用sys或者system用戶來建立新用戶。
create user user
indentified by password
建立一個用戶名稱爲u_test,永久表空間使用oracle默認的永久表空間。
create user u_test identified by oracle;
create user u_wq identified by oracle default tablespace wq /(temporary tablespace);
5.2.2.1示例
drop user u_test;
刪除用戶的同時將該用戶下的其餘對象一併刪掉。
drop user u_test cascaed;
grant ... 授予用戶權限
revork 撤銷用戶權限
grant create session,create table,
create sequence,create view
to scott;
create session
create table
create sequence
create procedure
unlimited tablespace
爲u_wq用戶分配建立表、視圖、建立序列權限以及使用永久表空間權限。
grant create table,create view ,create sequence to u_wq;
grant unlimited tablespace to u_wq;
revoke權限from 用戶
2.1示例
revoke create table from u_wq;
撤銷u_wq用戶建立表的權限
revoke create table from u_wq;
角色是命名的能夠授予用戶的相關權限的組,該方法使得授予、撤回和維護權限容易的多。
一個用戶可使用幾個角色,而且幾個用戶也能夠被指定相同的角色。
3.2.1建立角色
create role manager;
建立一個名稱爲manager的角色。
grant create table ,create view to manager;
向manager角色中添加會話,建立表、視圖、建立序列。
grant create session,create table,create view ,create sequence to manager;
grant manager to dehann ,kochhar;
3.2.3.1示例一
建立一個名稱爲wq用戶密碼爲wq。該用戶使用表空間wq。
create user wq identified by wq default tablespace wq;
3.2.3.2示例二
爲用戶分配能夠無限制的使用永久表空間
grant unlimited tablespace to wq;
3.2.3.3示例三
將manager角色分配給wq用戶。
grant manager to wq;
3.2.3.4示例四
在wq用戶中建立一個測試表,包含一個id列類型爲整數類型。
create table test(id number);
3.2.4.1示例
撤銷wq用戶的manager角色。
revoke manager from wq;
執行計劃是一條查詢語句在oracle中執行過程訪問路勁的描述。
基數(Cardinality):oracle估計的當前操做的返回結果集行數
字節(Bytes):執行該步驟後返回的字節數。
耗費(COST)、cpu耗費:oracle估計的該步驟的執行成本,用於說明sql執行的。
time(Time):oracle估計的當前操做所需的時間
經過工具啓動執行計劃。選中須要查看執行計劃的查詢語句,在工具欄中選擇
Tools---->Explain Plan或者F5
縮進最多的最早執行:(縮進相同時,最上面的最早執行)。
TABLEACCESS FULL(全表掃描)
TABLEACCESS BY INDEX ROWID(經過rowid的表存取)
TABLEACCESS BY INDEX SCAN(索引掃描)
oracle會讀取表中全部的行,並檢查每一行是否知足sql語句中的where限制條件
使用建議,數據量太大的表不建議使用全表掃描,除非自己須要取出的數據較多,佔到表數據總量的5-10%以上。
5.2.2.1什麼是ROWID
ROWID是oralce自動加在表中每行最後的一列僞列,就說明表中並不會物理存儲ROWID的值。
你能夠像使用其餘列同樣使用它,只是不能對該列的值進行增刪改查操做。
一旦一行數據插入後,則其對應的ROWID在該執行聲明週期內是惟一的,即便發生行遷移,該行的ROWID值也不變。
行的rowid指出了該行所在的數據文件、數據塊以及行在該塊中的位置,因此經過rowid能夠快速定位到目標數據上,這也是oracle中存取單行數據最塊的方法。
1.掃描索引獲得對應的rowid。
2.經過rowid定位到具體的行讀取數據。
index unique scan (索引惟一掃描)
index range scan(索引範圍掃描)
index full scan(索引全掃描)
index fast full scan(索引快速掃描)
index skip scan(索引跳躍掃描)
5.2.4oracle的優化器
5.2.4.1oracle的優化器種類
RBO(Rule-Based Optimization) 基於規則的優化器
CBO(Cost-Based Optimization)基於代價的優化器