Oracle SQL(Oracle 9i 9.2.0.1.0)
?
SQL(
結(jié)構(gòu)化查詢語言)
,是操作關(guān)系型數(shù)據(jù)庫中的對象。
DDL
(數(shù)據(jù)定義語言),用于建表或刪表操作,以及對表約束進(jìn)行修改。
DML
(數(shù)據(jù)操作語言),向表中插入紀(jì)錄,修改紀(jì)錄。
事務(wù)控制語言,commit; rollback;
授權(quán)語句
?
select(數(shù)據(jù)的查詢),投影,過濾(選擇)查尋,關(guān)聯(lián)查尋(表連接)。
?
sqlplus 訪問數(shù)據(jù)庫命令(本地訪問/遠(yuǎn)程訪問),和數(shù)據(jù)庫建立連接的命令,是數(shù)據(jù)庫操作的環(huán)境
sqlplus 用戶名/密碼
?
show user 顯示當(dāng)前用戶的用戶名
?
在sqlplus中可以使用 ! 可以在shell和sqlplus間切換,!shell命令 可以在sqlplus中使用shell命令。實(shí)際上是sqlplus開了子進(jìn)程來執(zhí)行shell命令。
?
Oracle數(shù)據(jù)庫中的表分兩類:用戶表(用戶使用操作的表),系統(tǒng)表(數(shù)據(jù)庫系統(tǒng)維護(hù)的表,數(shù)據(jù)字典)
?
select
查詢語句
select table_name from user_tables;(查詢系統(tǒng)表)
以上的查詢語句就是查詢本用戶下所擁有的所有表的表名。
?
desc [表名] 這是一條sqlplus命令,注意他不是sql語句,這條命令用于查看表的結(jié)構(gòu)。
[字段名] [字段的類型],這是使用完desc命令后顯示的表結(jié)構(gòu)。
?
投影操作,只查看選擇的字段的信息。
選擇操作,查看字段中的特定某些信息。
多表查詢,通過表間連接,查尋出多表中的信息
?
!oerr ora [
錯誤號] ,系統(tǒng)可以顯示錯誤的原因和如何修改。
如果命令錯誤輸入可以使用edit或ed來修改輸入錯誤。實(shí)際上是在編輯緩存文件中的最后一條sql語句。也可以使用 (change) c /錯誤字段/正確字段,來進(jìn)行替換操作進(jìn)行修改。
?
select [表的字段名1],[表的字段名2], ... from 表名;
select * from 表名; 查尋表中所有字段的信息
?
關(guān)鍵字不等拆分,sql語句,以及表名,字段名是大小寫不敏感的。
sql語句要以";"結(jié)尾,來表示sql語句結(jié)束,如果不加";"系統(tǒng)不會執(zhí)行此條sql語句,并提示。
sqlplus的buffer中會緩存最后一條sql語句,可以使用"/"來執(zhí)行這最后一條sql語句,也可以使用
edit命令來編輯最后一條sql語句。l命令(list)(sqlplus命令)可以顯示buffer中最后一條命令。
?
sqlplus
設(shè)置
set pause on 回車響應(yīng),分屏顯示,只在本會話中有效
set pause off 關(guān)閉分屏顯示。
set pause '...' 設(shè)置分屏顯示的提示信息。
set pause on 先輸出提示信息,回車響應(yīng),分屏顯示
set head off 提頭輸出關(guān)閉
set feed off 結(jié)尾輸出關(guān)閉
set echo off 回寫關(guān)閉
spool 文件名.sql 寫入指定文件
spool off 關(guān)閉寫入。
?
清屏命令 !clear 或 clear screen
?
在Oracle中字符顯示是左對齊,數(shù)值右對齊。
?
在select 語句中可以使用數(shù)學(xué)表達(dá)式。
?
select [表達(dá)式(必須包含本表字段名)],[...],.... from 表名;
運(yùn)算的優(yōu)先級的先乘除后加減,同級自左向右運(yùn)算,括號改變優(yōu)先級。
?
select [字段名或表達(dá)式] ["別名"],[...] ["..."],.... from 表名;
?
可以通過在字段名或表達(dá)式后加空格"別名",可以給列,或者表達(dá)式結(jié)果其別名。
字符串拼接使用||符號
?
select 目標(biāo)字段名||" "||目標(biāo)字段名 from 表名;
注意:在Oracle中的字符串要用'..'包含
別名中需要使用空格,或是大小寫敏感時需要用".."包含。
?
sql
腳本,也就是在文件中寫有sql語句的文件,可以在sqlplus中運(yùn)行,推薦為.sql。
引入sql腳本: sqlplus 用戶名/密碼 @sql腳本(注意@前一定要有空格,否則含義就變了)
Oracle中的空值 空值會當(dāng)無窮大處理。
Oracle中控制處理函數(shù) NVL(字段名,值),這個字段中的空值替換為指定值,如果不為空,則會返回其原值。
例:select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;
?
distinct
關(guān)鍵字,去掉重復(fù)行(這個關(guān)鍵字會處發(fā)排序操作)
例: select distinct dept_id,title from s_emp;
注意:distinct,關(guān)鍵字之后會對from之前的字段進(jìn)行排重操作。
column
命令(這是個sqlplus命令)
column命令 列格式的定義
?
column 目標(biāo)列名 查看這個類是否定義了格式
?
column 目標(biāo)列名 format a.. 設(shè)置列寬。
column last_name heading 'Employee|Name'(設(shè)置題頭) FORMAT A15
這其中的'|'是換行符
?
column salary justify left format $99,990.00(定義數(shù)字顯示格式)
注意:如果不滿足顯示的格式,就會把數(shù)據(jù)顯示為"#"
?
column 列名 clear (清除列格式定義)
?
注意:只有sqlplus命令才有簡寫,并且在使用sqlplus命令時結(jié)尾也不能加分號。
?
選擇操作
?
order by 排序子句 ASC(默認(rèn),升序) DESC(降序)
?
order by 目標(biāo)列名(別名) 排序順序(不寫排序順序,會默認(rèn)為升序排序)
?
例:select first_name from s_emp order by first_name;
??? select first_name from s_emp order by first_name desc;
?
注意:升序空值在結(jié)果的末尾,降序空值在結(jié)果的最前面。
?
where
子句
?
where子句使用在 select ... from ... 后面,用來選擇所需(符合條件的)的記錄
?
where后面跟的是表達(dá)式 也就是 XXX=XXX, XXX between X and X?,XXX in(X,X,X)
like '...' 通配查詢
?
between ... and ... ,表示結(jié)果在這之間,between and是一個閉區(qū)間。
!=,<>,^=,這三個都標(biāo)識不等于,<=,>=,=,這些運(yùn)算符都可以使用。
... in (va1,val2,...) 判斷結(jié)果是否在這個枚舉中存在
like '...' 字符串通配查詢,'%'表示多個字符,'_',表示一個字符。
... and ... 表示只有兩個條件同時滿足
... or ... 表示條件只要滿足其中只一就可以
all ... 是要求都滿足條件。
not .....,則是可以與以上的條件產(chǎn)生反效果。
... is null 使用來判斷值是不是空。
注意:Oracle中的字符串是嚴(yán)格區(qū)分大小寫的。
?
1.注意數(shù)據(jù)類型
2.選擇合適的運(yùn)算符
?
Oracle
數(shù)據(jù)庫函數(shù)(單行函數(shù))
?
Oracle中的函數(shù)和C中的函數(shù)差不多,也是有函數(shù)名,參數(shù)表,和返回值類型組成的
?
1,字符函數(shù)
?? 字符是大小寫敏感的
?? 轉(zhuǎn)小寫 lower(...)
?? 轉(zhuǎn)大寫 upper(...)
?? 首字母大寫 initcap(...)
?? dual表,是專門用于函數(shù)測試和運(yùn)算的,他只有一條記錄?????
?? 字符串拼接 concat(...,....)
?? 求指定子串 substr(...,起始位置,取字符個數(shù))
?? 可以使用"-"表示從右向左取,取的時候可以從左往友取。
??? 例:select substr(first_name,-2,2) sub from s_emp;(取后兩個)
?????? select substr(first_name,2,2) sub from s_emp;(取前兩個)
2,數(shù)值函數(shù)
?? 四舍五入 round(數(shù)據(jù),保留小數(shù)點(diǎn)后幾位)
?? 可以用負(fù)數(shù)表示小數(shù)點(diǎn)前,0,表示小數(shù)點(diǎn)后第一位,也就是保留個位,-1表示個位(保留到十?? 位)。
?? 例:select round(15.36,1) from dual;
?? 截取數(shù)字函數(shù) trunc(數(shù)據(jù),保留的位數(shù)(小數(shù)點(diǎn)后位數(shù))) 截取個位之后補(bǔ)0
?? 例:select trunc(123.456,1) from dual;
3,日期函數(shù)
?? 日期格式,
?? 全日期格式 世紀(jì)信息,年月日,時分秒。
?? 缺省日期格式,日-月-年 dd-mon-rr
?? 修改當(dāng)前會話的日期格式,會按照指定的格式輸出日期
?? alter session set nls_date_format='yyyy mm dd hh24:mi:ss';
?? 返回當(dāng)前日期 sysdate
?? 例:select sysdate from dual;
?? 日期是格式敏感的
?? 求兩個日期間相隔了多少個月 months_between(date1,date2)
?? 加減指定數(shù)量的月份 add_months(date,月數(shù)),月數(shù)可以為負(fù),負(fù)值就是減去相應(yīng)的月數(shù)。
?? 從下周開始的日期加一天 next_day(date,天數(shù))
?? 例:select next_day(sysdate,2) from dual;
?? 返回月末的日期 last_day(date)
?? 截取日期 trunc(date,'年或月或日或時分秒')
?? 例:select trunc(add_months(sysdate,1),'month') from dual;
?
4,不同數(shù)據(jù)類型間轉(zhuǎn)換函數(shù)
?? 將日期轉(zhuǎn)成字符 tochar(date,'日期格式')
?? 日期格式要用有效格式,格式大小寫敏感 'yyyy mm dd hh24:mi:ss','year'(全拼的年),'mm'(數(shù)字表示的月) 'month'(全拼的月),'day'(星期的全拼),'ddspth' (日期的全拼) 'yy mm dd'
?? 例:select to_char(sysdate,'yyyy mm dd hh24:mi:ss')from dual;
?? 將字符轉(zhuǎn)換成數(shù)字 to_number('...')
?? 將數(shù)字轉(zhuǎn)字符to_char(number,'fmt') fmt是數(shù)字格式
?? 將字符串轉(zhuǎn)成日期 to_date('...','日期格式')
?? 例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
5,函數(shù)嵌套
例:select to_char(to_date('2006 11 03','yyyy mm dd'),'dd-month-yy') from dual;
?
表連接(關(guān)聯(lián)查尋)
如果多表查詢時不加where子句,也就是過濾條件或者是使用了無效的條件,就會產(chǎn)生兩表之間記錄的相互逐條匹配(組合),產(chǎn)生很多無效的結(jié)果(笛卡爾積)。
注意:在使用表連接時,要注意查詢的表間的關(guān)系信息,表之間的字段所表示的信息的關(guān)系
等值連接
?select [表別名1.字段名1],[表別名2.字段名2],...
?from 表1 表別名1 ,表2 表別名2
?where 表別名1.字段名3=表別名2.字段名4;
?表連接時,當(dāng)表與表之間有同名字段時,可以加上表名或表的別名,加以區(qū)分,使用時要用
表名.字段名或表別名.字段名(列名)。當(dāng)表的字段名是唯一時,可以不用加上表名或表的別名。
注意:當(dāng)為表起了別名,就不能再使用表名.字段名
例:select a.first_name,a.last_name,b.name from s_emp a,s_dept b where a.dept_id=b.id;
?
非等值連接
?select [表別名1.字段名1],[表別名2.字段名2],...
?from 表1 表別名1 ,表2 表別名2
?where 表別名1.字段名3 ..... 表別名2.字段名4
?....可以使比較運(yùn)算符,也可以使其他的除了'='的運(yùn)算符
例:select e.ename, d.grade,e.sal from emp e,salgrade d where e.sal between d.losal and d.hisal;
?
自連接 用別名把一張表中的數(shù)據(jù)分成兩部分,然后在使用條件過濾。
?select [表別名1.字段名1],[表別名2.字段名2],...
?from 表1 表別名1 ,表1 表別名2
?where 表別名1.字段名3=表別名2.字段名4;
例:select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id;
以上所提到的表連接,都叫做內(nèi)連接。
?
?
外連接 會使用一方表中的所有記錄去和另一格表中的記錄按條件匹配,空值也會匹配,這個表中的所有記錄都會顯示,數(shù)據(jù)庫會模擬出記錄去和那些不匹配的記錄匹配。
例:select a.first_name enamei,a.id,b.first_name cname,b.id from s_emp a,s_emp b where a.manager_id=b.id(+);
注意:要把那一方的記錄全部都顯示出來,還有注意條件(+)跟在要全部顯示的那個表的字段后。
?
組函數(shù)
group 組
group by 分組子句,按指定的分組規(guī)則分組 ,這個group by 子句可以跟在 select 語句后或是 having后面。group by子句也會出發(fā)排序操作,會按分組字段排序。
?
select [組函數(shù)或分組的字段名] ,... from 表名 group by [字段名1],[字段名2],.....;
例:select avg(salary) from s_emp group by dept_id;
?
注意:組函數(shù)可以處理一組數(shù)據(jù),返回一個值。組函數(shù)會忽略空值。count()除外,他會把空記錄也記錄在內(nèi)。
?
avg(..),求平均值,sum(..),求和 這兩個函數(shù)的參數(shù)只能是number型的。
?
以下所提到的函數(shù)可以使用任意類型做參數(shù)。
count(..),用來統(tǒng)計(jì)記錄數(shù),可以使用排重命令。count(...)默認(rèn)使用的是all。
max(..),min(..)求最大值和最小值,
count(*),統(tǒng)計(jì)表中記錄數(shù)。
例:select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id;
注意:只要寫了group by子句,select后就只能用group by后的字段或者是組函數(shù)。
????? where子句只能夠過濾記錄。
having子句可以過濾組函數(shù)結(jié)果或是分組的信息,且寫在group by子句后。
例:
?select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id having sum(a.salary)>4000;
?
column 也可以定義有別名的列的格式。
column "別名" 格式定義
注意:要先過濾掉不需要的記錄,然后再進(jìn)行分組操作,提高效率。
?
子查詢
子查詢,就是可以嵌在任何的sql語句中的select語句。
?
在select語句中嵌套子查詢時,會先執(zhí)行子查詢。一般的會將子查詢放在運(yùn)算符的右邊。
?
注意:在使用子查詢時,要注意這個運(yùn)算符是單行的(也就是只能是單值),還是多行運(yùn)算符(范圍,多值)。配合使用子查詢返回的結(jié)果必須符合運(yùn)算符的用法。
例:
select first_name,title from s_emp where title=any(select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';
?
select first_name,title from s_emp where title in (select title from s_emp where last_name='Smith') and upper(last_name)!='SMITH';
?
數(shù)據(jù)庫設(shè)計(jì)
?
數(shù)據(jù)庫表設(shè)計(jì),把業(yè)務(wù)需求轉(zhuǎn)換成可操作的表。
1,需求分析,了解客戶的業(yè)務(wù)需求(業(yè)務(wù)技能)。
2,設(shè)計(jì),通過ER圖(實(shí)體關(guān)系圖)
3,建表
4,測試
5,形成產(chǎn)品
?
ER
圖
將一類事物的共性抽象處來成為一個實(shí)體,并且表現(xiàn)出來實(shí)體間的關(guān)系。
unique identifier 唯一的值
primary with???? '#*' 唯一且非空
indispensable 必要的(也就是要求必須非空)
?
實(shí)體關(guān)系
one to one 一對一關(guān)聯(lián),one to many 一對多關(guān)聯(lián),many to many 多對多關(guān)聯(lián)
反射關(guān)聯(lián),自身的屬性之間的關(guān)聯(lián)
?
ER
圖轉(zhuǎn)換成表
?
?
第一范式,所有的屬性都必須是單值,也就是屬性只表示單一的意義。(記錄可以重復(fù),沒有任何限制)
第二范式,屬性要求唯一且非空,(記錄不可重復(fù),但是數(shù)據(jù)可能會出現(xiàn)冗余)。
第三范式,非主屬性只能依賴于主屬性,不能依賴于其他非主屬性。(解決數(shù)據(jù)冗余問題)
?
約束
約束是針對表中的字段進(jìn)行定義的。
?
primary key (主鍵約束 PK)保證實(shí)體的完整性,保證記錄的唯一
主鍵約束,唯一且非空,并且每一個表中只能有一個主鍵,有兩個字段聯(lián)合作為主鍵,只有兩個字段放在一起唯一標(biāo)識記錄,叫做聯(lián)合主鍵。
?
foreign key (外建約束 FK)保證引用的完整性,
外鍵約束,外鍵的取值是受另外一張表中的主鍵或唯一值得約束,不能夠取其他值,只能夠引用主鍵會唯一鍵的值,被引用的表,叫做parent table(父表),引用方的表叫做child table(子表),要想創(chuàng)建子表,就要先創(chuàng)建父表,后創(chuàng)建子表,記錄的插入也是如此,先父表后子表,刪除記錄,要先刪除子表記錄,后刪除父表記錄,要修改記錄,如果要修改父表的記錄要保證沒有被子表引用。要刪表時,要先刪子表,后刪除父表。
?
unuque key(唯一鍵),值為唯一
?
index(索引)是數(shù)據(jù)庫特有的一類對象,view(視圖)
典型的一對多 class 對應(yīng)多個學(xué)生。
student table??????????????? ??????class table
?______________________________???? _________________________
| id | name | address| class_id|?? | id |class_desc|class_num|
|(PK)|______|________|___(FK)__|?? |(pk)|__________|_________|
|??? |????? |??????? |???????? |?? |??? |??????? ??|???????? |
?
一對一
?
student tabel???????????? shenfenzheng table
?____________________???? _________________________________
| id | name | address|?? |?s_id?|shenfen_desc|shenfen_num|
|(PK)|______|________|?? |(PK,F(xiàn)K)|____________|___________|
|??? |????? |??????? |?? |??????? |??????????? |?????????? |
?
多對多
?
student tabel???????????? zhongjian table????????????????????? kecheng table
?____________________???? _________________________________??? __________________
| id | name | address|?? |?s_id?|shenfen_desc|shenfen_num|?| kid | kechengname|
|(PK)|______|________|?? |(FK,F(xiàn)K)|____________|___________|?| (PK)|____________|
|??? |????? |??????? |?? |聯(lián)合主鍵|??????????? |?????????? |?|???? |??????????? |
?
引用對方表的主鍵,當(dāng)作本身的主鍵,所以這個表的主鍵,既是主鍵又是外建
?
建表和其他相關(guān)操作
?
DDL
語句
?
創(chuàng)建表:
?? create??? table?表名?? (??? 字段名1??? 類型(數(shù)據(jù)長度)(default ...)?? 約束條件,?? 字段名2??? 類型(數(shù)據(jù)長度)??? 約束條件 );
?
Oracle
數(shù)據(jù)庫中的數(shù)據(jù)類型
varchar(長度),可變長字符串,char(長度) 定長
number(..,..),number 表示浮點(diǎn)數(shù),或者是整數(shù)
long 大對象,clog 字符的大對象,相當(dāng)于文本文件在表中只存放一個相當(dāng)于只針對值
???????????? blog 二進(jìn)制的大對象,也是以相當(dāng)于指針的形式存放的。
primary key約束:
主鍵約束的定義:
第一種定義形式:
create table?? test(c?number?primary key?);???? 列級約束
第二種定義形式:
create table?test(c?number , primary key(c) )?; 表級約束
create table?? test( c1?number?constraints?? pkc1?primary key );?? 此約束有名字:?pkc1
create table?? test(c number , c2?number ,?primary key (c ,c1) ); 用表級約束可以實(shí)現(xiàn)聯(lián)合主鍵
?
foregin?key?? (fk)?? 外鍵約束:
(先定義父表,再定義子表)
carete?? table???? parent(c1 number?primary key );
create?? table??? child?(c?number primary key ,?? c2 number?references parent(c1));
或表級約束定義:
create?? table?child( c number primary key ,?c2?number?, foreign key(c2)?references?parent(c1));
?
約束
?
非空約束(not null)這是一個列級約束
在建表時,在數(shù)據(jù)類型的后面加上 not null ,也就是在插入時不允許插入空值。
?
例:create table student(id number primary key,name varchar2(32) not null,address varchar2(32));
?
unique 唯一約束
?
唯一約束,是會忽略空值的,唯一約束,要求插入的記錄中的值是為一的。
?
例:create table student(id number,name varchar2(32),address varchar2(32),primary key (id),unique (address));
?
check約束
?
檢查約束,可以按照指定條件,檢查記錄的插入。check中不能使用尾列,不能使用函數(shù),不能引用其他字段。
例:create table sal (a1 number , check(a1>1000));
?
創(chuàng)建腳本?? 例:見課本相應(yīng)章節(jié)
?
?
?
一對一建表語句
?
student table
?
create table student(
?????? id number,
?????? name varchar2(32),
?????? address varchar2(32)
?????? primary key(id)
);
?
shenfenzheng table
?
create tabel shenfenzheng(
?????? sid number primary key,
?????? num number unique not null,
?????? foreign key (sid) references student(id)
);
?
一對多
?
class table
一
create table class(
??????? cid number,
??????? class_num number,
??????? desc varchar2(32),
??????? primary key(cid)
);
?
student table
多
create table student(
?????? id number,
?????? name varchar2(32),
?????? address varchar2(32)
?????? class_id number,
?????? primary key(id),foreign key (class_id) references class(cid)
);
?
?
?
?
?
數(shù)據(jù)字典
?
數(shù)據(jù)字典是由系統(tǒng)維護(hù)的,包含的數(shù)據(jù)庫的信息
數(shù)據(jù)字典視圖
user_XXXXX 用戶視圖
all_XXXXX?所有視圖
dba_XXXXX?數(shù)據(jù)庫中所有視圖
v$_XXXXX?? 動態(tài)性能視圖
?
dist或 distionary 表示數(shù)據(jù)字典的數(shù)據(jù)字典。
?
user_constraints 用戶的表中約束的表
其中有constraints_name字段存放的是約束名,r_constraints_name字段表示外鍵引用子何處
這兩個字段之間有自連接的關(guān)系,也就是約束名和外鍵約束名之間的自連接。
?
user_cons_column表,是用戶的列級約束表
?
DML
操作
?
insert
操作,插入記錄
?
insert into 表名 values(值1,值2,......);
注意這種方法插入記錄時,要對所有字段進(jìn)行插入,沒有非空約束時,又不想插入值時,要用空值替代,并且要按照字段的順序插值(要清楚表結(jié)構(gòu)),且要注意數(shù)據(jù)類型一致。
?
insert into 表名(字段名1,字段名2,.....) values(值1,值2,......);
這種方法可以對指定的字段進(jìn)行插入,不想插值的就可以不寫,前提是該字段沒有非空約束。
?
例:insert into student values(1,'xxx','xxx');
??? insert into student(id,name,address) values(1,'xxx','xxx');
?
update
修改操作
?
update table 表名 set?字段名1=數(shù)據(jù)1或表達(dá)式1, 字段名2=數(shù)據(jù)2或表達(dá)式2
[where ....=....];
例:update shenfenzhen set num=99 where sid=2;
?
delete
刪除操作
?
delete from 表名 [where ...=...];
例:update shenfenzhen set num=99 where sid=2;
用delete操作刪除的記錄可以通過 rollback命令回滾操作,會恢復(fù)delete操作刪除的數(shù)據(jù)。
delete操作不會釋放表所占用的空間,delete不是和刪除記錄多的大表。delete操作會占用大量的系統(tǒng)資源。
事務(wù)transaction
?
OLTP(聯(lián)機(jī)事務(wù)處理 OnLine Transaction Process)
原子操作,也就是不可分割的操作,必須一起成功一起失敗。
要是實(shí)現(xiàn)一個原子操作,就要把這個原子操作(操作數(shù)據(jù)庫數(shù)據(jù)(DML操作))放在事務(wù)中。
事務(wù)的結(jié)束動作 就是commit;語句 rollback;語句,DDL,DCL語句執(zhí)行會自動提交commit;。
sqlplus正常退出是會做提交動作的commit;,當(dāng)系統(tǒng)異常推出是,會執(zhí)行回滾操作rollback;。
事務(wù)的開始,一個事務(wù)的開始就是上一個事務(wù)的結(jié)束。
一個沒有結(jié)束的事務(wù),叫做活動的事務(wù) (active transaction),活動的事務(wù)中修改的數(shù)據(jù),只有本會話才能看見。
readcommited,只可以讀取已經(jīng)作提交操作的數(shù)據(jù),本會話可以看到自己的所作的沒有提交的操作。
在活動事務(wù)中,當(dāng)多個用戶同時對同一張表進(jìn)行操作時,會對表加上表級共享鎖,當(dāng)用戶對操作該表某一條記錄進(jìn)行操作時會對該條記錄加上行級排它鎖,只允許一個用戶對該條記錄進(jìn)行DML操作,只有提交操作commit;或回滾操作rollback;時,才可讓其他用戶操作對該記錄進(jìn)行DML操作,也就是釋放了該條記錄的行級排它鎖。如果沒有提交操作或回滾操作,那么該用戶就不能對該條記錄加鎖,該用戶的DML操作就會進(jìn)入等待狀態(tài),但是在對表作drop操作(DDL操作)時,如果還有用戶在操作該表,也就是沒有釋放表級共享鎖,就會直接報(bào)錯。
?
事務(wù)越大,就會消耗更多的資源,并長時間持有事務(wù)會造成無法進(jìn)行其他的操作,事物提交太頻繁的話,會對I/O造成很大的負(fù)擔(dān),所以要合理確定事務(wù)的大小。
?
commit;提交操作,事物的結(jié)束
?
rollback;回滾操作,會將先前的活動事務(wù)中的操作(DML操作)的結(jié)果進(jìn)行回滾,撤銷全部操作,恢復(fù)成事務(wù)開始時的數(shù)據(jù),也就是恢復(fù)成事務(wù)開始時的狀態(tài)。
?
alter table
命令
alter table 命令用于修改表的結(jié)構(gòu)(這些命令不會經(jīng)常用):
?
增加字段:
alter?table 表名 add(字段字,字段類型)
?
刪除字段:
alter tbale 表名 drop column 字段; (8i 以后才支持)
?
給列改名:9.2.0才支持
alter table 表名 rename column 舊字段名 to 新字段名;
?
修改字段
alter table 表名 modify( 字段,類型)
(此時應(yīng)注意的問題,更改時要看具體值情況之間的轉(zhuǎn)達(dá)換, 改為字符類型時,必須要為空)
not null約束是使用alter table .. modify (..,not null),來加上的。
增加約束:
alter table 表名 add constraint [約束名] 約束(字段);
只能夠增加表級約束。
?
解除約束:(刪除約束)
?
alter table 表名 drop 約束;
(對于主鍵約束可以直接用此方法,因?yàn)橐粡埍碇兄挥幸粋€主鍵約束名, 注意如果主鍵此時還有其它表引用時刪除主鍵時會出錯)
?
alter table father drop primary key cascade;?
(如果有子表引用主鍵時,要用此語法來刪除主鍵,這時子表還存在只是子表中的外鍵約束被及聯(lián)刪除了)
?
alter table 表名 drop constraint 約束名;
(怎樣取一個約束名:
a、人為的違反約束規(guī)定根據(jù)錯誤信息獲取!
b、查詢視圖獲取約束名!)
?
使約束失效或者生效
?
alter table?表名?disable from primary key;?(相當(dāng)于把一個表的主鍵禁用)
?
alter table?表名?enable primary key;
(enable 時會自動去檢查表的記錄是不是符合要求,如果有臟數(shù)據(jù)時必須要先刪除臟數(shù)據(jù)才可以 enable)
?
更改表名
rename 舊表名 to 新表名;
?
刪除表:
trucate table 表名;
(表結(jié)構(gòu)還在,數(shù)據(jù)全部刪除,釋放表所占的空間,不支持回退,常用刪除大表)
?
關(guān)于oralce中產(chǎn)生序列(sequence)
create sequence?序列名;
?
(不帶參數(shù)時默認(rèn)為從1 開始每次遞增 1,oracle中為了提高產(chǎn)生序列的效率一般一次性產(chǎn)生20個序列放入當(dāng)前會話的序列池中備用以加快效率,序列會出現(xiàn)不連續(xù)的動作回退操作不會影響序列取值)
?
?
?
sequence
的參數(shù):
increment by n?? 起始值
start with n???? 遞增量
maxvalue n?????? 最大值?
minvalue n?????? 最小值
cycle|no cycle?? 輪回?
cache n????????? 緩存(第一次取時會一次取多少個id存起來)
?
查看sequence 視圖:
desc??? user_sequences ;
select?? sequence_name , cache_size , last_number?from?user_sequences?? where?? sequence_name?like 's_';
select?序列名.currval?from?? dual??? 查看當(dāng)前的序列數(shù)
select?序列名.nextval ?from?? dual??? 查看下一個序列數(shù),它會自動給當(dāng)前的序列加1
為列:nextval????????? currval
(開另一個session時取當(dāng)前值不成功時,應(yīng)該先取下一個值,再取當(dāng)前值)
?
清空當(dāng)前會話的內(nèi)存:
alter system?flush?? shared_pool;(執(zhí)行此命令要有DBA權(quán)限,一般用戶執(zhí)行出錯)
?
修改序列:(此命令不常用,只需了解就行不必深究)
alter?sequence?序列名?修改項(xiàng);
刪除序列sequence
drop sequence 序列名;
?
視圖
?
創(chuàng)建視圖:
creating?views 視圖名;
?
視圖就相當(dāng)于一條select 語句,定義了一個視圖就是定義了一個sql語句,視圖不占空間,使用view 不會提高性能,但是能簡單化sql語句
(擴(kuò)展知識: oracle?8i 以后的新視圖)
MV?物化視圖(占存儲空間,把select 結(jié)果存在一個空間,會提高查詢視圖,增強(qiáng)實(shí)時性,但是存在刷新問題,物化視圖中的數(shù)據(jù)存在延遲問題,主要應(yīng)用在數(shù)據(jù)倉庫中用要用于聚合表)
?
使用視圖的好處:控制數(shù)據(jù)訪問權(quán)限。
?
如何創(chuàng)建一個視圖的例子:
create or replace views test_vi as select * from test1 where c1=1;
?
or replace的意義,如果view存在就覆蓋,不存在才創(chuàng)建。
force|no force ,基表存在是使用,不存在是則創(chuàng)建該表。
此時往表test1(base table 基表)中插入數(shù)據(jù)時:表中沒能變化,視圖中的數(shù)據(jù)發(fā)生改變
從視圖中插數(shù)據(jù)時相對應(yīng)的表會發(fā)生改變:
往視圖中插數(shù)據(jù)時,會直接插進(jìn)基表中,查看視圖中的數(shù)據(jù)時,相當(dāng)于就是執(zhí)行創(chuàng)建時的select語句。
?
限制對數(shù)據(jù)庫的訪問,簡化查詢。
簡單視圖:來自于單表,且select語句中不能包括函數(shù),能進(jìn)行DML操作。
復(fù)雜視圖:來源于多張表,不能執(zhí)行DML操作。
?
視圖的約束
with read only 視圖只讀約束(O)
with check option 不允許插入與where條件不符的記錄,類似于check約束的功能(V)
?
在select from 后也可以使用子查尋,這個寫法也叫做內(nèi)嵌視圖
例:
select first_name,salary,avgsal from s_emp e,(select dept_id,avg(salary) avgsal from s_emp group by dept_id) s where e.dept_id=s.dept_id and e.salary>s.avgsal;
?
刪除視圖 drop views 視圖名;
?
行號(rownum
)
關(guān)于rownum:
rownum?有個特點(diǎn)要么等于1 要么小于某個值, 不能直接等于某個值, 不能大于某個值。
rownum常用于分頁顯示。
rownum只用于讀入內(nèi)存的數(shù)據(jù)。
?
關(guān)于同義詞:
?
同義詞:相當(dāng)于別名的作用(***只需了解***)系統(tǒng)自建的同義詞:
user_tables
?
create synonym asd_s_emp for asd_0606.s_emp ;
目的就是為了給asd_0606_s_emp表起另一個代替的名稱asd.s_emp;注意這個同義詞只能自己使用;
create public synonym?p_s_emp?fro asd_0606.s_emp; 創(chuàng)建公共的同義詞,但是要權(quán)限.
刪除同義詞:
drop?synonym??? 同義詞名稱
?
索引(index
)
?
創(chuàng)建索引:Creating indexes(概念很重要對系統(tǒng)的性能影響非常大)
?
建索引的目的就是為了加快查詢速度。
?
索引就相于一本的書的目錄。索引點(diǎn)系統(tǒng)空間,屬于表的附屬物。刪除一個表時,相對應(yīng)的索引也會刪除。索引是會進(jìn)行排序。
?
truncate 表時索引結(jié)構(gòu)在,但是數(shù)據(jù)不存在。
?
full table scan 全表掃描
用索引就是為了快速定位數(shù)據(jù):(理解時就以字典的目錄為例)
創(chuàng)建索引就是創(chuàng)建key和記錄的物理位置(rowid)組成的鍵值對。索引是有獨(dú)立的存儲空間,但是和表是邏輯關(guān)聯(lián)的,索引和表的關(guān)系是依附關(guān)系,表被刪除了,索引也沒有存在的意義也就被刪除了
?
在建表時會根據(jù)表中的PK或UK自動的建立唯一性索引。
?
查看表的rowid:
select rowid,first_name from s_emp;
rowid 定義的信息有:object block table
?
每條記錄都有自己的rowid
?
索引由誰創(chuàng)建:用戶,建索引后會使DML操作效率慢,但是對用戶查詢會提高效率,這就是我們建索引的最終目的。
?
創(chuàng)建一個索引:
create index 索引名 on 表名 (字段名);
create insex testindex on test(c1, c2);
?
索引分為唯一性索引,聯(lián)合索引。索引中是不會維護(hù)空值的。
?
哪些字段應(yīng)該建索引:創(chuàng)建索引就是為了減少物理讀,索引會減少掃描的時間。
經(jīng)常要用where的子句的地方,所以要用索引.用不用索引,關(guān)鍵要看所查詢的數(shù)據(jù)與所有數(shù)據(jù)的百分比,表越大,查詢的記錄越少,索引的效率就越高.
?
替換變量:用&符號來定義替換變量支持交互性提示,對于字符性的數(shù)字,一定要寫在單引號之間
?
更改交互的提示信息:
accept?p_dname prompt ' 提示信息';
定義變量:
define p_dname='abc';
?
set??? verify on
set??? verify off;
相當(dāng)于開關(guān)變量,用于控制是否顯示新舊的sql語句
select id,last_name,salary from s_emp where title='&job_title';