日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Oracle复习(知识点、练习题、实验)

發(fā)布時(shí)間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle复习(知识点、练习题、实验) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 第一章 數(shù)據(jù)庫(kù)概念
      • 數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu):模式、外模式、內(nèi)模式
      • 三級(jí)模式之間的映射
    • 第二章 Oracle12g體系結(jié)構(gòu)
      • Oracle的邏輯存儲(chǔ)結(jié)構(gòu)
      • Oracle物理存儲(chǔ)結(jié)構(gòu)
      • Oracle11g服務(wù)器結(jié)構(gòu)
        • 系統(tǒng)全局區(qū)(SGA)
        • 程序全局區(qū)(PGA)
    • 第三章 Oracle數(shù)據(jù)庫(kù)的安裝與配置
    • 第四章 SQLPLUS命令
    • 第五章 SQL語(yǔ)言基礎(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游標(biāo)
    • SqlPlus column命令用法
    • 觸發(fā)器例題
    • 選擇題
    • 填空題
    • 判斷題
    • 簡(jiǎn)答題
    • 設(shè)計(jì)題
    • 實(shí)驗(yàn)一
    • 實(shí)驗(yàn)二
    • 實(shí)驗(yàn)三

第一章 數(shù)據(jù)庫(kù)概念

(1)數(shù)據(jù)模型通常由數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)操作和完整性約束3部分組成的
(2)常見(jiàn)的數(shù)據(jù)模型
層次模型、網(wǎng)狀模型和關(guān)系模型

1)層次模型:用樹(shù)型結(jié)構(gòu)表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型為層次模型
2)網(wǎng)狀模型:用有向圖結(jié)構(gòu)表示實(shí)體類型及實(shí)體間聯(lián)系的數(shù)據(jù)模型稱為網(wǎng)狀模型
3)關(guān)系模型:用二維表描述數(shù)據(jù)。

關(guān)系模型的基本術(shù)語(yǔ):

關(guān)系:一個(gè)二維表就是一個(gè)關(guān)系 元組:二維表中的一行,即表中的記錄。 屬性: 二維表中的一列,用類型和值表示 域:每個(gè)屬性取值的變化范圍

關(guān)系模型的完整性規(guī)則是對(duì)關(guān)系的某種約束條件。

實(shí)體完整性約束 參照完整性約束:關(guān)系之間的基本約束。 用戶自定義的完整性約束

數(shù)據(jù)庫(kù)系統(tǒng)由以下部分的構(gòu)成:
(1)數(shù)據(jù)庫(kù)
(2)數(shù)據(jù)庫(kù)管理系統(tǒng)
(3)應(yīng)用系統(tǒng)
(4)數(shù)據(jù)庫(kù)管理員
(5)用戶

關(guān)系操作包括查詢操作和更新操作:
查詢操作:
選擇、投影、連接、除、并、交、差
更新操作:
增加、刪除、修改

命令:
1、連接命令

conn 用戶名/密碼 或者 conn+網(wǎng)絡(luò)服務(wù)名稱

2、斷開(kāi)

disc[onnect] 用戶名/密碼

3、修改密碼

passw[ord] +自身 更改低級(jí)用戶密碼:alter user 用戶名 identity by +新密碼

4、創(chuàng)建用戶并設(shè)定密碼

create user 用戶名 identity by 密碼

5、刪除用戶

drop user 用戶名 [cascade] ----用戶下建表情況下使用

6、關(guān)閉數(shù)據(jù)庫(kù)實(shí)例

shut down by 密碼

7、啟動(dòng)數(shù)據(jù)庫(kù)

start up

數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu):模式、外模式、內(nèi)模式

(1)模式:稱為邏輯模式或概念模式,是對(duì)數(shù)據(jù)庫(kù)中全體數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是所有用戶的公共數(shù)據(jù)視圖。一個(gè)數(shù)據(jù)庫(kù)只有一個(gè)模式。

(2)外模式:外模式是模式的子集。外模式也稱為用戶模式,它是數(shù)據(jù)庫(kù)用戶能夠看見(jiàn)和使用的對(duì)局部數(shù)據(jù)的邏輯結(jié)構(gòu)和特征的描述,是數(shù)據(jù)庫(kù)用戶的數(shù)據(jù)視圖。

(3)內(nèi)模式:內(nèi)模式也成為存儲(chǔ)模式,一個(gè)數(shù)據(jù)庫(kù)只有一個(gè)內(nèi)模式。

三級(jí)模式之間的映射

外模式/模式映射
同一個(gè)模式可以有任意多個(gè)外模式。對(duì)于每一個(gè)外模式,數(shù)據(jù)庫(kù)系統(tǒng)都有一個(gè)外模式/模式映射。

模式/內(nèi)模式映射
數(shù)據(jù)庫(kù)只有一個(gè)模式和外模式,即模式/內(nèi)模式映射是唯一的

關(guān)系是一種規(guī)范化的二維表格,它具有以下特性:
屬性值具有原子性,不可分解
沒(méi)有重復(fù)的元組即沒(méi)有重復(fù)的行

鍵的類型:
超鍵:在一個(gè)關(guān)系中,能唯一標(biāo)識(shí)元組的屬性或?qū)傩约Q為關(guān)系的超鍵。
候選鍵:如果一個(gè)屬性集能夠唯一標(biāo)識(shí)元組,且又不含有多余的屬性,稱為關(guān)系的候選鍵。

關(guān)系型數(shù)據(jù)庫(kù)的設(shè)計(jì)范式
第一范式:屬性唯一,在數(shù)據(jù)表中的字段都是單一的,不可再分的
第二范式:不存在部分函數(shù)依賴
第三范式:不存在傳遞函數(shù)依賴。

第二章 Oracle12g體系結(jié)構(gòu)

三個(gè)概念去理解:實(shí)例、數(shù)據(jù)庫(kù)、數(shù)據(jù)庫(kù)服務(wù)器

Oracle的邏輯存儲(chǔ)結(jié)構(gòu)

