Oracle复习(知识点、练习题、实验)
文章目錄
- 第一章 數(shù)據(jù)庫概念
- 數(shù)據(jù)庫的三級模式結(jié)構(gòu):模式、外模式、內(nèi)模式
- 三級模式之間的映射
- 第二章 Oracle12g體系結(jié)構(gòu)
- Oracle的邏輯存儲結(jié)構(gòu)
- Oracle物理存儲結(jié)構(gòu)
- Oracle11g服務(wù)器結(jié)構(gòu)
- 系統(tǒng)全局區(qū)(SGA)
- 程序全局區(qū)(PGA)
- 第三章 Oracle數(shù)據(jù)庫的安裝與配置
- 第四章 SQLPLUS命令
- 第五章 SQL語言基礎(chǔ)及調(diào)優(yōu)
- 為列指定別名
- 比較篩選
- 使用特殊關(guān)鍵字篩選
- in關(guān)鍵字
- Between 關(guān)鍵字
- 分組查詢
- 多表關(guān)聯(lián)查詢
- 內(nèi)連接
- 左外連接
- 右外連接
- 自然連接
- 自身連接
- 常用函數(shù)
- 子查詢
- 多行子查詢
- 使用 ANY查詢
- 使用ALL查詢
- 關(guān)聯(lián)子查詢
- 第六章 PL/SQL編程
- PL/SQL游標
- SqlPlus column命令用法
- 觸發(fā)器例題
- 選擇題
- 填空題
- 判斷題
- 簡答題
- 設(shè)計題
- 實驗一
- 實驗二
- 實驗三
第一章 數(shù)據(jù)庫概念
(1)數(shù)據(jù)模型通常由數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作和完整性約束3部分組成的
(2)常見的數(shù)據(jù)模型
層次模型、網(wǎng)狀模型和關(guān)系模型
1)層次模型:用樹型結(jié)構(gòu)表示實體類型及實體間聯(lián)系的數(shù)據(jù)模型為層次模型
2)網(wǎng)狀模型:用有向圖結(jié)構(gòu)表示實體類型及實體間聯(lián)系的數(shù)據(jù)模型稱為網(wǎng)狀模型
3)關(guān)系模型:用二維表描述數(shù)據(jù)。
關(guān)系模型的基本術(shù)語:
關(guān)系:一個二維表就是一個關(guān)系 元組:二維表中的一行,即表中的記錄。 屬性: 二維表中的一列,用類型和值表示 域:每個屬性取值的變化范圍關(guān)系模型的完整性規(guī)則是對關(guān)系的某種約束條件。
實體完整性約束 參照完整性約束:關(guān)系之間的基本約束。 用戶自定義的完整性約束數(shù)據(jù)庫系統(tǒng)由以下部分的構(gòu)成:
(1)數(shù)據(jù)庫
(2)數(shù)據(jù)庫管理系統(tǒng)
(3)應(yīng)用系統(tǒng)
(4)數(shù)據(jù)庫管理員
(5)用戶
關(guān)系操作包括查詢操作和更新操作:
查詢操作:
選擇、投影、連接、除、并、交、差
更新操作:
增加、刪除、修改
命令:
1、連接命令
2、斷開
disc[onnect] 用戶名/密碼3、修改密碼
passw[ord] +自身 更改低級用戶密碼:alter user 用戶名 identity by +新密碼4、創(chuàng)建用戶并設(shè)定密碼
create user 用戶名 identity by 密碼5、刪除用戶
drop user 用戶名 [cascade] ----用戶下建表情況下使用6、關(guān)閉數(shù)據(jù)庫實例
shut down by 密碼7、啟動數(shù)據(jù)庫
start up數(shù)據(jù)庫的三級模式結(jié)構(gòu):模式、外模式、內(nèi)模式
(1)模式:稱為邏輯模式或概念模式,是對數(shù)據(jù)庫中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是所有用戶的公共數(shù)據(jù)視圖。一個數(shù)據(jù)庫只有一個模式。
(2)外模式:外模式是模式的子集。外模式也稱為用戶模式,它是數(shù)據(jù)庫用戶能夠看見和使用的對局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是數(shù)據(jù)庫用戶的數(shù)據(jù)視圖。
(3)內(nèi)模式:內(nèi)模式也成為存儲模式,一個數(shù)據(jù)庫只有一個內(nèi)模式。
三級模式之間的映射
外模式/模式映射
同一個模式可以有任意多個外模式。對于每一個外模式,數(shù)據(jù)庫系統(tǒng)都有一個外模式/模式映射。
模式/內(nèi)模式映射
數(shù)據(jù)庫只有一個模式和外模式,即模式/內(nèi)模式映射是唯一的
關(guān)系是一種規(guī)范化的二維表格,它具有以下特性:
屬性值具有原子性,不可分解
沒有重復的元組即沒有重復的行
鍵的類型:
超鍵:在一個關(guān)系中,能唯一標識元組的屬性或?qū)傩约Q為關(guān)系的超鍵。
候選鍵:如果一個屬性集能夠唯一標識元組,且又不含有多余的屬性,稱為關(guān)系的候選鍵。
關(guān)系型數(shù)據(jù)庫的設(shè)計范式
第一范式:屬性唯一,在數(shù)據(jù)表中的字段都是單一的,不可再分的
第二范式:不存在部分函數(shù)依賴
第三范式:不存在傳遞函數(shù)依賴。
第二章 Oracle12g體系結(jié)構(gòu)
三個概念去理解:實例、數(shù)據(jù)庫、數(shù)據(jù)庫服務(wù)器
Oracle的邏輯存儲結(jié)構(gòu)
Oracle數(shù)據(jù)庫是由多個表空間組成,而表空間又是有多個段組成,段由多個數(shù)據(jù)區(qū)組成,數(shù)據(jù)區(qū)由多個數(shù)據(jù)塊組成。
一)數(shù)據(jù)塊
數(shù)據(jù)塊是Oracle邏輯存儲結(jié)構(gòu)中的最小的邏輯單位,也是執(zhí)行數(shù)據(jù)庫輸入輸出操作的最小存儲單位。
Orale服務(wù)器以數(shù)據(jù)塊為單位管理數(shù)據(jù)文件的存儲空間。
二)數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)是由一組連續(xù)的Oracle數(shù)據(jù)塊所構(gòu)成的Oracle存儲結(jié)構(gòu),一個或多個數(shù)據(jù)塊組成一個數(shù)據(jù)區(qū),一個或多個數(shù)據(jù)區(qū)在組成一個段。
區(qū)為段分配空間,它由連續(xù)的數(shù)據(jù)塊組成。
當段中所有空間已完全使用時,系統(tǒng)自動為該段分配一個新區(qū)。
區(qū)不能跨數(shù)據(jù)文件存在,只能存在于一個數(shù)據(jù)文件中。
三)段
段由一個或多個數(shù)據(jù)區(qū)組成。
段是構(gòu)成表空間的邏輯存儲結(jié)構(gòu),段由一組區(qū)組成。
按照段所存儲數(shù)據(jù)的特征,將段分為若干種類型,主要有數(shù)據(jù)段、索引段、回退段和臨時段。
4種段:
數(shù)據(jù)段、索引段、回滾段、臨時段
四)表空間
一個表空間由一個或多個數(shù)據(jù)文件組成,一個數(shù)據(jù)文件只屬于一個表空間。
Oracle數(shù)據(jù)的存儲空間邏輯上表現(xiàn)為表空間,而在物理上表現(xiàn)為數(shù)據(jù)文件。
每個數(shù)據(jù)庫至少一個表空間,表空間的大小等于所有從屬于它的數(shù)據(jù)文件大小的總和。
(1)System表空間
系統(tǒng)表空間,用于存放Oracle系統(tǒng)內(nèi)部表和數(shù)據(jù)字典的數(shù)據(jù),例如 列名
(2)Sysaux表空間
主要存儲除數(shù)據(jù)字典以外的其他數(shù)據(jù)中的對象
(3)UNDO表空間
撤銷表空間,用于存儲撤銷信息的表空間
(4)Users表空間
可以創(chuàng)建各種數(shù)據(jù)對象。
Oracle物理存儲結(jié)構(gòu)
Oracle數(shù)據(jù)庫的物理存儲結(jié)構(gòu)有多種物理文件組成,主要有數(shù)據(jù)文件、控制文件、重做日志文件、歸檔日志文件、口令文件和警告日志文件
(一)數(shù)據(jù)文件(.DBF)
數(shù)據(jù)文件是用于保護用戶應(yīng)用程序數(shù)據(jù)和Oracle系統(tǒng)內(nèi)部數(shù)據(jù)的文件
(1)系統(tǒng)數(shù)據(jù)文件
(2)撤銷數(shù)據(jù)文件
(3)用戶數(shù)據(jù)文件
(二)控制文件(.CTL)
二進制文件,記錄數(shù)據(jù)庫的物理結(jié)構(gòu)
每個數(shù)據(jù)庫至少擁有一個控制文件,一個數(shù)據(jù)庫可以同時擁有多個控制文件,一個控制文件只能屬于一個數(shù)據(jù)庫
(三)日志文件(.LOG)
日志文件主要記錄對數(shù)據(jù)所作的修改
(1)重做日志文件
用來記錄數(shù)據(jù)庫所有發(fā)生過的更改信息
SGA(系統(tǒng)全局區(qū))
LGWR(日志寫入進程)
ARCH(歸檔進程)
(2)歸檔日志文件
(四)密碼文件、警告文件、跟蹤文件
(1)密碼文件
(2)警告文件
主要用來記錄Oracle系統(tǒng)的運行信息和錯誤信息
(3)跟蹤文件
Oracle11g服務(wù)器結(jié)構(gòu)
Oracle服務(wù)器主要由實例、數(shù)據(jù)庫、程序全局區(qū)和前臺進程組成
實例可以分為系統(tǒng)全局區(qū)(SGA)、后臺進程(PMON、SMON)兩部分
程序全局區(qū)(PGA)是一個非共享的內(nèi)存區(qū)域
內(nèi)存結(jié)構(gòu)=PGA+SGA
SGA:系統(tǒng)全局區(qū) 實例啟動(共享)
PGA:程序全局區(qū) 服務(wù)器進程啟動(私有)
系統(tǒng)全局區(qū)(SGA)
主要高速緩沖區(qū)、共享池、重做日志緩沖區(qū)、java池、大型池等內(nèi)存結(jié)構(gòu)組成,分為三部分:
臟數(shù)據(jù)區(qū)、空閑區(qū)、保留區(qū)
(1)重置日志緩沖區(qū)
用于存放對數(shù)據(jù)庫進行修改操作時產(chǎn)生的日志信息。
(2)共享池(保存生成執(zhí)行計劃)
select count(*) from emp;//生成執(zhí)行計劃 scott: select * from help;共享池是SGA保留的內(nèi)存區(qū)域。
共享池是對SQL、PL/SQL程序進行語法分析、編譯、執(zhí)行的內(nèi)存區(qū)域。
共享池由庫緩存和數(shù)據(jù)字典緩存組成。
共享池的大小直接影響數(shù)據(jù)庫的性能。
(4)數(shù)據(jù)緩沖區(qū)
用于存儲從磁盤數(shù)據(jù)文件中讀入的數(shù)據(jù),所有用戶共享。
Oracle的用戶都是從數(shù)據(jù)緩沖區(qū)讀數(shù)據(jù)。
服務(wù)器進程中將讀入的數(shù)據(jù)保存在數(shù)據(jù)緩沖區(qū)中,當后續(xù)的請求需要這些數(shù)據(jù)時可以在內(nèi)存中找到,不需要再從磁盤讀取,提高了讀取速度。
數(shù)據(jù)緩沖區(qū)的大小對數(shù)據(jù)庫的讀取速度有直接的影響。
(3)日志緩沖區(qū)
日志記錄數(shù)據(jù)庫的所有修改信息,日志信息首先產(chǎn)生于日志緩沖區(qū)。
當日志緩沖區(qū)的日志數(shù)據(jù)達到一定數(shù)量時,由后臺進程將日志數(shù)據(jù)寫入日志文件中。
相對來說,日志緩沖區(qū)對數(shù)據(jù)庫的性能影響較小。
符合以下任一條件日志緩沖區(qū)數(shù)據(jù)寫入日志文件中:
(4)大型池
Oracle splile:動態(tài)參數(shù)文件(5)Java池
(6)流池
用于數(shù)據(jù)庫與數(shù)據(jù)庫之前的信息共享。
程序全局區(qū)(PGA)
又稱用戶進程全局區(qū),它的內(nèi)存在進程私有區(qū)而不是共享區(qū)中。
(1)私有SQL區(qū)
(2)會話區(qū)
前臺程序
A.用戶進程
能生成或執(zhí)行SQL語句,稱為用戶進程
B.服務(wù)器進程
后臺程序
Oracle后臺程序是實例的重要組成部分,其中,SMON,PMON,DBWR,LGWR,CKPT這5個后臺程序必須正常啟動。
1.數(shù)據(jù)寫入進程 數(shù)據(jù)寫入操作(DBWR)的主要任務(wù)是負責將內(nèi)存中的“臟”數(shù)據(jù)快回寫到數(shù)據(jù)文件中。 “臟”數(shù)據(jù)是指高速數(shù)據(jù)緩沖區(qū)中的被修改過的數(shù)據(jù)塊
1)管理系統(tǒng)緩沖區(qū),將最近使用過的塊保留是在內(nèi)存中
2)將修改后的緩沖區(qū)數(shù)據(jù)寫入數(shù)據(jù)文件中。
2.檢查點進程 檢查點進程(CKPT)可以看做是一個事件,當檢查點事件發(fā)生時,CKPT會要求DBWR將某些“臟數(shù)據(jù)”回寫到數(shù)據(jù)文件。分為完全檢查點和增量檢查點。
完全檢查點:兩種情況下觸發(fā):
1、用戶發(fā)出 alter checkpoint
2、除shutdown外正常關(guān)閉
3.日志寫入進程(LGWR) 日志寫入進程用于將重做日志文件緩沖區(qū)中的數(shù)據(jù)寫入到重做日志文件。
1)負責將日志緩沖區(qū)中的日志數(shù)據(jù)寫入日志文件。
2)系統(tǒng)有多個日志文件,該進程以循環(huán)的方式將數(shù)據(jù)寫入文件。
4.歸檔進程(ARCH) 只有當Oracle數(shù)據(jù)庫處于歸檔模式時,該進程才可能起到作用。
5.系統(tǒng)監(jiān)控系統(tǒng)(SMON) 是數(shù)據(jù)庫系統(tǒng)啟動時執(zhí)行恢復工作的強制性進程,監(jiān)控Oracle整個進程。
1.在實例失敗之后,重新打開數(shù)據(jù)庫時自動恢復實例。
2.整理數(shù)據(jù)文件的自由空間,將相鄰區(qū)域結(jié)合起來。
3.釋放不再使用的臨時段。
6.進程監(jiān)控進程(PMON) 用于監(jiān)控其他進程的狀態(tài),當有進程啟動失敗時,PMON會清除失敗的用戶進程,釋放用戶進程所用的資源。
1.清理出現(xiàn)故障的進程
2.釋放所有當前掛起的鎖定
3.釋放故障進程使用的資源
第三章 Oracle數(shù)據(jù)庫的安裝與配置
啟動startup數(shù)據(jù)庫步驟
1創(chuàng)建并啟動實例
2裝載數(shù)據(jù)庫
3打開數(shù)據(jù)庫
Startup:
1.NOMOUNT模式
只會創(chuàng)建實例,并不會加載數(shù)據(jù)庫,也不會打開任何數(shù)據(jù)文件。
2.MOUNT 模式
啟動實例,加載數(shù)據(jù)庫,并保持數(shù)據(jù)庫的關(guān)閉狀態(tài)。
3 . Open模式
啟動、加載、打開數(shù)據(jù)庫
4 . Force模式
這種模式將終止實例并重新啟動數(shù)據(jù)庫,這種啟動模式具有一定的強制性。
關(guān)閉shutdown數(shù)據(jù)庫步驟
1關(guān)閉數(shù)據(jù)庫
2卸載數(shù)據(jù)庫
3關(guān)閉實例
SHUTDOWN :
NORMAL (正常關(guān)閉模式)
TRANSACTIONAL(事務(wù)關(guān)閉方式)
IMMEDIATE (立刻關(guān)閉)
ABORT (終止關(guān)閉方式)
第四章 SQLPLUS命令
(1)SET命令
Off:默認,不暫停
On:輸出的結(jié)果每一頁都暫停,用戶按回車繼續(xù)顯示
Text:在設(shè)置pause的值為on之后,若在設(shè)置text 的值,則每次暫停都會將顯示該字符串。Off時,無效。
5.Set numformat
(2)DESCIBE命令
查詢指定數(shù)據(jù)對象的組成結(jié)構(gòu) DESC object_name;
(3)spool命令
把查詢的結(jié)果輸出到指定文件中 eg: spool c:\emp.txt;
(4)Define 命令
定義一個用戶變量并且可以分配一個char值
Define vjob=’SALESMAN’;
(5)save 命令
將最近的一條SQL語句或PL/SQL塊保存到一個文件中,語法如下: Save file_name;
(6)把一個SQL腳本文件的內(nèi)容放進SQL緩存區(qū)
Eg:get c:\dept.sql;
(7)Start 和@命令
這兩個命令都可以用來執(zhí)行一個SQL腳本文件
Eg: start c:\emp.txt;
格式化命令
Column
Format
用于格式化指定的列,需要在Format關(guān)鍵字的后面加一個掩碼格式。
Ttitle和BTitle命令
頭標題和底標題
Ttitle:
Off: 表示禁止打印頭標題
On:允許打印頭標題
第五章 SQL語言基礎(chǔ)及調(diào)優(yōu)
SQl語言的特點:
集合性、統(tǒng)一性、易于移植性
模式與模式對象
模式是一個數(shù)據(jù)庫對象的集合。模式為一個數(shù)據(jù)庫用戶所有,并且具有與該用戶相同的名稱。 模式對象是由用戶創(chuàng)建的邏輯結(jié)構(gòu),用以存儲或引用數(shù)據(jù)。
為列指定別名
select empno as "員工編號",ename as "員工名稱",job as "職務(wù)" from emp;比較篩選
<>(A!B) :比較A與B不相等
使用all關(guān)鍵字過濾工資(sal)同時等于3000,950和800的員工記錄
Eg:select empno,ename,sal from emp where sal<>all(3000,950,800);
使用特殊關(guān)鍵字篩選
like 關(guān)鍵字 即字符串模式匹配或字符串模糊查詢,like一般與通配符連用 如:“_”,它代表一個字符 “%” 代表任意數(shù)量的字符如“K%”表示以字母K開頭的任意長度的字符串,“%M%”表示包含字符M的任意長度的字符串,“_MRKJ”表示5個字符長度且后面4個字符是MRKJ的字符串。in關(guān)鍵字
Select empno,ename,job from emp where job in(‘President’,’manger’,’analyst’);Between 關(guān)鍵字
查詢工資在2000到3000之間員工之間的信息
Select empno,ename,sal from emp where sal between 2000 and 3000分組查詢
系統(tǒng)默認升序 ASC
(1)select deptno,job from emp group by deptno,job order by deptno; (2)select deptno as 部門編號,avg(sal) 平均工資 from emp group by deptno having avg(sal)>2000;多表關(guān)聯(lián)查詢
select e.empno as 員工編號,e.ename as 員工稱呼,d.dname as 部門2 from emp e,dept d3 where e.deptno=d.deptno4 and e.job='MANAGER';內(nèi)連接
內(nèi)連接是一種常見的多表關(guān)聯(lián)查詢方式,一般使用關(guān)鍵字inner join來實現(xiàn),inner可以省略
select e.empno as 員工編號,e.ename as 員工名稱,d.dname as 部門2 from emp e inner join dept d3 on e.deptno=d.deptno;外連接:
左外連接:關(guān)鍵字為LEFT OUTER JOIN 或 LEFT JOIN
右外連接:關(guān)鍵字為RIGHT OUTER JOIN 或RIGHT JOIN
完全外連接: 關(guān)鍵字為FULL OUTER JION 或FULL JOIN
左外連接
select e.empno,e.ename,e.job,d.deptno,d.dname2 from emp e left join dept d3 on e.deptno=d.deptno;右外連接
select e.empno,e.ename,e.job,d.deptno,d.dname2 from emp e right join dept d3 on e.deptno=d.deptno;自然連接
select empno,ename,job,dname2 from emp natural join dept3 where sal >2000;自身連接
select em2.ename 上層管理者,em1.ename as 下屬員工2 from emp em1 left join emp em23 on em1.deptno=em2.deptno4 order by em1.mgr;常用函數(shù)
1.dual 是系統(tǒng)內(nèi)部提供的一個用于實現(xiàn)臨時數(shù)據(jù)計算的特殊表
2.ASCII() 返回一個字符的ASCII碼
3.Concat(S1,S2) 該函數(shù)將字符串S2連接到S1的后面
4.Initcap() 第一個字母大寫
5.InSTR(s1,s2,i,j) 用于返回字符S2在字符串S1中第j次出現(xiàn)時的位置,搜索從字符串S1的第i個字符開始。
6.Select instr (‘oracle 11g’,’1’,3,2) abc from dual ABC
7.LTRIM(S1,S2) 刪除S1左邊的s2
8.RTRIM(S1,S2) 刪除S1右邊的S2
9.Trim 刪除s1左右的說s2
10.Replace (s1,s2,s3) 用s3替換出現(xiàn)在S1字符中的所有s2字符串。
11.SUBSTR(S,i,[j]) 表示從字符串s的第i個位置開始截取長度為j子字符串。
數(shù)字類函數(shù):
13.Ceil(n) 返回大于或等于數(shù)值n的最小整數(shù)
14.FLORR(n) 返回小于或等于數(shù)值n的最大整數(shù) 轉(zhuǎn)化型函數(shù):
15.to_char() 將表達式轉(zhuǎn)換為字符串
16.to_number(S,[format[lan]]) 返回字符串S所代表的的數(shù)字
聚合函數(shù):
select count(empno) as 員工總數(shù),round(avg(sal),2) as 平均工資 from
emp;
子查詢
select empno,ename,job from empwhere deptno=(select deptno from dept where dname='RESEARCH');提示:
子查詢不能包括 Order by
多行子查詢
使用 in查詢
查詢不是銷售部門的員工信息
使用 ANY查詢
查詢工資大于部門標號為10的任意一個員工工資的其他部門的員工信息
select deptno,ename,sal from emp where sal> any(select sal from emp where deptno=10) and deptno<>10;使用ALL查詢
查詢工資大于部門編號為30的所有員工工資的員工信息
select empno,ename,job from emp wheresal> ALL(select sal from emp where deptno=30);關(guān)聯(lián)子查詢
查詢工資大于同職位的平均工資的員工信息。
select empno,ename,salfrom emp fwhere sal >(select avg(sal) from emp where job=f.job)order by job;插入語句:
insert into dept(deptno,dname,loc) values (88,'design','beijing');更新數(shù)據(jù):
update emp set sal=sal*1.2where job='SALSMAN';刪除數(shù)據(jù):
delete from scott.emp where empno=7369;Truncate語句:
刪除表記錄,不可回滾。
事務(wù):
原子性、一致性、隔離性、持久性
操作事務(wù):
Commit、ROLLBACK、savepoint
EXISTS 是判斷是否存在,和in類似,但效率要比in高,返回True 或False
SELECT * FROM EMP (基礎(chǔ)表) WHERE EMPNO > 0 AND EXISTS (SELECT ‘X' FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO AND LOC = ‘MELB')SELECT * FROM EMP (基礎(chǔ)表) WHERE EMPNO > 0 AND DEPTNO IN(SELECT DEPTNO FROM DEPT WHERE LOC = ‘MELB')第六章 PL/SQL編程
PL/SQL程序都是以塊為基本單位,分三部分:
聲明部分(declare) 執(zhí)行部分(begin開頭) 異常處理(exception) end
計算兩個數(shù)的和與兩個數(shù)的差的商
Eg:
數(shù)據(jù)類型、變量和常量
(一)基本數(shù)據(jù)類型
1.數(shù)值類型
數(shù)值類型主要包括number(儲存整數(shù)或浮點數(shù))、PLS_INTEGER(pls_integer)和BINARY_INTEGER(binary_interger)只儲存整數(shù)
Number(p,s) 參數(shù)p: 表示精度(有效數(shù)字) 參數(shù)S:表示刻度范圍
number(9,2)9表示這個數(shù)據(jù)的有效位數(shù)(精度),2表示兩個小數(shù)位(刻度)例如:1234567.89 允許有7位整數(shù),小數(shù)點后2位小數(shù)
(二)特殊類型:
1.%TYPE類型
使用%type關(guān)鍵字聲明一個與列名稱類型完全相同的數(shù)據(jù)類型
輸出emp表中編號為7369的員工名稱和職務(wù)信息
set serveroutput on; SQL> declare 2 var_ename emp.ename%type;3 var_job emp.job%type;4 begin5 select ename,job into 6 var_ename,var_job7 from emp 8 where empno=7369;9 dbms_output.putline(var_name||'的職務(wù)是'||var_job);10 end; 11 /2.RECORD類型(記錄類型)
使用該類型可以儲存由多個列值組成的一行數(shù)據(jù)。
舉例:聲明一個記錄類型emp_type,然后使用該類型的變量儲存emp表中的一條記錄信息,并輸出這條記錄信息。
3.%ROWTYPE類型
可以根據(jù)數(shù)據(jù)表中行的結(jié)構(gòu)定義一種特殊的數(shù)據(jù)類型,用來儲存存數(shù)據(jù)表中檢索到的一行數(shù)據(jù)。
比如:聲明一個%rowtype類型的變量rowVar_emp,然后使用該變量儲存emp表中的一行數(shù)據(jù),代碼如下:
流程控制語句
1.If…then
end if
舉例:使用if…then 語句比較兩個字符串變量
2.If…then
…
else
end if
通過if…else語句實現(xiàn)只有年齡大于等于56歲才可以申請退休,否則提示不可以退休。
3.If…then
…
Elsif … then
…
Else
…
End if
4.Case語句:
Case <selector> When <expression 1> then plsql_sentences_1; When <expression 2> then plsql_sentences_2; When <expression 3> then plsql_sentences_3; When <expression 4> then plsql_sentences_4; End case;舉例: 指定一個季節(jié),使用case語句說明月份信息
Set serveroutput on;DeclareSeason int:=3;Aboutinfo varchar2(50); BeginCase seasonWhen 1 then Aboutinfo:=season||’季節(jié)包括1,2, 3月份’; When 2 then Aboutinfo:=season||’季節(jié)包括7,8,9月份’;End case;Dbms_output.putline(Aboutinfo);End;/5.循環(huán)語句
Loop語句
舉例: 用loop函數(shù)求前100個自然數(shù)的和,輸出到屏幕上去。
Set serveroutput on; Declare Sum_i int:=0;i int:=0; BeginLoopi:=i+1;Sum_i=Sum_i+i;Exit when i=100;End loop;Dbms_output.putline(‘’);End; /6 . While 語句
舉例:
7 . for語句
舉例:前100個自然數(shù)中偶數(shù)之和
PL/SQL游標
通常用于查詢結(jié)果集,每次只能讀取一行數(shù)據(jù)
4個步驟如下:
1.聲明游標
Cursor cur_name(intput _parameter1)Intput_parameter1:參數(shù)
定義如下:
舉例:聲名一個游標,用來讀取emp表中職務(wù)為 銷售員的信息;
Declare Cursor cur_emp(var_job in varchar2:=’SALESMAN’)Is select empno,ename,sal From emp; Where job=var_job;2.打開游標
Open cur_name(value) Open cur_emp(‘MANAGER’);3.讀取游標
Fetch cur_name into {variable}舉例:
Declare Cursor cur_emp(var_job in varchar2:=’SALESMAN’) Is select empno,ename,salFrom emp Where job=var_job; Type record_emp is record ( Var_emp emp.empno%type,Var_ename emp.ename%type,Var_sal emp.sal%type );Emp_row record_emp; BeginOpen cur_emp(‘MANAGER’);Fetch cur_emp into emp_row; While cur_emp%found loop Dbms_output.putline();Fetch cur_emp into emp_row; End loop; Close cur_emp; End; /4.關(guān)閉游標
Close cur_name;游標屬性
%found:布爾型屬性,如果SQL語句至少影響一行數(shù)據(jù),該屬性為true,否則為false; %rowcount:數(shù)字型屬性,返回SQL語句影響的行數(shù)。 %isopen:布爾型屬性打開游標為true,關(guān)閉為false。 SQL> set serveroutput on; SQL> declare2 var_ename varchar2(50);3 var_job varchar2(50);4 cursor cur_emp5 is select ename,job6 from emp7 where empno=7499;8 begin9 open cur_emp10 fetch cur_emp into var_ename,var_job;11 if cur_emp%found then12 dbms(‘’|| ||’, ’||);13 else14 dbms(‘’);15 end if;16 end 17 /存儲過程
只能通過execut命令執(zhí)行
儲存過程:
舉例:
Create or replace procedure insert_dept(Num_deptnp in number,var_ename in varchar2,Var_loc in varchar2 ) is Begin Insert into dept Values(num_deptno,var_ename,var_loc); Commit; End insert_dept;Oracle 邏輯存儲結(jié)構(gòu):
數(shù)據(jù)文件、控制文件、日志文件
Oracle物理存儲結(jié)構(gòu):
數(shù)據(jù)塊、數(shù)據(jù)區(qū)、段、表空間
Oracle數(shù)據(jù)
由實例、數(shù)據(jù)庫、程序全局區(qū)、前臺進程組成
實例可以分為系統(tǒng)全局區(qū)(SGA)、后臺進程(PMON,SMON)
PGA(程序全局區(qū))是一個非共享的內(nèi)存區(qū)域。
Spool命令把查詢結(jié)果輸入到指定文件中
事務(wù):
原子性、一致性、隔離性、持久性
聲明游標、打開游標、讀取游標、關(guān)閉游標
Execute();
重命名表空間:
SqlPlus column命令用法
column是sqlplus里最實用的一個命令,很多時候sql語句輸出的列寬度不合適而影響查看,都需要用到這個命令來更改select語句中指定列的寬度和標題。大部分時候,我們可以簡寫column為col即可,主要有以下用法:
修改列寬度
col c1 format a20 –將列c1(字符型)顯示最大寬度調(diào)整為20個字符 col c1 format 9999999 –將列c1(number型)顯示最大寬度調(diào)整為7個字符修改列標題
col c1 heading c2 –將c1的列名輸出為c2設(shè)置列的對齊方式
SQL> col ename justify left/right/center; SQL> select empno, ename, job from emp;注意:對于number類型的數(shù)據(jù)默認為右對齊,其他默認為左對齊
隱藏某列顯示:col job noprint
格式化number類型列的顯示:column sal format $999,999.00
SQL> column sal format $999,999.00 SQL> select empno, ename, sal from emp;設(shè)置列值,若列植為空以text代替
SQL> col comm null text SQL> select * from emp;顯示列的當前屬性
SQL> column ename;重置為默認值:
SQL> clear columns;一行只顯示數(shù)字位的長度, 超過長度折行, 加word_wrapped后, 單詞不會折行
column info format a40 word_wrapped設(shè)置列頭
sql> column ename heading '姓名' format a15觸發(fā)器例題
為emp表創(chuàng)建一個觸發(fā)器,當執(zhí)行插入操作時,統(tǒng)計操作后員工人數(shù);當執(zhí)行更新工資操作時,統(tǒng)計更新后員工平均工資;當執(zhí)行刪除操作時,統(tǒng)計刪除后各個部門的人數(shù)。
CREATE OR REPLACE TRIGGER trg_emp_dml AFTER INSERT OR UPDATE OR DELETE ON emp DECLAREv_count NUMBER;v_sal NUMBER(6,2); BEGINIF INSERTING THEN SELECT count(*) INTO v_count FROM emp;DBMS_OUTPUT.PUT_LINE(v_count);ELSIF UPDATING THENSELECT avg(sal) INTO v_sal FROM emp;DBMS_OUTPUT.PUT_LINE(v_sal);ELSEFOR v_dept IN (SELECT deptno,count(*) num FROM emp GROUP BY deptno) LOOPDBMS_OUTPUT.PUT_LINE(v_dept.deptno||' '||v_dept.num);END LOOP;END IF; END trg_emp_dml;為emp表創(chuàng)建一個觸發(fā)器,當插入新員工時顯示新員工的員工號、員工名;當更新員工工資時,顯示修改前后員工工資;當刪除員工時,顯示被刪除的員工號、員工名。
CREATE OR REPLACE TRIGGER trg_emp_dml_row BEFORE INSERT OR UPDATE OR DELETE ON emp FOR EACH ROW BEGINIF INSERTING THEN DBMS_OUTPUT.PUT_LINE(:new.empno||' '||:new.ename);ELSIF UPDATING THENDBMS_OUTPUT.PUT_LINE(:old.sal||' '||:new.sal);ELSEDBMS_OUTPUT.PUT_LINE(:old.empno||' '||:old.ename);END IF; END trg_emp_dml_row;修改員工工資時,保證修改后的工資高于修改前的工資。
CREATE OR REPLACE TRIGGER trg_emp_update_row BEFORE UPDATE OF sal ON emp FOR EACH ROW WHEN(new.sal<=old.sal) BEGINRAISE_APPLICATION_ERROR(-20001,'The salary is lower!'); END trg_emp_update_row;創(chuàng)建一個包括員工及其所在部門信息的視圖empdept,然后向視圖中插入一條記錄(2345,’TOM’,3000,’SALES’)
create or replace trigger tri_insert_viewinstead of inserton view_emp_dept--創(chuàng)建一個關(guān)于view_emp_dept視圖的替換觸發(fā)器for each row--是行級視圖 declarerow_dept dept%rowtype; beginselect * into row_dept from dept where deptno = :new.deptno;--檢索指定部門編號的記錄行if sql%notfound then--未檢索到該部門編號的記錄insert into dept(deptno,dname)values(:new.deptno,:new.dname);--向dept表中插入數(shù)據(jù)end if;insert into emp(empno,ename,deptno,job,hiredate)values(:new.empno,:new.ename,:new.deptno,:new.job,:new.hiredate);--向emp表中插入數(shù)據(jù) end tri_insert_view; /當數(shù)據(jù)庫中執(zhí)行CREATE操作時,將創(chuàng)建的對象信息記錄到ddl_creations表中。
CREATE TABLE ddl_creations (user_id VARCHAR2(30),object_type VARCHAR2(20),object_name VARCHAR2(30),object_owner VARCHAR2(30),creation_date DATE);CREATE OR REPLACE TRIGGER log_creations AFTER CREATE ON DATABASE BEGININSERT INTO ddl_creationsVALUES(ora_login_user, ora_dict_obj_type, ora_dict_obj_name, ora_dict_obj_owner, sysdate); END log_creations;為了實現(xiàn)在更新員工所在部門或向部門插入新員工時,部門中員工人數(shù)不超過8人,可以在emp表上創(chuàng)建兩個觸發(fā)器,同時創(chuàng)建一個共享信息的包。
CREATE OR REPLACE PACKAGE mutate_pkg ASv_deptno NUMBER(2); END;CREATE OR REPLACE TRIGGER rmutate_trigger BEFORE INSERT OR UPDATE OF deptno ON EMP FOR EACH ROW BEGINshare_pkg.v_deptno:=:new.deptno; END; CREATE OR REPLACE TRIGGER smutate_trigger AFTER INSERT OR UPDATE OF deptno ON EMP DECLAREv_num number(3); BEGINSELECT count(*) INTO v_num FROM emp WHERE deptno=share_pkg.v_deptno;IF v_num>8 THENRAISE_APPLICATION_ERROR(-20003,'TOO MANY EMPLOYEES IN DEPARTMENT '||share_pkg.v_deptno);END IF; END;選擇題
1.有4條與游標有關(guān)的語句,它們在程序中出現(xiàn)的正確順序是:( B )
A.1、2、3、4 B.2、1、3、4
C.2、3、1、4 D.1、3、2、4
2.數(shù)據(jù)庫運行在歸檔模式下,如果發(fā)生日志切換,為了保證不覆蓋舊的日志信息,系統(tǒng)將啟動如下哪個進程?( D )
A.DBWR B.LGWR
C.SMON D.ARCH
3.對于ROLLBACK命令,以下準確的說法是:( C )
A.撤銷剛剛進行的數(shù)據(jù)修改操作
B.撤銷本次登錄以來所有的數(shù)據(jù)修改
C.撤銷到上次執(zhí)行提交或回退操作的點
D.撤銷上一個COMMIT命令
4.創(chuàng)建表空間時,可以指定表空間中存儲對象的默認存儲參數(shù),其中哪個參數(shù)用于設(shè)置分配給每一個對象的初始區(qū)大小( B )
A.NEXT B.INITIAL
C.PCTINCREASE D.MINEXTENTS
5.現(xiàn)將CONNECT 角色授予TEXT_ROLE角色,下面哪個語句可以實現(xiàn)( D )
A.GRANT ROLE CONNECT ON TEST_ROLE;
B.GRANT ROLE CONNECT TO TEST_ROLE;
C.GRANT CONNECT ON TEST_ROLE;
D.GRANT CONNECT TO TEST_ROLE;
填空題
1.Oracle數(shù)據(jù)庫系統(tǒng)的物理存儲結(jié)構(gòu)主要有三類文件組成,分別: 數(shù)據(jù)文件 和 控制文件 和 日志文件 。邏輯存儲結(jié)構(gòu)包括 數(shù)據(jù)塊,數(shù)據(jù)區(qū),段,表空間 。
2.SQL*Plus中直接調(diào)用過程的關(guān)鍵字是 EXECUT ;查詢中去掉重復的行,必須使用的關(guān)鍵字是 DISTINCT ; 關(guān)鍵字 DESCRIBE 可以用來顯示表的結(jié)構(gòu)信息。
3.使用EXPORT命令時,可以有3種不同方式導出數(shù)據(jù),表方式(T方式) 就是導出一個指定的基本表,包括表的定義和數(shù)據(jù)及表上的索引、約束等。 用戶 方式(U方式) 是導出一個用戶的所有對象,包括表、視圖、存儲過程、序列等。 全庫方式 (Full方式) 是導出數(shù)據(jù)庫中所有的對象。
4.在ORACLE數(shù)據(jù)庫中,將權(quán)限分為兩類即 系統(tǒng)權(quán)限 和 對象權(quán)限 ,分別指在系統(tǒng)級控制數(shù)據(jù)庫的存取和使用機制和在模式對象上控制存取和使用的機制。
判斷題
1.INSERT(改為UPDATA)事件觸發(fā)器中可以使用:old偽記錄;DELETE事件觸發(fā)器中可以使用:new偽記錄。 ( 錯 )
2.后臺進程LGWR的作用是數(shù)據(jù)庫寫入程序。 ( 錯 )
3.Alter user tempuser Identified by oracle Default tablespace users Default temporary tablsespace temp Quota 100M on users ( 對 )
4.SQL*PLUS中,顯示登錄的用戶的命令是DESCRIB user。 ( 錯 )
5.默認登錄Oracle Enterprise Manager Database Control 的端口號是1158。( 對 )
簡答題
1.How to connect remote oracle server by SQLPLUS? Please write down the steps and the operating statements?
如何通過SQLPLUS連接遠程oracle服務(wù)器?請把操作步驟和操作報表寫下來。
方式一:
簡易連接,不用進行網(wǎng)絡(luò)配置,其實就是tnsname.ora文件,但只支持oracle10G以上。 命令:sqlplus 用戶名/密碼@ip地址[:端口]/service_name [as sysdba]
示例:sqlplus sys/pwd@ip:1521/test as sysdba
備注:使用默認1521端口時可省略輸入
方式二:進行網(wǎng)絡(luò)配置 oracle9i和以前的版本
1.圖形化操作:Net Configuration Assistant–> 本地Net服務(wù)名配置–>添加->服務(wù)名->協(xié)議(選tcp)->主機名稱->端口->完成。
2.(最常用):配置監(jiān)聽,配置tnsname.ora文件
例如:
方式三:(EZConnect字符串):
配置sqlnet.ora文件:
2.What is the difference between procedures and functions in the Oracle database?(Oracle數(shù)據(jù)庫中的過程和函數(shù)有什么不同)
1.存儲過程定義關(guān)鍵字用procedure,函數(shù)定義用function。 2.存儲過程中不能用return返回值,但函數(shù)中可以,而且函數(shù)中必須有return子句。
3.函數(shù)可以可以在查詢語句中直接調(diào)用單獨執(zhí)行,存儲過程必須通過execute執(zhí)行單獨調(diào)用
4.函數(shù)可以當做表達式使用
3.讀懂如下程序:
CREATE OR REPLACE FUNCTION ret_deptinfo(p_deptno dept.deptno%TYPE, p_num OUT NUMBER, p_max OUT NUMBER) RETURN dept.dname%TYPE ASv_dname dept.dname%TYPE; BEGINSELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;SELECT count(*),max(sal) INTO p_num,p_max FROM emp WHERE deptno=p_deptno;RETURN v_dname; END ret_deptinfo;分析程序?qū)崿F(xiàn)的功能:
4.輸入和運行以下程序:
CREATE OR REPLACE TRIGGER CHECK_SAL BEFORE UPDATE ON emp FOR EACH ROW BEGIN IF :new.job='CLERK' AND (:new.sal<500 OR :new.sal>1000) THENRAISE_APPLICATION_ERROR(-20001, '工資修改超出范圍,操作取消!'); END IF; END;分析程序?qū)崿F(xiàn)的功能:
設(shè)計題
1、創(chuàng)建一個存儲過程,以部門號為參數(shù),查詢該部門的平均工資,并輸出該部門中比平均工資高的員工號、員工名。并且調(diào)用該存儲過程,要求根據(jù)輸入部門編號,查詢平均工資及輸出比平均工資高的員工號、員工名。
CREATE OR REPLACE PROCEDURE show_emp( p_deptno emp.deptno%TYPE) ASv_sal emp.sal%TYPE; BEGINSELECT avg(sal) INTO v_sal FROM emp WHERE deptno=p_deptno;DBMS_OUTPUT.PUT_LINE(p_deptno||' '||'average salary is:' ||v_sal);FOR v_emp IN (SELECT * FROM emp WHERE deptno=p_deptno AND sal>v_sal) LOOPDBMS_OUTPUT.PUT_LINE(v_emp.empno||' '||v_emp.ename);END LOOP; EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The department doesn’’t exists!'); END show_emp;過程調(diào)用語句:
declare vdeptno emp.detpno%type; Begin vdeptno:=&deptno; show_emp(vdeptno); End;2、創(chuàng)建一個函數(shù),以部門號為參數(shù),返回部門名、部門人數(shù)及部門平均工資。并且調(diào)用該函數(shù),輸出所有有員工的部門的名稱、部門人數(shù)和平均工資。
CREATE OR REPLACE FUNCTION ret_deptinfo( p_deptno dept.deptno%TYPE,p_num OUT NUMBER, p_avg OUT NUMBER) RETURN dept.dname%TYPE ASv_dname dept.dname%TYPE; BEGINSELECT dname INTO v_dname FROM dept WHERE deptno=p_deptno;SELECT count(*),avg(sal) INTO p_num,p_avg FROM emp WHERE deptno=p_deptno;RETURN v_dname; END ret_deptinfo; 函數(shù)調(diào)用語句: DECLAREv_avgsal emp.sal%TYPE;v_num NUMBER;v_dname dept.dname%TYPE; BEGINFOR v_dept IN (SELECT DISTINCT deptno FROM emp) LOOPv_dname:=ret_deptinfo(v_dept.deptno,v_num,v_avgsal);DBMS_OUTPUT.PUT_LINE(v_dname||' '||v_maxsal||' '|| v_avgsal||' '||v_num);END LOOP; END;3、創(chuàng)建學生表student(sno,sname,sex,sage),要求學號sno主鍵,姓名sname不能重復, 性別sex只能是‘男’或者‘女’,年齡sage在15到25之間。創(chuàng)建課程表course(cno,cname),要求課程號cno主鍵,課程名cname唯一,同時為主鍵約束列上的唯一性索引設(shè)置存儲位置和存儲參數(shù)。創(chuàng)建學生選課表SC(sno,cno,grade),要求成績grade大于0小于100,有兩位小數(shù),sno,cno都是外鍵,而且sno,cno一起做主鍵。
CREATE TABLE student(sno NUMBER(6) CONSTRAINT S_PK PRIMARY KEY,sname VARCHAR2(20) UNIQUE,sex CHAR(2) CONSTRAINT S_CK1 CHECK(sex in('男', '女')),sage NUMBER(6,2) CONSTRAINT S_CK2 CHECK(sage between 15 and 25)); CREATE TABLE course(cno NUMBER(6) PRIMARY KEY,cname CHAR(20) UNIQUE USING INDEX TABLESPACE USERSTORAGE (INITIAL 64K NEXT 64K)); CREATE TABLE SC(sno NUMBER(6) REFERENCES student(sno),cno NUMBER(6) REFERENCES course(cno),grade NUMBER(5,2) CHECK(grade between 0 and100),CONSTRAINT SC_PK PRIMARY KEY(sno, cno) );4、創(chuàng)建用戶user2,口令為user2,默認表空間為USERS,在該表空間的配額為10 MB,初始狀態(tài)為鎖定。創(chuàng)建用戶user3,口令為user3,默認表空間為USERS,在該表空間的配額為10 MB,概要文件為example_profile(假設(shè)該概要文件已經(jīng)創(chuàng)建),為用戶user2授予CREATE SESSION,CREATE TABLE ,CREATE VIEW系統(tǒng)權(quán)限。user2獲得權(quán)限后,為用戶user3授予CREATE TABLE權(quán)限。然后回收user2的CREATE TABLE權(quán)限。
SQL> conn system/oracle@orcl 或者 conn / as sysdba 僅供參考,正確就行 SQL>CREATE USER user2IDENTIFIED BY user2DEFAULT TABLESPACE USERS QUOTA 10M ON USERSACCOUNT LOCK; SQL> CREATE USER user3 IDENTIFIED BY user3 DEFAULT TABLESPACE USERS QUOTA 10M ON USERSPROFILE example_profile ; SQL> GRANT CREATE SESSION,CREATE TABLE,CREATE VIEWTO user2 WITH ADMIN OPTION; SQL> CONNECT user2/user2 @ORCL SQL> GRANT CREATE TABLE TO user3; SQL> conn system/oracle@orcl 或者 conn / as sysdba SQL> revoke CREATE TABLE from user2;5、使用EXPDP導出scott模式相關(guān)數(shù)據(jù),并使用IMPDP 將剛剛導出的scott模式相關(guān)數(shù)據(jù)導入到system模式,寫出核心操作語句。
1、創(chuàng)建DIRECTORY :create directory dir_dp as 'D:/oracle/dir_dp'; 2、授權(quán) :Grant read,write on directory dir_dp to scott; 3、執(zhí)行導出 expdp scott/tiger@orcl schemas=scott directory=dir_dp dumpfile =expdp_test1.dmp logfile=expdp_test1.log; 4、執(zhí)行導入 impdp system/oracle@orcl directory=dir_dp dumpfile =expdp_test1.dmp remap_schema=scott:system logfile=impdp_test1.log;實驗一
(1)使用Scott用戶:
(2)顯示所有薪水低于3000的雇員的工作、姓名和工資:
(3)添加一個居中、兩行顯示的表頭“Employee Report”和一個居中的頁腳“Confidential”:
(4)重新命名工作列標題為“Job Category”,分兩行。重新命名姓名列標題為“Employee”,重新命名工資列標題為“Salary”并且格式化為$9,999.99
(5)文件操作
SQL> select job,ename,sal from emp;
星期日 9月 22 第 1
Employee Report
Job
Category Employee Salary
CLERK SMITH 800
SALESMAN ALLEN 1600
SALESMAN WARD 1250
MANAGER JONES 2975
SALESMAN MARTIN 1250
MANAGER BLAKE 2850
MANAGER CLARK 2450
ANALYST SCOTT 3000
PRESIDENT KING 5000
SALESMAN TURNER 1500
CLERK ADAMS 1100
CLERK JAMES 950
ANALYST FORD 3000
CLERK MILLER 1300
Confidential
已選擇14行。
SQL> spo off;
實驗二
分析:
相同點:兩者都為子查詢,有著相似的格式,對于查詢的結(jié)果兩者具有相同的作用。
不同點:not in 前需跟上返回且需比較的列名。
not esists定義:子查詢不返回任何一行時條件為true,是對"行”的比較
not in定義: 與子查詢返回結(jié)果中任何一個值都不等,是對“數(shù)值”的比較,需加上數(shù)值所屬的列名
實驗三
1、
2、
select * from emp where hiredate >to_date(‘1982/1/1’,’yyyy/mm/dd’);3、
select max(sal),avg(sal) from emp order by deptno,job;4、
select *from emp where (deptno, job)=(select deptno,job from emp where ename='SMITH'); select * from emp where deptno = (select deptno from emp where ename='SMITH') and job = (select job from emp where ename='SMITH');5、
select e.ename,e.job,m.ename,d.dname from emp e,emp m,dept d where e.mgr=m.empno and e.deptno = d.deptno;6、 待定
select dname,count(*) from dept where deptno in(select deptno from emp where sal>1000 group by deptno having count(deptno)>2);7、
select e1.empno,e1.ename from emp e1,emp e2where e1.job=e2.job and e1.hiredate>e2.hiredate and e1.sal>e2.sal;8、
右連接
左連接
select empno,ename,dname from dept left join emp on deptno=emp.deptno and dept.deptno=20; select empno,ename,dname from dept,emp where dept.deptno=emp.deptno(+) and dept.deptno(+)=20;9、
select * from emp where empno in(select mgr from emp where mgr is not null);10、
declare變量聲明、初始化 begin 業(yè)務(wù)處理、邏輯代碼 exception 異常捕獲 end;11、
DECLARETYPE t_emp IS RECORD(empno NUMBER(4), ename CHAR(10),sal NUMBER(6,2));v_emp t_emp; BEGINSELECT empno,ename,sal INTO v_emp FROM emp WHERE empno=7844;DBMS_OUTPUT.PUT_LINE(v_emp.ename||' '||v_emp.sal); END;12、
DECLARE v_empno NUMBER(4); BEGINv_empno:=&x;UPDATE emp SET sal=sal+100 WHERE empno=v_empno; END; create or replace procedure ChangeSal(p_empno in emp.empno%type,p_sal in emp.sal%type) as beginupdate set emp sal=p_sal where empno=p_empno; end;13、
create or replace procedure ChangeSal( p_empno in emp.empno%type) asp_deptno emp.deptno%type; beginselect deptno into p_deptno from emp where empno=p_empnoif p_deptno = 10 thenupdate emp set sal = sal+100 where empno = p_empnoelsif p_deptno = 20 thenupdate emp set sal = sal+160 where empno=p_empnoelsif p_deptno = 30 thenupdate emp set sal = sal+200 where empno=p_empnoelseupdate emp set sal = sal+300 where empno=p_empnoend if; end;14、
declare p_ename emp.empno%type; p_job emp.job%type cursor cur_emp is select ename,job from emp where empno=7654; begin open cur_emp; fetch cur_emp into p_ename,p_job; if cur_emp%found then dbms_output.put_line('名字:'||p_ename||' 職務(wù):'||p_job) else dbms_output_line('無數(shù)據(jù)記錄'); end if; end;15、
CREATE OR REPLACE PROCEDURE return_deptinfo(p_deptno emp.deptno%TYPE,p_avgsal OUT emp.sal%TYPE,p_count OUT emp.sal%TYPE) AS BEGINSELECT avg(sal),count(*) INTO p_avgsal,p_count FROM emp WHERE deptno=p_deptno; EXCEPTIONWHEN NO_DATA_FOUND THENDBMS_OUTPUT.PUT_LINE('The department don’’t exists!'); END return_deptinfo;16、
create or replace function return_avg(p_deptno emp.deptno%type) return number isp_avgsal emp.sal%type; beginselect avg(sal) into p_avgsal from emp where deptno = p_deptno;return (p_avgsal); exceptionwhen no_data_found thendbms_output.putline('該部門編號不存在');return (0); end;17、
create or replace trigger tri_emp after insert or update or delete on emp declarev_count number;v_sal number(6,2); beginif inserting thenselect count(*) into v_count from emp;dbms_output.put_line(v_count);elsif updating thenselect avg(sal) into v_sal from emp;dbms_output.put_line(v_sal);elsefor v_dept in (select deptno,count(*) num from emp group by deptno)loopdbms_output.putline(v_dept.deptno||' '||v_dept.num);end loop;end if; end;18、
create or replace package pack_emp isfunction return_avg(p_deptno emp.deptno%type) return number;procedure change_sal(p_job emp.job%type,p_sal emp.sal%type);end pack_emp;19、
create or replace package body pack_emp isfunction return_info(p_deptno emp.empno%type) return number isp_avgsal emp.sal%type;beginselect avg(sal) into p_avgsal from emo where deptno = p_deptno;return (p_avgsal);exceptionwhen no_data_found thendbms_output.putline('該部門編號不存在');return 0;end return_avg;procedure change_sal(p_job emp.job%type,p_sal emp.sal%type)beginupdate emp set sal = sal*(1+p_sal) where job=p_job;end change_sal; end;20、
declarep_deptno emp.deptno%type;p_job emp.job%type;p_avgsal emp.sal%type;p_sal emp.sal%type; beginp_deptno :=10;p_avgsal :=pack_emp.return_avg(p_deptno);dbms_output.putline(p_deptno||'號部門的平均工資是:'||'p_avgsal');p_job :='SALESMSN';p_sal :=0.1;pack_emp.chang_sal(p_job,p_sal); end; 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Oracle复习(知识点、练习题、实验)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邵东县汽车学校?
- 下一篇: 大众思皓x8plus口碑如何思浩三大件咋