一、Merge語(yǔ)句
根據條件在表中執行修改或插入數據的功能,如果插入的數據行在目的表中存在就執行UPDATE,如果是不存在則執行INSERT:
-避免了單獨的修改
-增強性能和應用性
它的功能就是將,一個(gè)表中的數據加入到另一個(gè)表中。
格式:
MERGE INTO 目標表
USING 源表
ON(目標表.FIELD = 源表.FIELD)
WHEN MATCHED THEN
UPDATE SET
目標表.FIELD1 = 源表.FIELD1,
目標表.FIELD2 = 源表.FIELD2,
...
WHEN NOT MATCHED THEN
INSERT (目標表.FIELD1,目標表.FIELD2,...)
VALUES (FV1,FV2,...)
如果不需要,insert() vale()??梢圆粚?xiě)WHENNOT MATCHED THEN這一部分。
例,在“EMP”表中添加一個(gè)“LOC”字段,將“DEPT”表中的“LOC”字段值根據員工的部門(mén)編號拷貝到“EMP”表中的“LOC”字段。如果有部門(mén)編號不存在的員工,則什么也不做。
ALTER TABLE EMP ADD LOC VARCHAR2(20)
MERGE INTO EMP E
USING DEPT D
ON(E.DEPTNO = D.DEPTNO)
WHEN MATCHED THEN
UPDATE SET
E.LOC = D.LOC
數據庫事務(wù)處理,在此就不復習了。
二、數據庫的主要對象
1.數據庫的對象:
對象名稱(chēng)
描述
表
基本的數據存儲對象,以行和列的形式存在,列是字段,行是記錄
數據字典
也就是系統表,存放數據庫相關(guān)信息的表
約束條件
執行數據校驗,保證了數據完整性的
視圖
一個(gè)或者多個(gè)表數據的邏輯顯示
索引
用于提高查詢(xún)的性能
同義詞
對象的別名
2.Oracle中常用字段類(lèi)型:
數據類(lèi)型
說(shuō)明
char(size)
定長(cháng)字符,≤2000個(gè)字節
varchar2(size)
變長(cháng)字符,≤4000個(gè)字節
date
日期數據,默認的格式是dd-mm-yy:如11-6月-06
timestamp
日期數據,要比date數據更確切,包含時(shí)分秒。
integer
整型數據
number[(s,p)]
數字型,可存放實(shí)型和整型 ,精度(p)和范 圍(s)
long
可變字符,≤2GB個(gè)字符
float,real
是NUMBER的子類(lèi)型
blob
存放圖形、聲音和影像,大二進(jìn)制對象,≤4GB
clob
存放大文本文件,≤4GB
3.使用子查詢(xún)創(chuàng )建表:
以前直接使用Create Tabel tab_name…創(chuàng )建表,如果想創(chuàng )建表的同時(shí),將另一張表中的某些數據導入到新表怎么辦?此時(shí),子查詢(xún)派上了用場(chǎng):
例,創(chuàng )建一個(gè)“EMPNEW”表,它與“EMP”表具有相同的字段和值:
CREATE TABLE EMPNEW
AS SELECT * FROM EMP WHERE DEPTNO IS NOT NULL AND DEPTNO>0
例,創(chuàng )建一個(gè)“EMPNEW2”表,包含“員工編號”和“員工姓名”兩個(gè)字段。它只需要“EMP”表中的“EMPNO”和“ENAME”字段和值:
CREATE TABLE EMPNEW2(
"員工編號",
"員工姓名"
) AS SELECT EMPNO,ENAME FROM EMP
--這兩條語(yǔ)句實(shí)現的功能相同
CREATE TABLE EMPNEW2
AS SELECT EMPNO "員工編號",ENAME "員工姓名" FROM EMP
三、對表的字段和表的操作
1.在表中增加字段:
例,在“EMP2”表中添加一個(gè)“EMAIL”字段:
ALTER TABLE EMPNEW2 ADD EMAIL VARCHAR2(30)
2.在表中修改字段:
例,修改“EMPNEW2”表中字段“EMAIL”的默認值為
NULL@SQL.COM:
ALTER TABLE EMPNEW2 MODIFY EMAIL VARCHAR2(30) DEFAULT 'NULL@SQL.COM'
不是任何情況都可以修改的,當字段只包含空值時(shí),
類(lèi)型、大小都可以修改,否則修改可能不能成功。
3.在表中刪除字段:
例,刪除“EMPNEW2”表中的“EMAIL”字段:
ALTER TABLE EMPNEW2 DROP COLUMN EMAIL
刪除大表中的字段將需要比較長(cháng)的時(shí)間。
4.刪除表的內容:
例,刪除“EMPNEW2”表中的內容:
TRUNCATE TABLE EMPNEW2
與delete語(yǔ)句相比:
Truncate語(yǔ)句清空表中所有的內容,而delete可以根據where條件選擇性刪除數據。
Truncate是DDL語(yǔ)句,如果在事件中使用它,它是不可以回滾的。
Truncate釋放表空間,但delete不會(huì )。
5.刪除表:
例,刪除表“EMPNEW2”:
DROP TABLE EMPNEW2
1、表中所有數據將被刪除
2、沒(méi)有完成的事務(wù)被提交
3、所有相關(guān)的索引被刪除
4、這個(gè)刪除操作不能回滾
6.修改對象名稱(chēng):
例,:將表“EMPNEW2”名稱(chēng)修改為“EMPTWO”:
RENAME EMPNEW2 TO EMPTWO
使用RENAME語(yǔ)句改變對象名稱(chēng),可以修改表、視圖、序列或者同義詞的名稱(chēng),必須是對象的所有者。
四、Oracle數據庫中的表
1.查詢(xún)數據字典:
例,查看被用戶(hù)擁有有的表(我使用的是Oracle自帶的SCOTT用戶(hù)):
SELECT TABLE_NAME FROM USER_TABLES
例,查看用戶(hù)擁有的所有對象類(lèi)型:
SELECT DISTINCT OBJECT_TYPE FROM USER_OBJECTS
例,查看所有用戶(hù)擁有的表(必須是DBA用戶(hù)登錄):
SELECT * FROM DBA_TABLES
五、約束
1.什么是約束:
約束是在表上強制執行的數據校驗規則.
當表中數據有相互依賴(lài)性時(shí),可以保護相關(guān)的數據不被刪除.
Oracle 支持下面五類(lèi)完整性約束:
1、NOT NULL 非空
2、UNIQUE Key 唯一鍵
3、PRIMARY KEY 主鍵
4、FOREIGN KEY 外鍵
5、CHECK 檢察
2.非空約束:
約束字段值不能為空。
與其他約束相比,非空約束只能定義的字段級。
例,創(chuàng )建表“USERTABLE”并設置“NAME”字段非空:
--非空約束
CREATE TABLE USERTABLE(
ID INT,
NAME VARCHAR2(10) NOT NULL--字段級
)
--或:ALTER TABLE USERTABLE MODIFY NAME NOT NULL—表外級
--查看用戶(hù)的約束
SELECT * FROM USER_CONSTRAINTS
--查看表的約束
SELECT * FROM USER_CONSTRAINTS WHERE TABLE_NAME='EMP'
3.唯一性約束:
約束字段不準出現重復的記錄,但可以出現一個(gè)或多個(gè)空值。
例,創(chuàng )建表“USERTABLE”并設置“EMAIL”字段唯一:
--唯一性約束
CREATE TABLE USERTABLE(
ID INT,
NAME VARCHAR(10) NOT NULL,
EMAIL VARCHAR(30) UNIQUE--字段級
--或:CONSTRAINT EMAIL_UN1 UNIQUE(EMAIL)--表級
)
--或:ALTER TABLE USERTABLE ADD CONSTRAINT EMAIL_UN1 UNIQUE(EMAIL)--表外級
注意:這種可以在表外定義的約束,一般都在表外定義。這樣易于調整和管理。
4.主鍵盤(pán)約束:
主鍵從功能上看相當于非空且唯一
一個(gè)表中只允許一個(gè)主鍵
主鍵是表中能夠唯一確定一個(gè)行數據的字段
主鍵字段可以是單字段或者是多字段的組合
例,創(chuàng )建表“USERTABLE”并設置“ID”字段為主鍵:
--主鍵約束
CREATE TABLE USERTABLE(
ID INT PRIMARY KEY,--字段級
NAME VARCHAR2(10) NOT NULL,
EMAIL VARCHAR(30) UNIQUE
--或:CONSTRAINT ID_PRI PRIMARY KEY(ID)--表級
)
--或:ALTER TABLE USERTABLE ADD CONSTRAINT ID_PRI PRIMARY KEY(ID)--表外級
注意:這種可以在表外定義的約束,一般都在表外定義。這樣易于調整和管理。
5.外鍵約束:
外鍵是構建于一個(gè)表的兩個(gè)字段或者兩個(gè)表的兩個(gè)字段之間的關(guān)系
外鍵確保了相關(guān)的兩個(gè)字段的關(guān)系:
子表外鍵列的值必須在主表參照列值的范圍內,或者為空
主表主鍵值被子表參照時(shí),主表記錄不允許被刪除
外鍵約束條件參照的是主表的一個(gè)或者多個(gè)字段的值,通常被外鍵參照的是主表的主鍵或者唯一鍵
例,創(chuàng )建一個(gè)“ROLETABLE”角色表,在“USERTABLE”表中添加一個(gè)外鍵,指向角色ID:
--外鍵約束
CREATE TABLE ROLETABLE(
ID INT PRIMARY KEY,
MODIFYTAB NUMBER(4)
)
--
CREATE TABLE USERTABLE(
ID NUMBER(4) PRIMARY KEY,
NAME VARCHAR2(10) NOT NULL,
EMAIL VARCHAR(30) UNIQUE,
ROLE_ID NUMBER(4),
CONSTRAINT FK_ROL FOREIGN KEY(ROLE_ID) REFERENCES ROLETABLE(ID)--表級
)
--或:ALTER TABLE USERTABLE ADD CONSTRAINT FK_ROL FOREIGN KEY(ROLE_ID) REFERENCES ROLETABLE(ID)--表外級
6.CHECK約束:
Check約束條件是一種比較特殊的約束條件,通過(guò)check定義,
強制定義在字段上的每一記錄都要滿(mǎn)足check中定義的條件。
在check中定義檢查的條件表達式,進(jìn)入表中的數據必須符合。
check中設置的條件
條件表達式不允許使用:
1、SYSDATE, USER等函數
2、參照其他記錄的值
例,為 “EMP”表中的“SAL”字段添加約束:
ALTER TABLE EMP ADD CONSTRAINT CK_SAL CHECK(SAL>6000)
7.刪除約束:
刪除約束條件對于表和數據不會(huì )產(chǎn)生影響
--刪除“EMP”表中的“SAL”字段的CHECK約束
ALTER TABLE EMP DROP CONSTRAINT CK_SAL
--刪除“ROLETABLE”中 的“ID”字段的主鍵約束,同時(shí)“USERTABLE” 的外鍵約束也被刪除
ALTER TABLE ROLETABLE DROP PRIMARY KEY CASCADE
六、索引
1.什么時(shí)索引:
方案(schema)中的一個(gè)數據庫對象
在 Oracle數據庫中用來(lái)加速對表的查詢(xún)
通過(guò)使用快速路徑訪(fǎng)問(wèn)方法快速定位數據,減少了磁盤(pán)的I/O
與表獨立存放
由 Oracle數據庫自動(dòng)維護
2.索引的創(chuàng )建方法:
自動(dòng):當在表上定義一個(gè)PRIMARY KEY或者UNIQUE約束條件時(shí),Oracle數據庫自動(dòng)創(chuàng )建一個(gè)對應的唯一索引。
手動(dòng):用戶(hù)可以創(chuàng )建索引以加速查詢(xún)。
3.創(chuàng )建索引:
例,創(chuàng )建一個(gè)“USERTABLE”,為“ID”字段創(chuàng )建索引:
--創(chuàng )建索引
CREATE TABLE USERTABLE(
ID NUMBER(4),
NAME VARCHAR2(10)
)
CREATE INDEX USERTABLE_INDEX ON USERTABLE(ID)
4.刪除索引:
例,刪除“USERTABLE”中“ID”字段的索引:
--刪除索引
DROP INDEX USERTABLE_INDEX
刪除索引,必須擁有索引或者擁有 DROP ANYINDEX 權限。
七、視圖
1.什么是視圖:
視圖也就是虛表,實(shí)際上視圖就是一個(gè)命名的查詢(xún),用于改變基表數據的顯示。
可以限制對數據的訪(fǎng)問(wèn)
可以使復雜的查詢(xún)變的簡(jiǎn)單
提供了數據的獨立性
提供了對相同數據的不同顯示
2.創(chuàng )建視圖:
例,查詢(xún)“EMP”表中薪金大于8000的員工。
SELECT * FROM EMP WHERE SAL>8000
如果上面的查詢(xún)語(yǔ)句是我們經(jīng)常要使用到的呢?每次都要編寫(xiě)這個(gè)語(yǔ)句嗎?視圖在此發(fā)揮了作用:
--創(chuàng )建視圖
CREATE OR REPLACE VIEW SAL8000
AS SELECT * FROM EMP WHERE SAL>8000
3.從視圖中查詢(xún)數據:
--從視圖中查詢(xún)數據
SELECT * FROM SAL8000
就像是定義了一個(gè)宏!
如果創(chuàng )建視圖“SELECT * FROM…”中的“*”,是某幾個(gè)字段。則查詢(xún)視圖中也僅能查詢(xún)創(chuàng )建視圖時(shí)指定的字段。
查詢(xún)視圖結構,在命令窗口中輸入:DESC 視圖名稱(chēng)
4.修改視圖:
例,修改上面創(chuàng )建的視圖“SAL8000”,為每個(gè)列指定列名:
--修改視圖
CREATE OR REPLACE VIEW SAL8000
AS SELECT EMPNO 工號,ENAME 姓名 FROM EMP WHERE SAL>8000
這視圖應該是可以被覆蓋的,沒(méi)發(fā)現這里有修改的關(guān)鍵字。
5.創(chuàng )建復雜視圖:
例,創(chuàng )建一個(gè)“EMP”表與“DEPT”表能過(guò)“DEPTNO”字段關(guān)聯(lián)的視圖:(聯(lián)表視圖)
--創(chuàng )建復雜視圖
CREATE OR REPLACE VIEW EMPANDDEPT
AS SELECT E.EMPNO,E.ENAME,D.DEPTNO,D.DNAME,D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
6.禁止視圖進(jìn)行DML操作:
例,修改上邊的視圖,使其只能查詢(xún),不能進(jìn)行DML操作:
--使用WITH READ ONLY禁 止視圖進(jìn)行DML操作
CREATE OR REPLACE VIEW EMPANDDEPT
AS SELECT E.EMPNO,E.ENAME,D.DEPTNO,D.DNAME,D.LOC
FROM EMP E, DEPT D
WHERE E.DEPTNO = D.DEPTNO
WITH READ ONLY
7.刪除視圖:
例,刪除上面創(chuàng )建的“DEMANDDEPT”視圖:
--刪除視圖
DROP VIEW EMPANDDEPT
8.行內視圖:
行內視圖是在SQL語(yǔ)句中使用的一個(gè)帶有別名的子查詢(xún).
在主查詢(xún)FROM 子句中的子查詢(xún)就是行內視圖.
行內視圖不是數據庫的對象,所以不需要顯式的創(chuàng )建.
八、TOP-N分析
1.什么是TOP-N:
使用Top-N分析法可以得到某列上最什么的前n個(gè)值. 例如:
薪水最高的前5個(gè)員工?
人員最多的3個(gè)部門(mén)?
最大的幾個(gè)值和最小的幾個(gè)值都可以通過(guò)Top-N 分析的方法得到.
2.使用TOP-N:
例,查詢(xún)“EMP”表中工資最高的前3位員工:
--TON-N分析
SELECT EMPNO,ENAME,JOB,SAL
FROM (
SELECT ROWNUM,EMPNO,ENAME,JOB,SAL FROM EMP ORDER BY SAL DESC
) WHERE ROWNUM < 4
1、使用了rownum這個(gè)偽列,這個(gè)偽列將會(huì )返回行號,可以作為返回記錄的序列號顯示。
2、在from后面使用了子查詢(xún),這是標準的行內視圖的使用。
3、在主查詢(xún)中通過(guò)where條件中的rownum偽列定義過(guò)濾條件,只返回最什么的前幾行數據。
3.數據庫中的記錄分布技術(shù):
正是使用TOP-N分析實(shí)現的。
例,查詢(xún)工資排行的第4-7位的員工信息:
--TOP-N分頁(yè)
SELECT EMPNO,ENAME,JOB,SAL
FROM(
SELECT ROWNUM MR,EMPNO,ENAME,JOB,SAL FROM(
SELECT ROWNUM,EMPNO,ENAME,JOB,SAL FROM EMP ORDER BY SAL DESC
)WHERE ROWNUM < 7
)WHERE MR > 3
上面我們是取頁(yè)面的中間部分,可以將7換為3,3換為0。這樣取的就是頁(yè)面首部(前三位)!
九、同義詞
1.什么是同義詞:
同義詞是數據庫中一個(gè)對象的別名,可以簡(jiǎn)化對對象的訪(fǎng)問(wèn)。
通過(guò)使用同義詞,可以:
1、簡(jiǎn)化了引用另一個(gè)用戶(hù)對象的方法
2、縮短了對象名稱(chēng)的長(cháng)度
2.創(chuàng )建同義詞:
例,為“EMP”表創(chuàng )建一個(gè)同義詞“E”:
--同義詞
CREATE SYNONYM E FOR EMP
3.使用同義詞:
例,使用同義詞查詢(xún)“EMP”所有記錄:
--使用同義詞(默認為私有同義詞)
SELECT * FROM E
4.公開(kāi)與私有同義詞:
--公開(kāi)同義詞
CREATE PUBLIC SYNONYM E FOR EMP
公開(kāi)同義詞任何用戶(hù)都可以訪(fǎng)問(wèn),私有同義詞只有創(chuàng )建它的用戶(hù)才可以訪(fǎng)問(wèn)。
5.刪除同義詞:
例,刪除上面創(chuàng )建的同義詞“E”:
--刪除同義詞
DROP SYNONYM E
十、序列
1.什么是序列:
是一數據庫對象,利用它可生成唯一的整數。
一般使用序列自動(dòng)地生成表主鍵值或唯一鍵值
不直接連接到數據庫中的任何表
2.定義序列的語(yǔ)法:
CREATESEQUENCE [user.]sequence_name
[increment by n]
[start with n]
[maxvaluen|]
[minvalue n ];
[cache]
[NOCYCLE|CYCLE]
INCREMENTBY: 指定序列號之間的間隔,該值可為正的或負的整數,但不可為0。序列為升序。忽略該子句時(shí),缺省值為1。
STARTWITH:指定生成的第一個(gè)序列號。在升序時(shí),序列可從比最小值大的值開(kāi)始,缺省值為序列的最小值。對于降序,序列可由比最大值小的值開(kāi)始,缺省值為序列的最大值。
MAXVALUE:指定序列可生成的最大值。
MINVALUE:指定序列的最小值
NOCYCLE:一直累加,不循環(huán)
CYCLECACHE:默認值是20
序列里的緩沖是大量并發(fā)提取序列值時(shí)提升性能的一種手段。
由于序列操作是原子操作,如果沒(méi)有緩沖,序列的訪(fǎng)問(wèn)將只能由一個(gè)事務(wù)獨占,獨占期間阻塞其它事務(wù)的訪(fǎng)問(wèn),且一定會(huì )涉及硬盤(pán)操作。這樣如果有對一個(gè)序列的大量并發(fā)操作的話(huà),系統性能將會(huì )下降。
緩沖是指事先成批的提取序列值,緩沖在內存中,供多個(gè)事務(wù)同時(shí)訪(fǎng)問(wèn)(每個(gè)事務(wù)占一個(gè)緩沖的序列值),且訪(fǎng)問(wèn)期間如果沒(méi)有用盡緩沖是不用寫(xiě)硬盤(pán)的,可大幅度提高并發(fā)訪(fǎng)問(wèn)序列的性能。但帶來(lái)的問(wèn)題是序列值可能不連續(但肯定保證唯一),如并發(fā)訪(fǎng)問(wèn)序列值后有些事務(wù)回滾等操作,都會(huì )帶來(lái)緩沖序列值的不連續或丟失。
3.創(chuàng )建序列:
例,創(chuàng )建一個(gè)“SEQ_EMP”序列:
--創(chuàng )建序列
CREATE SEQUENCE SEQ_EMP
INCREMENT BY 1
START WITH 1
MAXVALUE 100
MINVALUE 1
CYCLE
4.查看序列:
例,查看“SEQ_EMP”序列:
--查看序列
SELECT * FROM USER_SEQUENCES
--查看初始化序列,NEXTVAL將 引起序列值增加“INCREMENT BY”
SELECT SEQ_EMP.NEXTVAL FROM DUAL
--查看序列當前值
SELECT SEQ_EMP.CURRVAL FROM DUAL
5.使用序列:
例,向“EMP”表中插入新記錄。 “EMPNO”字段使用上面創(chuàng )建的“SEQ_EMP”序列的值:
--使用序列
INSERT INTO EMP (EMPNO,ENAME) VALUES (SEQ_EMP.NEXTVAL, 'XLTEST')
如果某個(gè)字段使用“SEQ_EMP”序列的值,就應該一直使用這個(gè)序列,否則可能會(huì )造成字段值重復。我理解序列就是自定義的“auto_increment”,可能還有些其他用途。
6.修改序列:
例,修改上面創(chuàng )建的“SEQ_EMP”序列:
--修改序列
ALTER SEQUENCE SEQ_EMP
INCREMENT BY 2
MAXVALUE 200
MINVALUE 2
修改序列可以:
修改未來(lái)序列值的增量。
設置或撤消最小值或最大值。
改變緩沖序列的數目。
指定序列號是否是有序。(這應該就是循環(huán)或不循環(huán))
注意:
1.第一次NEXTVAL返回的是初始值
2.可以修改除start以外的所有sequence的參數。如果想要改變start值,必須刪除序列再重新創(chuàng )建。
7.刪除序列:
例,刪除序列“SEQ_EMP”:
--刪除序列
DROP SEQUENCE SEQ_EMP
十一、匿名塊
1.什么是匿名塊:
匿名塊是只使用一次的PL/SQL程序塊
匿名塊沒(méi)有名稱(chēng),也不被存儲在數據庫中
由PL/SQL的四個(gè)基本組成部分構成
不能被重復使用
2.匿名塊語(yǔ)法:
DECLARE
變量、常量聲明;
BEGIN
pl/sql_block;
EXCEPTIONS
異常捕捉;
END;
十二、存儲過(guò)程
1.什么是存儲過(guò)程:
用于在數據庫中完成特定的操作或者任務(wù)。其實(shí),它就是數據庫中的自定義函數!
語(yǔ)法:
Create PROCEDURE name
parameter_name [IN | OUT | IN OUT] datatype
[{:= | DEFAULT} expr]
IS
pl/sql_block;
在Sql*Plus 中使用CREATE OR REPLACE子句創(chuàng )建存儲程序單元
在頭部定義所有參數
IS表示PL/SQL塊的開(kāi)始。
在IS之后,聲明本地變量
2.存儲過(guò)程的參數模式:
IN
OUT
IN OUT
默認
值:
傳遞給 子程序
手動(dòng)指定
返回到 調用環(huán)境
手動(dòng)指定
傳遞給 子程序,返回到調用環(huán)境
參數形式:
常量
未初始 化的變量
初始化 的變量
實(shí)參:
可以是表達式,常量,或者是初始化的變量。
必須是 一個(gè)變量
必須是 一個(gè)變量
上面一年便知:
IN,就是傳入參數。
OUT,就是接收返回值。
INOUT,就是傳入參數后,也接收返回值。
3.創(chuàng )建存儲過(guò)程:
例,創(chuàng )建一個(gè)根據“EMPNO”字段更新“EMP”表中“SAL”字段值,并返回“OK!”:
--創(chuàng )建存儲過(guò)程
CREATE OR REPLACE PROCEDURE UPEMPFUN(
ARG_EMPNO IN NUMBER,
ARG_SAL IN NUMBER,
ARG_RES OUT VARCHAR
)IS BEGIN
UPDATE EMP SET SAL = ARG_SAL WHERE EMPNO=ARG_EMPNO;
COMMIT;
ARG_RES := 'OK!';
END;
4.調用存儲過(guò)程:
例,調用上面創(chuàng )建的存儲過(guò)程:
--調用存儲過(guò)程
DECLARE
ARG_RES VARCHAR(20);
BEGIN
UPEMPFUN(7369,99999,ARG_RES);
DBMS_OUTPUT.PUT_LINE(ARG_RES);
END;