Oracle數(shù)據(jù)庫(kù)是由多個(gè)表空間組成,而表空間又是有多個(gè)段組成,段由多個(gè)數(shù)據(jù)區(qū)組成,數(shù)據(jù)區(qū)由多個(gè)數(shù)據(jù)塊組成。

一)數(shù)據(jù)塊
數(shù)據(jù)塊是Oracle邏輯存儲(chǔ)結(jié)構(gòu)中的最小的邏輯單位,也是執(zhí)行數(shù)據(jù)庫(kù)輸入輸出操作的最小存儲(chǔ)單位。
Orale服務(wù)器以數(shù)據(jù)塊為單位管理數(shù)據(jù)文件的存儲(chǔ)空間。
二)數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)是由一組連續(xù)的Oracle數(shù)據(jù)塊所構(gòu)成的Oracle存儲(chǔ)結(jié)構(gòu),一個(gè)或多個(gè)數(shù)據(jù)塊組成一個(gè)數(shù)據(jù)區(qū),一個(gè)或多個(gè)數(shù)據(jù)區(qū)在組成一個(gè)段。
區(qū)為段分配空間,它由連續(xù)的數(shù)據(jù)塊組成。
當(dāng)段中所有空間已完全使用時(shí),系統(tǒng)自動(dòng)為該段分配一個(gè)新區(qū)。
區(qū)不能跨數(shù)據(jù)文件存在,只能存在于一個(gè)數(shù)據(jù)文件中。

三)段
段由一個(gè)或多個(gè)數(shù)據(jù)區(qū)組成。
段是構(gòu)成表空間的邏輯存儲(chǔ)結(jié)構(gòu),段由一組區(qū)組成。
按照段所存儲(chǔ)數(shù)據(jù)的特征,將段分為若干種類型,主要有數(shù)據(jù)段、索引段、回退段和臨時(shí)段。

4種段:
數(shù)據(jù)段、索引段、回滾段、臨時(shí)段

四)表空間
一個(gè)表空間由一個(gè)或多個(gè)數(shù)據(jù)文件組成,一個(gè)數(shù)據(jù)文件只屬于一個(gè)表空間。
Oracle數(shù)據(jù)的存儲(chǔ)空間邏輯上表現(xiàn)為表空間,而在物理上表現(xiàn)為數(shù)據(jù)文件。
每個(gè)數(shù)據(jù)庫(kù)至少一個(gè)表空間,表空間的大小等于所有從屬于它的數(shù)據(jù)文件大小的總和。
(1)System表空間
系統(tǒng)表空間,用于存放Oracle系統(tǒng)內(nèi)部表和數(shù)據(jù)字典的數(shù)據(jù),例如 列名
(2)Sysaux表空間
主要存儲(chǔ)除數(shù)據(jù)字典以外的其他數(shù)據(jù)中的對(duì)象
(3)UNDO表空間
撤銷表空間,用于存儲(chǔ)撤銷信息的表空間
(4)Users表空間
可以創(chuàng)建各種數(shù)據(jù)對(duì)象。

Oracle物理存儲(chǔ)結(jié)構(gòu)

Oracle數(shù)據(jù)庫(kù)的物理存儲(chǔ)結(jié)構(gòu)有多種物理文件組成,主要有數(shù)據(jù)文件、控制文件、重做日志文件、歸檔日志文件、口令文件和警告日志文件

(一)數(shù)據(jù)文件(.DBF)
數(shù)據(jù)文件是用于保護(hù)用戶應(yīng)用程序數(shù)據(jù)和Oracle系統(tǒng)內(nèi)部數(shù)據(jù)的文件
(1)系統(tǒng)數(shù)據(jù)文件
(2)撤銷數(shù)據(jù)文件
(3)用戶數(shù)據(jù)文件

(二)控制文件(.CTL)
二進(jìn)制文件,記錄數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)
每個(gè)數(shù)據(jù)庫(kù)至少擁有一個(gè)控制文件,一個(gè)數(shù)據(jù)庫(kù)可以同時(shí)擁有多個(gè)控制文件,一個(gè)控制文件只能屬于一個(gè)數(shù)據(jù)庫(kù)

(三)日志文件(.LOG)
日志文件主要記錄對(duì)數(shù)據(jù)所作的修改
(1)重做日志文件
用來(lái)記錄數(shù)據(jù)庫(kù)所有發(fā)生過(guò)的更改信息
SGA(系統(tǒng)全局區(qū))
LGWR(日志寫(xiě)入進(jìn)程)
ARCH(歸檔進(jìn)程)

(2)歸檔日志文件
(四)密碼文件、警告文件、跟蹤文件
(1)密碼文件
(2)警告文件
主要用來(lái)記錄Oracle系統(tǒng)的運(yùn)行信息和錯(cuò)誤信息

(3)跟蹤文件

Oracle11g服務(wù)器結(jié)構(gòu)

Oracle服務(wù)器主要由實(shí)例、數(shù)據(jù)庫(kù)、程序全局區(qū)和前臺(tái)進(jìn)程組成
實(shí)例可以分為系統(tǒng)全局區(qū)(SGA)、后臺(tái)進(jìn)程(PMON、SMON)兩部分
程序全局區(qū)(PGA)是一個(gè)非共享的內(nèi)存區(qū)域

內(nèi)存結(jié)構(gòu)=PGA+SGA
SGA:系統(tǒng)全局區(qū) 實(shí)例啟動(dòng)(共享)
PGA:程序全局區(qū) 服務(wù)器進(jìn)程啟動(dòng)(私有)

系統(tǒng)全局區(qū)(SGA)

主要高速緩沖區(qū)、共享池、重做日志緩沖區(qū)、java池、大型池等內(nèi)存結(jié)構(gòu)組成,分為三部分:
臟數(shù)據(jù)區(qū)、空閑區(qū)、保留區(qū)

(1)重置日志緩沖區(qū)
用于存放對(duì)數(shù)據(jù)庫(kù)進(jìn)行修改操作時(shí)產(chǎn)生的日志信息。

(2)共享池(保存生成執(zhí)行計(jì)劃)

select count(*) from emp;//生成執(zhí)行計(jì)劃 scott: select * from help;

共享池是SGA保留的內(nèi)存區(qū)域。
共享池是對(duì)SQL、PL/SQL程序進(jìn)行語(yǔ)法分析、編譯、執(zhí)行的內(nèi)存區(qū)域。
共享池由庫(kù)緩存和數(shù)據(jù)字典緩存組成。
共享池的大小直接影響數(shù)據(jù)庫(kù)的性能。

(4)數(shù)據(jù)緩沖區(qū)
用于存儲(chǔ)從磁盤數(shù)據(jù)文件中讀入的數(shù)據(jù),所有用戶共享。
Oracle的用戶都是從數(shù)據(jù)緩沖區(qū)讀數(shù)據(jù)。

服務(wù)器進(jìn)程中將讀入的數(shù)據(jù)保存在數(shù)據(jù)緩沖區(qū)中,當(dāng)后續(xù)的請(qǐng)求需要這些數(shù)據(jù)時(shí)可以在內(nèi)存中找到,不需要再?gòu)拇疟P讀取,提高了讀取速度。
數(shù)據(jù)緩沖區(qū)的大小對(duì)數(shù)據(jù)庫(kù)的讀取速度有直接的影響。

(3)日志緩沖區(qū)
日志記錄數(shù)據(jù)庫(kù)的所有修改信息,日志信息首先產(chǎn)生于日志緩沖區(qū)。
當(dāng)日志緩沖區(qū)的日志數(shù)據(jù)達(dá)到一定數(shù)量時(shí),由后臺(tái)進(jìn)程將日志數(shù)據(jù)寫(xiě)入日志文件中。
相對(duì)來(lái)說(shuō),日志緩沖區(qū)對(duì)數(shù)據(jù)庫(kù)的性能影響較小。
符合以下任一條件日志緩沖區(qū)數(shù)據(jù)寫(xiě)入日志文件中:

(1)日志緩沖區(qū)容量達(dá)到三分之一 (2)日志緩沖區(qū)容量達(dá)到一兆 (3)三秒后

(4)大型池

Oracle splile:動(dòng)態(tài)參數(shù)文件

(5)Java池
(6)流池
用于數(shù)據(jù)庫(kù)與數(shù)據(jù)庫(kù)之前的信息共享。

程序全局區(qū)(PGA)

又稱用戶進(jìn)程全局區(qū),它的內(nèi)存在進(jìn)程私有區(qū)而不是共享區(qū)中。
(1)私有SQL區(qū)
(2)會(huì)話區(qū)

1、會(huì)話是用戶與Oracle服務(wù)器的單個(gè)連接 2、當(dāng)用戶與服務(wù)器斷開(kāi)連接時(shí)關(guān)閉會(huì)話 3、當(dāng)用戶與服務(wù)器建立連接時(shí)創(chuàng)建會(huì)話 4、從V$ Session中查詢會(huì)話信息

前臺(tái)程序
A.用戶進(jìn)程
能生成或執(zhí)行SQL語(yǔ)句,稱為用戶進(jìn)程
B.服務(wù)器進(jìn)程

后臺(tái)程序
Oracle后臺(tái)程序是實(shí)例的重要組成部分,其中,SMON,PMON,DBWR,LGWR,CKPT這5個(gè)后臺(tái)程序必須正常啟動(dòng)。

1.數(shù)據(jù)寫(xiě)入進(jìn)程 數(shù)據(jù)寫(xiě)入操作(DBWR)的主要任務(wù)是負(fù)責(zé)將內(nèi)存中的“臟”數(shù)據(jù)快回寫(xiě)到數(shù)據(jù)文件中。 “臟”數(shù)據(jù)是指高速數(shù)據(jù)緩沖區(qū)中的被修改過(guò)的數(shù)據(jù)塊
1)管理系統(tǒng)緩沖區(qū),將最近使用過(guò)的塊保留是在內(nèi)存中
2)將修改后的緩沖區(qū)數(shù)據(jù)寫(xiě)入數(shù)據(jù)文件中。

2.檢查點(diǎn)進(jìn)程 檢查點(diǎn)進(jìn)程(CKPT)可以看做是一個(gè)事件,當(dāng)檢查點(diǎn)事件發(fā)生時(shí),CKPT會(huì)要求DBWR將某些“臟數(shù)據(jù)”回寫(xiě)到數(shù)據(jù)文件。分為完全檢查點(diǎn)和增量檢查點(diǎn)。
完全檢查點(diǎn):兩種情況下觸發(fā):
1、用戶發(fā)出 alter checkpoint
2、除shutdown外正常關(guān)閉

3.日志寫(xiě)入進(jìn)程(LGWR) 日志寫(xiě)入進(jìn)程用于將重做日志文件緩沖區(qū)中的數(shù)據(jù)寫(xiě)入到重做日志文件。
1)負(fù)責(zé)將日志緩沖區(qū)中的日志數(shù)據(jù)寫(xiě)入日志文件。
2)系統(tǒng)有多個(gè)日志文件,該進(jìn)程以循環(huán)的方式將數(shù)據(jù)寫(xiě)入文件。

4.歸檔進(jìn)程(ARCH) 只有當(dāng)Oracle數(shù)據(jù)庫(kù)處于歸檔模式時(shí),該進(jìn)程才可能起到作用。

5.系統(tǒng)監(jiān)控系統(tǒng)(SMON) 是數(shù)據(jù)庫(kù)系統(tǒng)啟動(dòng)時(shí)執(zhí)行恢復(fù)工作的強(qiáng)制性進(jìn)程,監(jiān)控Oracle整個(gè)進(jìn)程。

1.在實(shí)例失敗之后,重新打開(kāi)數(shù)據(jù)庫(kù)時(shí)自動(dòng)恢復(fù)實(shí)例。
2.整理數(shù)據(jù)文件的自由空間,將相鄰區(qū)域結(jié)合起來(lái)。
3.釋放不再使用的臨時(shí)段。

6.進(jìn)程監(jiān)控進(jìn)程(PMON) 用于監(jiān)控其他進(jìn)程的狀態(tài),當(dāng)有進(jìn)程啟動(dòng)失敗時(shí),PMON會(huì)清除失敗的用戶進(jìn)程,釋放用戶進(jìn)程所用的資源。
1.清理出現(xiàn)故障的進(jìn)程
2.釋放所有當(dāng)前掛起的鎖定
3.釋放故障進(jìn)程使用的資源

第三章 Oracle數(shù)據(jù)庫(kù)的安裝與配置

啟動(dòng)startup數(shù)據(jù)庫(kù)步驟
1創(chuàng)建并啟動(dòng)實(shí)例
2裝載數(shù)據(jù)庫(kù)
3打開(kāi)數(shù)據(jù)庫(kù)
Startup:

1.NOMOUNT模式
只會(huì)創(chuàng)建實(shí)例,并不會(huì)加載數(shù)據(jù)庫(kù),也不會(huì)打開(kāi)任何數(shù)據(jù)文件。

2.MOUNT 模式
啟動(dòng)實(shí)例,加載數(shù)據(jù)庫(kù),并保持?jǐn)?shù)據(jù)庫(kù)的關(guān)閉狀態(tài)。

3 . Open模式
啟動(dòng)、加載、打開(kāi)數(shù)據(jù)庫(kù)

4 . Force模式
這種模式將終止實(shí)例并重新啟動(dòng)數(shù)據(jù)庫(kù),這種啟動(dòng)模式具有一定的強(qiáng)制性。
關(guān)閉shutdown數(shù)據(jù)庫(kù)步驟

1關(guān)閉數(shù)據(jù)庫(kù)
2卸載數(shù)據(jù)庫(kù)
3關(guān)閉實(shí)例

SHUTDOWN :
NORMAL (正常關(guān)閉模式)
TRANSACTIONAL(事務(wù)關(guān)閉方式)
IMMEDIATE (立刻關(guān)閉)
ABORT (終止關(guān)閉方式)

第四章 SQLPLUS命令

(1)SET命令

  • Set pagesize value 表示該變量用來(lái)設(shè)置從頂部標(biāo)題至結(jié)束之間的行數(shù)。
  • Set newpage value 用來(lái)設(shè)置一頁(yè)中空行的數(shù)量
  • Set linesize value 一行所顯示的最多字符總數(shù)
  • Set pause
    Off:默認(rèn),不暫停
    On:輸出的結(jié)果每一頁(yè)都暫停,用戶按回車?yán)^續(xù)顯示
    Text:在設(shè)置pause的值為on之后,若在設(shè)置text 的值,則每次暫停都會(huì)將顯示該字符串。Off時(shí),無(wú)效。
    5.Set numformat
  • (2)DESCIBE命令

    查詢指定數(shù)據(jù)對(duì)象的組成結(jié)構(gòu) DESC object_name;

    (3)spool命令

    把查詢的結(jié)果輸出到指定文件中 eg: spool c:\emp.txt;

    (4)Define 命令

    定義一個(gè)用戶變量并且可以分配一個(gè)char值
    Define vjob=’SALESMAN’;

    (5)save 命令

    將最近的一條SQL語(yǔ)句或PL/SQL塊保存到一個(gè)文件中,語(yǔ)法如下: Save file_name;

    (6)把一個(gè)SQL腳本文件的內(nèi)容放進(jìn)SQL緩存區(qū)

    Eg:get c:\dept.sql;

    (7)Start 和@命令

    這兩個(gè)命令都可以用來(lái)執(zhí)行一個(gè)SQL腳本文件
    Eg: start c:\emp.txt;

    格式化命令
    Column
    Format
    用于格式化指定的列,需要在Format關(guān)鍵字的后面加一個(gè)掩碼格式。
    Ttitle和BTitle命令
    頭標(biāo)題和底標(biāo)題
    Ttitle:
    Off: 表示禁止打印頭標(biāo)題
    On:允許打印頭標(biāo)題

    第五章 SQL語(yǔ)言基礎(chǔ)及調(diào)優(yōu)

    SQl語(yǔ)言的特點(diǎn):
    集合性、統(tǒng)一性、易于移植性

    模式與模式對(duì)象
    模式是一個(gè)數(shù)據(jù)庫(kù)對(duì)象的集合。模式為一個(gè)數(shù)據(jù)庫(kù)用戶所有,并且具有與該用戶相同的名稱。 模式對(duì)象是由用戶創(chuàng)建的邏輯結(jié)構(gòu),用以存儲(chǔ)或引用數(shù)據(jù)。

    為列指定別名

    select empno as "員工編號(hào)",ename as "員工名稱",job as "職務(wù)" from emp;

    比較篩選

    <>(A!B) :比較A與B不相等
    使用all關(guān)鍵字過(guò)濾工資(sal)同時(shí)等于3000,950和800的員工記錄
    Eg:select empno,ename,sal from emp where sal<>all(3000,950,800);

    使用特殊關(guān)鍵字篩選

    like 關(guān)鍵字 即字符串模式匹配或字符串模糊查詢,like一般與通配符連用 如:“_”,它代表一個(gè)字符 “%” 代表任意數(shù)量的字符如“K%”表示以字母K開(kāi)頭的任意長(zhǎng)度的字符串,“%M%”表示包含字符M的任意長(zhǎng)度的字符串,“_MRKJ”表示5個(gè)字符長(zhǎng)度且后面4個(gè)字符是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)默認(rèn)升序 ASC

    1select deptno,job from emp group by deptno,job order by deptno;2select deptno as 部門編號(hào),avg(sal) 平均工資 from emp group by deptno having avg(sal)>2000;

    多表關(guān)聯(lián)查詢

    select e.empno as 員工編號(hào),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)連接是一種常見(jiàn)的多表關(guān)聯(lián)查詢方式,一般使用關(guān)鍵字inner join來(lái)實(shí)現(xiàn),inner可以省略

    select e.empno as 員工編號(hào),e.ename as 員工名稱,d.dname as 部門2 from emp e inner join dept d3 on e.deptno=d.deptno;

    外連接:
    左外連接:關(guān)鍵字為L(zhǎng)EFT 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)部提供的一個(gè)用于實(shí)現(xiàn)臨時(shí)數(shù)據(jù)計(jì)算的特殊表

    2.ASCII() 返回一個(gè)字符的ASCII碼

    3.Concat(S1,S2) 該函數(shù)將字符串S2連接到S1的后面

    4.Initcap() 第一個(gè)字母大寫(xiě)

    5.InSTR(s1,s2,i,j) 用于返回字符S2在字符串S1中第j次出現(xiàn)時(shí)的位置,搜索從字符串S1的第i個(gè)字符開(kā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左右的說(shuō)s2

    10.Replace (s1,s2,s3) 用s3替換出現(xiàn)在S1字符中的所有s2字符串。

    11.SUBSTR(S,i,[j]) 表示從字符串s的第i個(gè)位置開(kāi)始截取長(zhǎng)度為j子字符串。

    數(shù)字類函數(shù):

    13.Ceil(n) 返回大于或等于數(shù)值n的最小整數(shù)

    14.FLORR(n) 返回小于或等于數(shù)值n的最大整數(shù) 轉(zhuǎn)化型函數(shù):

    15.to_char() 將表達(dá)式轉(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查詢
    查詢不是銷售部門的員工信息

    select empno,ename,job from emp where deptno in (select deptno from dept where dname<>'SALES');

    使用 ANY查詢

    查詢工資大于部門標(biāo)號(hào)為10的任意一個(gè)員工工資的其他部門的員工信息

    select deptno,ename,sal from emp where sal> any(select sal from emp where deptno=10) and deptno<>10;

    使用ALL查詢

    查詢工資大于部門編號(hào)為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;

    插入語(yǔ)句:

    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語(yǔ)句:
    刪除表記錄,不可回滾。

    事務(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開(kāi)頭) 異常處理(exception) end

    (1) declare 可以聲明變量、常量、游標(biāo) (2) Begin ——end (3) Exception

    計(jì)算兩個(gè)數(shù)的和與兩個(gè)數(shù)的差的商
    Eg:

    SQL> set serveroutput on;(在服務(wù)器端顯示執(zhí)行結(jié)果)SQL> declare 2 a int:=100;3 b int:=200;4 c number;5 begin6 c:=(a+b)/(a-b);7 dbms_output.put_line(c);8 exception9 when zero_divide then10 dbms_output.put_line('除數(shù)不能為零!');11 end

    數(shù)據(jù)類型、變量和常量

    (一)基本數(shù)據(jù)類型
    1.數(shù)值類型
    數(shù)值類型主要包括number(儲(chǔ)存整數(shù)或浮點(diǎn)數(shù))、PLS_INTEGER(pls_integer)和BINARY_INTEGER(binary_interger)只儲(chǔ)存整數(shù)

    Number(p,s) 參數(shù)p: 表示精度(有效數(shù)字) 參數(shù)S:表示刻度范圍
    number(9,2)9表示這個(gè)數(shù)據(jù)的有效位數(shù)(精度),2表示兩個(gè)小數(shù)位(刻度)例如:1234567.89 允許有7位整數(shù),小數(shù)點(diǎn)后2位小數(shù)

    (二)特殊類型:
    1.%TYPE類型
    使用%type關(guān)鍵字聲明一個(gè)與列名稱類型完全相同的數(shù)據(jù)類型

    Eg: declare var_job emp.job %type;

    輸出emp表中編號(hào)為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類型(記錄類型)
    使用該類型可以儲(chǔ)存由多個(gè)列值組成的一行數(shù)據(jù)。
    舉例:聲明一個(gè)記錄類型emp_type,然后使用該類型的變量?jī)?chǔ)存emp表中的一條記錄信息,并輸出這條記錄信息。

    SQL> set serveroutput on; SQL> declare2 type emp_type is record6 ( var_ename varchar2(20),var_job varchar2(20),var_sal number);7 empinfo emp_type;8 begin9 select ename,job,sal10 into emp 11 from emp12 where empno=7369;13 dbms_output.putline('雇員'||empinfo.var_ename||'的職務(wù)是'||empinfo.var_job||'、工資是'||empinfo.var_sal);14 end;15 /

    3.%ROWTYPE類型
    可以根據(jù)數(shù)據(jù)表中行的結(jié)構(gòu)定義一種特殊的數(shù)據(jù)類型,用來(lái)儲(chǔ)存存數(shù)據(jù)表中檢索到的一行數(shù)據(jù)。
    比如:聲明一個(gè)%rowtype類型的變量rowVar_emp,然后使用該變量?jī)?chǔ)存emp表中的一行數(shù)據(jù),代碼如下:

    SQL> set serveroutput onSQL> declare 2 rowVar_emp emp%rowtype;3 begin4 select * into rowVar_emp 5 from emp 6 where empno=7369;7 dbms_output.putline();8 end;9 /

    流程控制語(yǔ)句

    1.If…then
    end if
    舉例:使用if…then 語(yǔ)句比較兩個(gè)字符串變量

    SQL> set serveroutput on; SQL> declare2 var_name1 varchar2(50);3 var_name2 varchar2(60);4 begin 5 var_name1:='EAST';6 var_name2:='xiaoke';7 if length(var_name1)<length(var_name2) then8 dbms_output.putline();9 end if;10 end; 11 /

    2.If…then

    else
    end if
    通過(guò)if…else語(yǔ)句實(shí)現(xiàn)只有年齡大于等于56歲才可以申請(qǐng)退休,否則提示不可以退休。

    SQL> set serveroutput on; SQL> declare2 age int:=55;3 begin 4 if age>=56 then5 dbms_output.put_line('你可以退休了!');6 else7 dbms_output.put_line('你小于56歲,不可以申請(qǐng)退休!');8 end if;9 end;10 /

    3.If…then

    Elsif … then

    Else

    End if

    Eg:set serveroutput on; DelcareMonth int:=10; Begin If month<10 thenDbms_ouput.putline(‘’);Elsif month>=4 and monthe<=6 thenDbms_output.putline(‘’); Elsif month>=7 and mon<=9 thenDbms_output.putline(‘’); Else

    4.Case語(yǔ)句:

    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;

    舉例: 指定一個(gè)季節(jié),使用case語(yǔ)句說(shuō)明月份信息

    Set serveroutput onDeclareSeason int:=3;Aboutinfo varchar2(50); BeginCase seasonWhen 1 then Aboutinfo:=season||’季節(jié)包括12, 3月份’; When 2 then Aboutinfo:=season||’季節(jié)包括7,8,9月份’;End case;Dbms_output.putline(Aboutinfo);End;/

    5.循環(huán)語(yǔ)句
    Loop語(yǔ)句

    Loop ... Exit when .. End if End /

    舉例: 用loop函數(shù)求前100個(gè)自然數(shù)的和,輸出到屏幕上去。

    Set serveroutput onDeclare 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 語(yǔ)句
    舉例:

    Declare Sum_i int:=0;I int:=0; BeginWhile i<=99 loopi=i+1;Sum_i=Sum_i+i; End loop; Dbms_output.putline(); End;

    7 . for語(yǔ)句
    舉例:前100個(gè)自然數(shù)中偶數(shù)之和

    Declare Sum_i :int=0; BeginFor i in reverse 1..100 loopIf mod(i,2) =0 then Sum_i=Sum_i+i; End if; End loop; Dbms_output.putline(); End /

    PL/SQL游標(biāo)

    通常用于查詢結(jié)果集,每次只能讀取一行數(shù)據(jù)
    4個(gè)步驟如下:

    聲明游標(biāo)、打開(kāi)游標(biāo)、讀取游標(biāo)、關(guān)閉游標(biāo)

    1.聲明游標(biāo)

    Cursor cur_name(intput _parameter1)

    Intput_parameter1:參數(shù)
    定義如下:

    Para_name [in] datatype [{:=|Default } para_value]

    舉例:聲名一個(gè)游標(biāo),用來(lái)讀取emp表中職務(wù)為 銷售員的信息;

    Declare Cursor cur_emp(var_job in varchar2:=’SALESMAN’)Is select empno,ename,sal From emp; Where job=var_job;

    2.打開(kāi)游標(biāo)

    Open cur_name(value) Open cur_emp(‘MANAGER’);

    3.讀取游標(biāo)

    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)閉游標(biāo)

    Close cur_name;

    游標(biāo)屬性

    %found:布爾型屬性,如果SQL語(yǔ)句至少影響一行數(shù)據(jù),該屬性為true,否則為false; %rowcount:數(shù)字型屬性,返回SQL語(yǔ)句影響的行數(shù)。 %isopen:布爾型屬性打開(kāi)游標(biāo)為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 /

    存儲(chǔ)過(guò)程
    只能通過(guò)execut命令執(zhí)行
    儲(chǔ)存過(guò)程:

    create or replace pro_name() is Begin ... Commit End pro_name; /

    舉例:

    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 邏輯存儲(chǔ)結(jié)構(gòu):
    數(shù)據(jù)文件、控制文件、日志文件

    Oracle物理存儲(chǔ)結(jié)構(gòu):
    數(shù)據(jù)塊、數(shù)據(jù)區(qū)、段、表空間

    Oracle數(shù)據(jù)
    由實(shí)例、數(shù)據(jù)庫(kù)、程序全局區(qū)、前臺(tái)進(jìn)程組成

    實(shí)例可以分為系統(tǒng)全局區(qū)(SGA)、后臺(tái)進(jìn)程(PMON,SMON)
    PGA(程序全局區(qū))是一個(gè)非共享的內(nèi)存區(qū)域。

    Spool命令把查詢結(jié)果輸入到指定文件中
    事務(wù):
    原子性、一致性、隔離性、持久性
    聲明游標(biāo)、打開(kāi)游標(biāo)、讀取游標(biāo)、關(guān)閉游標(biāo)
    Execute();
    重命名表空間:

    Alter tablespace tbs_test_3 rename to tbname; Constirant 約束 Alter table student drop(sex_age); Create or replace trigger tri_deptBefore insert or replace or delete On dept; Declare Var_tag varchar2(10); BeginIf inserting then Var_tag:=’插入’;Elsif update then Elsif insert thenElsif insert thenEnd if Insert into dept Values(var_tag,sysdate); Create or repalce trigger tri_insert_good Before insert On goodsFor each now Begin Select seq_id.nextvalInto :new .id From dual; End; / Create or replace package package_emp is Function fun_avg_sal(num_deptno number) return number isNum_avg_sal number;BeginSelect avg(sal) Into num_avg_salFrom empWhere deptno=num_deptno; Return(num_sal);

    SqlPlus column命令用法

    column是sqlplus里最實(shí)用的一個(gè)命令,很多時(shí)候sql語(yǔ)句輸出的列寬度不合適而影響查看,都需要用到這個(gè)命令來(lái)更改select語(yǔ)句中指定列的寬度和標(biāo)題。大部分時(shí)候,我們可以簡(jiǎn)寫(xiě)column為col即可,主要有以下用法:

    修改列寬度

    col c1 format a20 –將列c1(字符型)顯示最大寬度調(diào)整為20個(gè)字符 col c1 format 9999999 –將列c1(number型)顯示最大寬度調(diào)整為7個(gè)字符

    修改列標(biāo)題

    col c1 heading c2 –將c1的列名輸出為c2

    設(shè)置列的對(duì)齊方式

    SQL> col ename justify left/right/center; SQL> select empno, ename, job from emp;

    注意:對(duì)于number類型的數(shù)據(jù)默認(rèn)為右對(duì)齊,其他默認(rèn)為左對(duì)齊
    隱藏某列顯示:col job noprint

    SQL> col job noprint; SQL> select empno, ename, job from emp;

    格式化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;

    顯示列的當(dāng)前屬性

    SQL> column ename;

    重置為默認(rèn)值:

    SQL> clear columns;

    一行只顯示數(shù)字位的長(zhǎng)度, 超過(guò)長(zhǎng)度折行, 加word_wrapped后, 單詞不會(huì)折行

    column info format a40 word_wrapped

    設(shè)置列頭

    sql> column ename heading '姓名' format a15

    觸發(fā)器例題

    為emp表創(chuàng)建一個(gè)觸發(fā)器,當(dāng)執(zhí)行插入操作時(shí),統(tǒng)計(jì)操作后員工人數(shù);當(dāng)執(zhí)行更新工資操作時(shí),統(tǒng)計(jì)更新后員工平均工資;當(dāng)執(zhí)行刪除操作時(shí),統(tǒng)計(jì)刪除后各個(gè)部門的人數(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)建一個(gè)觸發(fā)器,當(dāng)插入新員工時(shí)顯示新員工的員工號(hào)、員工名;當(dāng)更新員工工資時(shí),顯示修改前后員工工資;當(dāng)刪除員工時(shí),顯示被刪除的員工號(hào)、員工名。

    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;

    修改員工工資時(shí),保證修改后的工資高于修改前的工資。

    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)建一個(gè)包括員工及其所在部門信息的視圖empdept,然后向視圖中插入一條記錄(2345,’TOM’,3000,’SALES’)

    create or replace trigger tri_insert_viewinstead of inserton view_emp_dept--創(chuàng)建一個(gè)關(guān)于view_emp_dept視圖的替換觸發(fā)器for each row--是行級(jí)視圖 declarerow_dept dept%rowtype; beginselect * into row_dept from dept where deptno = :new.deptno;--檢索指定部門編號(hào)的記錄行if sql%notfound then--未檢索到該部門編號(hào)的記錄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; /

    當(dāng)數(shù)據(jù)庫(kù)中執(zhí)行CREATE操作時(shí),將創(chuàng)建的對(duì)象信息記錄到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;

    為了實(shí)現(xiàn)在更新員工所在部門或向部門插入新員工時(shí),部門中員工人數(shù)不超過(guò)8人,可以在emp表上創(chuàng)建兩個(gè)觸發(fā)器,同時(shí)創(chuàng)建一個(gè)共享信息的包。

    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條與游標(biāo)有關(guān)的語(yǔ)句,它們?cè)诔绦蛑谐霈F(xiàn)的正確順序是:( B )

  • OPEN abc
  • CURSOR abc IS SELECT ename FROM emp
  • FETCH abc INTO vname
  • CLOSE abc
    A.1、2、3、4 B.2、1、3、4
    C.2、3、1、4 D.1、3、2、4
  • 2.數(shù)據(jù)庫(kù)運(yùn)行在歸檔模式下,如果發(fā)生日志切換,為了保證不覆蓋舊的日志信息,系統(tǒng)將啟動(dòng)如下哪個(gè)進(jìn)程?( D )
    A.DBWR B.LGWR
    C.SMON D.ARCH

    3.對(duì)于ROLLBACK命令,以下準(zhǔn)確的說(shuō)法是:( C )
    A.撤銷剛剛進(jìn)行的數(shù)據(jù)修改操作
    B.撤銷本次登錄以來(lái)所有的數(shù)據(jù)修改
    C.撤銷到上次執(zhí)行提交或回退操作的點(diǎn)
    D.撤銷上一個(gè)COMMIT命令

    4.創(chuàng)建表空間時(shí),可以指定表空間中存儲(chǔ)對(duì)象的默認(rèn)存儲(chǔ)參數(shù),其中哪個(gè)參數(shù)用于設(shè)置分配給每一個(gè)對(duì)象的初始區(qū)大小( B )
    A.NEXT B.INITIAL
    C.PCTINCREASE D.MINEXTENTS

    5.現(xiàn)將CONNECT 角色授予TEXT_ROLE角色,下面哪個(gè)語(yǔ)句可以實(shí)現(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ù)庫(kù)系統(tǒng)的物理存儲(chǔ)結(jié)構(gòu)主要有三類文件組成,分別: 數(shù)據(jù)文件 控制文件 日志文件 。邏輯存儲(chǔ)結(jié)構(gòu)包括 數(shù)據(jù)塊,數(shù)據(jù)區(qū),段,表空間
    2.SQL*Plus中直接調(diào)用過(guò)程的關(guān)鍵字是 EXECUT ;查詢中去掉重復(fù)的行,必須使用的關(guān)鍵字是 DISTINCT ; 關(guān)鍵字 DESCRIBE 可以用來(lái)顯示表的結(jié)構(gòu)信息。
    3.使用EXPORT命令時(shí),可以有3種不同方式導(dǎo)出數(shù)據(jù),表方式(T方式) 就是導(dǎo)出一個(gè)指定的基本表,包括表的定義和數(shù)據(jù)及表上的索引、約束等。 用戶 方式(U方式) 是導(dǎo)出一個(gè)用戶的所有對(duì)象,包括表、視圖、存儲(chǔ)過(guò)程、序列等。 全庫(kù)方式 (Full方式) 是導(dǎo)出數(shù)據(jù)庫(kù)中所有的對(duì)象。
    4.在ORACLE數(shù)據(jù)庫(kù)中,將權(quán)限分為兩類即 系統(tǒng)權(quán)限 對(duì)象權(quán)限 ,分別指在系統(tǒng)級(jí)控制數(shù)據(jù)庫(kù)的存取和使用機(jī)制和在模式對(duì)象上控制存取和使用的機(jī)制。

    判斷題

    1.INSERT(改為UPDATA)事件觸發(fā)器中可以使用:old偽記錄;DELETE事件觸發(fā)器中可以使用:new偽記錄。 ( 錯(cuò) )
    2.后臺(tái)進(jìn)程LGWR的作用是數(shù)據(jù)庫(kù)寫(xiě)入程序。 ( 錯(cuò) )
    3.Alter user tempuser Identified by oracle Default tablespace users Default temporary tablsespace temp Quota 100M on users ( 對(duì) )
    4.SQL*PLUS中,顯示登錄的用戶的命令是DESCRIB user。 ( 錯(cuò) )
    5.默認(rèn)登錄Oracle Enterprise Manager Database Control 的端口號(hào)是1158。( 對(duì) )

    簡(jiǎn)答題

    1.How to connect remote oracle server by SQLPLUS? Please write down the steps and the operating statements?
    如何通過(guò)SQLPLUS連接遠(yuǎn)程oracle服務(wù)器?請(qǐng)把操作步驟和操作報(bào)表寫(xiě)下來(lái)。

    方式一:

    簡(jiǎn)易連接,不用進(jìn)行網(wǎng)絡(luò)配置,其實(shí)就是tnsname.ora文件,但只支持oracle10G以上。 命令:sqlplus 用戶名/密碼@ip地址[:端口]/service_name [as sysdba]
    示例:sqlplus sys/pwd@ip:1521/test as sysdba
    備注:使用默認(rèn)1521端口時(shí)可省略輸入

    方式二:進(jìn)行網(wǎng)絡(luò)配置 oracle9i和以前的版本

    1.圖形化操作:Net Configuration Assistant–> 本地Net服務(wù)名配置–>添加->服務(wù)名->協(xié)議(選tcp)->主機(jī)名稱->端口->完成。

    2.(最常用):配置監(jiān)聽(tīng),配置tnsname.ora文件
    例如:

    ORA11GR2 =(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.6)(PORT = 1521))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = PROD)))

    方式三:(EZConnect字符串):
    配置sqlnet.ora文件:

    sec@secdb /home/oracle$ cat $ORACLE_HOME/network/admin/sqlnet.ora #sqlnet.ora Network Configuration File: /oracle/app/oracle/product/10.2.0/db_1/network/admin/sqlnet.ora #Generated by Oracle configuration tools. NAMES.DIRECTORY_PATH= (TNSNAMES,EZCONNECT) cmd窗口或者 linux下:sqlplus 用戶名/密碼@ip/實(shí)例名稱;

    2.What is the difference between procedures and functions in the Oracle database?(Oracle數(shù)據(jù)庫(kù)中的過(guò)程和函數(shù)有什么不同)

    1.存儲(chǔ)過(guò)程定義關(guān)鍵字用procedure,函數(shù)定義用function。 2.存儲(chǔ)過(guò)程中不能用return返回值,但函數(shù)中可以,而且函數(shù)中必須有return子句。
    3.函數(shù)可以可以在查詢語(yǔ)句中直接調(diào)用單獨(dú)執(zhí)行,存儲(chǔ)過(guò)程必須通過(guò)execute執(zhí)行單獨(dú)調(diào)用
    4.函數(shù)可以當(dāng)做表達(dá)式使用

    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.輸入和運(yùn)行以下程序:

    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è)計(jì)題

    1、創(chuàng)建一個(gè)存儲(chǔ)過(guò)程,以部門號(hào)為參數(shù),查詢?cè)摬块T的平均工資,并輸出該部門中比平均工資高的員工號(hào)、員工名。并且調(diào)用該存儲(chǔ)過(guò)程,要求根據(jù)輸入部門編號(hào),查詢平均工資及輸出比平均工資高的員工號(hào)、員工名。

    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;

    過(guò)程調(diào)用語(yǔ)句:

    declare vdeptno emp.detpno%type; Begin vdeptno:=&deptno; show_emp(vdeptno); End;

    2、創(chuàng)建一個(gè)函數(shù),以部門號(hào)為參數(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)用語(yǔ)句: 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)建學(xué)生表student(sno,sname,sex,sage),要求學(xué)號(hào)sno主鍵,姓名sname不能重復(fù), 性別sex只能是‘男’或者‘女’,年齡sage在15到25之間。創(chuàng)建課程表course(cno,cname),要求課程號(hào)cno主鍵,課程名cname唯一,同時(shí)為主鍵約束列上的唯一性索引設(shè)置存儲(chǔ)位置和存儲(chǔ)參數(shù)。創(chuàng)建學(xué)生選課表SC(sno,cno,grade),要求成績(jī)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,默認(rèn)表空間為USERS,在該表空間的配額為10 MB,初始狀態(tài)為鎖定。創(chuàng)建用戶user3,口令為user3,默認(rèn)表空間為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導(dǎo)出scott模式相關(guān)數(shù)據(jù),并使用IMPDP 將剛剛導(dǎo)出的scott模式相關(guān)數(shù)據(jù)導(dǎo)入到system模式,寫(xiě)出核心操作語(yǔ)句。

    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í)行導(dǎo)出 expdp scott/tiger@orcl schemas=scott directory=dir_dp dumpfile =expdp_test1.dmp logfile=expdp_test1.log; 4、執(zhí)行導(dǎo)入 impdp system/oracle@orcl directory=dir_dp dumpfile =expdp_test1.dmp remap_schema=scott:system logfile=impdp_test1.log;

    實(shí)驗(yàn)一

    (1)使用Scott用戶:

    (2)顯示所有薪水低于3000的雇員的工作、姓名和工資:

    (3)添加一個(gè)居中、兩行顯示的表頭“Employee Report”和一個(gè)居中的頁(yè)腳“Confidential”:



    (4)重新命名工作列標(biāo)題為“Job Category”,分兩行。重新命名姓名列標(biāo)題為“Employee”,重新命名工資列標(biāo)題為“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;

    實(shí)驗(yàn)二



    分析:

    相同點(diǎn):兩者都為子查詢,有著相似的格式,對(duì)于查詢的結(jié)果兩者具有相同的作用。
    不同點(diǎn):not in 前需跟上返回且需比較的列名。

    not esists定義:子查詢不返回任何一行時(shí)條件為true,是對(duì)"行”的比較
    not in定義: 與子查詢返回結(jié)果中任何一個(gè)值都不等,是對(duì)“數(shù)值”的比較,需加上數(shù)值所屬的列名

    實(shí)驗(yàn)三


    1、

    Select empno,ename,(sal+nvl(comm,0))*12 as all_sal from emp order by all_sal;

    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 right join emp on dept.deptno=emp.deptno and dept.deptno=20; select empno,ename,dname from dept,emp where dept.deptno(+)=emp.deptno and dept.deptno(+)=20;

    左連接

    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('無(wú)數(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('該部門編號(hào)不存在');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('該部門編號(hào)不存在');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||'號(hào)部門的平均工資是:'||'p_avgsal');p_job :='SALESMSN';p_sal :=0.1;pack_emp.chang_sal(p_job,p_sal); end; 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

    總結(jié)

    以上是生活随笔為你收集整理的Oracle复习(知识点、练习题、实验)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。