數據庫的定義、做用介紹:
什麼是數據庫?算法
按照數據結構來組織、存儲和管理數據的創建在計算機存儲設備上的倉庫。sql
數據庫的發展史:數據庫
起始於1962年,1968年在IBM出現windows
數據庫在測試過程當中的做用:
需求分析階段:瞭解測試環境數據庫、表、數據等信息、需求緩存
用例設計階段:測試數據準備安全
用例執行階段:測試數據構造、測試結果數據檢查、代碼邏輯查看服務器
自動化測試:測試腳本、數據、工具網絡
性能壓力測試:數據準備、性能數據分析數據結構
測試環境搭建:維護數據庫、執行配置腳本、備份恢復數據庫等oracle
數據庫的分類:
層次式數據庫
網絡式數據庫
關係式數據庫(經常使用)
關係型數據庫:
經常使用:
Oracle:Oracle(甲骨文)公司,多平臺,性能最高,得到最高安全認證,適用大型
DB2:IBM公司,多平臺,性能較高,得到最高安全認證,企業級應用最廣
SQL Server:微軟、windows平臺,中小型網站和電子商務辦公系統
MySQL:瑞典my sql AB公司,多平臺,開源,中小型網站開發
Access:微軟、windows平臺,小型系統使用
MariaDB:MySQL的一個分支,徹底兼容MySQL,包括API和命令行,使之可以成爲MySQL的代替品
不經常使用:
Informix,Sybase,PostgreSQL
非關係型數據庫:
經常使用:
Redis:開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型數、Key-Value數據庫,並提供多種語言的PI
MongoDB:基於分佈式文件存儲的數據庫。有C++語言編寫,旨在爲WEB應用服務器擴展的高性能數據存儲解決方案。支持的查詢語言很是強大,單表查詢的絕大部分性能,並且還支持對數據創建索引。
Memcached:是一個高性能的分佈式內存對象緩存系統,用於動態Web應用數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提升數據庫驅動網站的速度。
Cassandra:一個開源的、分佈式、無中心、支持水平擴展、高可用的KEY-Value的NOSQL數據庫。
不經常使用:
HBase、MemacheDB、BerkeleyDB、Tokyo Cabinnet
Oracle介紹:
公司簡介:全稱甲骨文股份有限公司(甲骨文軟件系統有限公司),是全球最大的企業級軟件公司(被成爲「純軟件公司的先驅」。在我的計算機領域,靠賣軟件賺錢的公司),總部位於美國加利福尼亞州的紅木灘,其創始人是拉里誒裏森。
市場份額:Oracle(54%)、IBM-DB2(21%)、MicrosoftMSQL(14%)
相關認證:OCM認證【大師】、OCP認證【專家】、OCA認證【專員】等
版本:免費版、標準版、標準版二、企業版
Oracle Server主要文件目錄介紹:
admin:主要存放數據庫運行過程當中產生的跟蹤文件(後臺進程,用戶sql語句)
bin:包含數據庫管理各類命令
ADMIN重要:裏面有監聽文件(listence.ora tnsnames.ora sqlnet.ora)
Db_1:服務器數據庫文件夾,表明Oracle目錄樹的根, 它包含與Oracle軟件運行有關的子目錄和網絡文件以及選定的組件等
Oradata:數據庫物理文件存儲在oradata/db_name目錄下,該目錄主要存儲數據庫的控制文件、數據文件、重作日誌文件。其中*.dbf文件對應數據庫中每一個表空間;.ctl文件爲控制文件;.log文件對應重作日誌文件組及其成員
Flash_recovery_area:目錄存儲並管理與備份和恢復有關的文件。它包含系統中每一個數據庫的子目錄。該目錄可用於存儲與恢復有關的文件,如控制文件、聯機重作日誌副本、歸檔日誌、閃回日誌以及Oracle數據庫恢復管理器(RMAN)備份等。
adump:通常是audit dump
bdump:中有alert文件,和一些後臺進程的trace file,bdump文件下放着的是數據庫的預警文件,若是數據庫出問題,該文件是DBA要查看的首選文件
cdump:通常放置一些核心的trace文件
udump:放着的是用戶進程跟蹤文件,用於收集客戶應用的SQL語句的統計信息。
pfile:文件下放着的天然是數據庫的初始化參數文件。
注:若是以爲oracle卡了 ,能夠把bdump和udump文件夾下文件刪除
Oracle Client主要文件目錄介紹:
ORACLE_HOME主要包括的子目錄有:
BIN--主要包含用於數據庫管理的各類命令等
cdd--與Oracle Cluster Synchronization服務有關的文件
dbs--存放數據庫實例模式的腳本等
demo--存放數據庫實例模式的腳本等
install--用於存儲ORACLE安裝後的端口號,iSQL*PLUS以及Enterprise Manager
Database Control啓動並登陸的方式等
NETWORD\ADMIN--有關監聽器listener.ora和sqlnet.ora以及tnsnames.ora等
config--用於與Oracle Enterprise Menagement有關的端口管理等
database--初始化參數與口令文件
Oracle兩種用戶認證方式:
Sqlnet.authentication_services=(NTS)|(NONE)
NTS:操做系統認證方式,不使用口令文件;
NONE:口令文件認證方式
訪問Oracle數據庫四種方法:sql*plus工具、dos窗口sqlplus、isql、plsql
Cmd>regedit 進入註冊表編輯器快捷命令,紅框顯示oracle註冊信息
Oracle版本號的含義
Oracle產品版本號由5部分數字組成
一、主發佈版本號:是版本的最重要的標識號,表示重大的改進和新的特徵
二、主發佈維護號:維護版本號,一些新的特性的增長和改進
三、應用服務器版本號:Oracle應用服務器的版本號
四、構件特定版本號:針對構件升級的版本號
五、平臺特定版本號:標識操做系統平臺相關的發佈版本
1)Oracle主要版本
Oracle
Oracle 8/Oracle 8i(1CD):「i」表示internet,表示Oracle開始進軍網絡
Oracle 9i(3CD):屬於Oracle 8i的穩定版本,如今依然大範圍使用(使用率很是高,由於正好是中國進行電子化信息改革的開始)
Oracle 10g(630M):「g」表示網格Grid技術,使用了網絡計算的方式,提高了數據庫的分佈式的訪問性能
Oracle 11g(1.7G):屬於Oracle 10g的穩定版本,如今新項目使用較多
plsql語句(Structured Query Language:結構化查詢語言)
1、sql編寫規範
明確規範
- sql語句的全部表名、字段名所有小寫,系統保留字、內置函數名、sql保留字大寫。
- 鏈接符or、in、and、以及=、<=、>= 等先後加上一個空格。
- 對較爲複雜的sql語句、過程、函數加上註釋,說明算法、功能。
- SQL 語句的縮進風格
1. 一行有多列,超過80個字符時,基於列對齊原則,採用下行縮進
2. where子句書寫時,每一個條件佔一行,語句另起一行時,以保留字或者鏈接符開始,鏈接符右對齊。
多表鏈接時,使用表的別名來引用列。
其餘注意事項
SQL 命令是大小寫不敏感
- SQL 命令可寫成一行或多行
- 一個關鍵字不能跨多行或縮寫
- 子句一般位於獨立行,以便編輯,並易讀
2、SQL語言基礎
SQL語言分類
SQL語句規則
- SQL 語句是大小寫不敏感
- SQL 語句可寫成一行或多行
- 一個關鍵字不能跨多行或縮寫
- 子句一般位於獨立行,以便編輯,並易讀
- 空格和縮進使程序易讀
- 關鍵字大寫,其餘小寫
算數表達式:
對NUMBER和DATE型數據可用算數運算建立表達式
例如:select sal+800 from emp;
select sal-200 from emp;
select sal*5 from emp;
select sal/3 from emp;
運算優先級:
乘法和除法的優先級高於加法和減法
同級運算的順序是從左到右
表達式中使用括號可強行改變優先級的運算順序
定義空值
空值指不可用,不知道,不實用的值
空值不等於零或空格
包括空值的算數表達式等於空
定義列的別名
改變列的標題頭
使用計算結果
列的別名
若是使用特殊字符,或大小寫敏感,或有空格時,需加雙引號
例如 select ename as name from emp;或select ename name fromemp;
連結操做
將列或字符與其它列連結
用雙「||」表示
產生的結果列是一個字符表達式
例如:
SELECT ename||job AS "Employees" FROM emp;
文字字符串
文字字符串是一個包括在SELECT列表中的字符,表達式,或數字
日期和字符型文字字符必須用單引號括起來
每返回一條記錄字符被輸出一次
例:SELECT ename ||' '||'is a'||' '||job AS "Employee Details" FROM emp;
![]()
|
構造命令
SELECT 'delete from '||table_name||' where 1=0;'||chr(10)
FROM user_all_tables;
顯示:
delete from CUSTOMERS where 1=0;
delete from PRODUCT_TYPES where 1=0;
delete from PRODUCTS where 1=0;
delete from PURCHASES where 1=0;
delete from EMPLOYEES where 1=0;
……………
……………
重記錄:
缺省狀況下查詢顯示全部行,包括重行
例:SELECT deptno FROM emp;
顯示有重複信息
![]()
|
不想要重複 用distinct(去重),具體爲select distinct deptno from emp;
可是distinct操做會引發排序,經過排序去掉重複記錄。
描述表結構
打開command windows , 輸入"desc 表名",顯示錶結構(不能在sql windows中使用)
3、限定和排序數據
-
限制某一查詢所取記錄
-
排序查詢結果
限定所選的條件
使用where限定查詢條件
select [distinct]* from emp where deptno = 20 and mgr = 7788
注:from子句在where子句以後
字符串和日期
-
字符串和日期要用單引號擴起來
-
字符串是大小寫敏感的,日期值是格式敏感的
-
缺省的日期格式是 'DD-MON-YY'
比較運算符
|
使用比較運算符
|
|
注:空值是直接不參與計算
其它的比較運算符
注:
between默認從小到達,不能輸例如「between 1000 and 800」
使用BETWEEN運算符顯示某一 值域範圍的記錄
注:
between默認從小到達,不能輸例如「between 1000 and 800」
in的使用
使用IN運算符得到匹配列表值的記錄
in 示例:
LIKE使用
使用LIKE運算符執行通配查詢
查詢條件可包含文字字符或數字
(%) 可表示零或多個字符
( _ ) 可表示一個字符
like 示例:
或
使用組合方式匹配字符
使用ESCAPE 標識符來查找帶特殊符號的字符號
is null 使用
查詢包含空值的記錄
運算邏輯符
|
使用AND
AND須要條件都爲TRUE
|
OR 運算符
OR須要條件之一是TRUE
|
使用not in 運算符
|
優先級規則
括號將跨越全部優先級規則
|
ORDER BY 子句
使用ORDER BY 子句將記錄排序
-
ASC: 升序,缺省
-
DESC: 降序
ORDER BY 子句在SELECT語句的最後
降序排列:
|
使用列的別名排序
|
使用中文字符的別名排序
|
注:
-
按中文拼音進行排序:SCHINESE_PINYIN_M
-
按中文部首進行排序:SCHINESE_RADICAL_M
-
按中文筆畫進行排序:SCHINESE_STROKE_M
經過ORDER BY 列表的順序來排序
|
4、單組函數
-
描述可在SQL 中使用的各類函數
-
在SELECT語句中使用字符,數字,日期函數
-
描述轉換函數的使用
函數過程
|
兩種SQL函數
|
單行函數
-
操做數據項
-
接受參數並返回一個值
-
對每一返回行起做用
-
每一行返回一個結果
-
可修改數據類型
-
可以使用嵌套
字符函數
|
字符函數說明
使用大小寫轉換
顯示員工號,名字,部門號
|
使用字符處理函數
|
|
instr 找到字符位置 這裏是找ename中A的位置
concat 鏈接兩個字段
substr substr(字段名,a,b) 以「字段名」爲基礎,從第a個字符開始截取b個字符串
數字函數
|
floor 向下取整
mod 取餘數
round 默認個位取整,加條件確認取整位數(4舍五入)
trunc 去尾取整
示例:
SELECT FLOOR(5.8),FLOOR(-5.8) FROM dual;
SELECT MOD(8,3), MOD(8,4) FROM dual;
SELECT ROUND(5.73), ROUND(5.73),ROUND(5.73,-1) FROM dual;
SELECT TRUNC(5.73),TRUNC(5.73,1),TRUNC(5.73,-1) FROM dual;
日期
Oracle之內部數字格式存儲日期:世紀,年,月,日,小時,分鐘,秒
缺省的日期格式是 DD-MON-YY
SYSDATE 是返回日期和時間的函數
DUAL是用來查看SYSDATE的虛表
日期的運算
|
日期函數
|
SELECT ADD_MONTHS('08-AUG-2007',13) FROM dual ;
SELECT LAST_DAY('08-AUG-2007') FROM dual;
SELECT NEXT_DAY('08-AUG-2007','SATURDAY') FROM dual;
SELECT SYSDATE FROM dual;
默認的日期格式是在數據庫參數NLS_DATE_FORMAT中指定的,DBA能夠修改
NLS_DATE_FORMAT的設置,方法是在數據庫的init.ora或者spfile.ora文件中修改,固然更方便的方法是使用ALTER SESSION命令在SQL *Plus中修改,例如:ALTER SESSION SET
NLS_DATE_FORMAT='MONTH-DD-YYYY';
轉換函數
|
隱含的數據轉換類型
-
做爲賦值,Oracle可自動轉換
|
-
表達式可自動轉換數據類型
|
清楚的數據類型轉換
|
TO_CHAR 函數操做日期
|
格式規則
-
必須用單引號括起來,而且是大小寫敏感
-
可包含任何有效的日期格式
-
有一個fm元素 用於填補空格或禁止前面的零
-
使用逗號分離日期值
日期格式基礎
|
TO_CHAR函數處理日期
|
|
TO_CHAR函數處理數字
使用TO_CHAR函數將數字做爲字符顯示 |
|
|
|
TO_NUMBER和TO_DATE函數
使用TO_NUMBER函數將字符轉換爲數字
|
使用TO_DATE函數將字符轉換爲日期
|
進制轉換
-
十進制與十六進制
SQL > select to_char(2463,'xxxx') from dual;
TO_CH
-----
99f
已選擇 1 行。
-
十六進制與十進制
SQL> select to_number(99f,'xxxx') from dual;
TO_NUMBER('99F','XXXX')
-----------------------
2463
已選擇 1 行。
|
|
NVL函數
-
將空值轉換爲實際的值
數據格式能夠是日期,字符,數字
數據類型必須匹配
NVL(comm,0)
NVL(hiredate,'01-JAN-97')
NVL(job,'No Job Yet')
NVL函數2
NVL2(expr1,expr2,expr3)
若是expr1不爲Null,返回expr2,若是expr1爲Null,返回expr3。
expr1能夠爲任何數據類型
示例:
NVL2(comm,0,1)
|
decode函數
DECODE函數相似於一系列CASE 或 IF-THEN-ELSE 語句
|
|
嵌套函數
-
單行函數可被嵌入到任何層(函數中套函數)
-
嵌套函數從最深層到最低層求值
示例:
SELECT ename,
NVL(TO_CHAR(mgr),'No Manager')
FROM emp
WHERE mgr IS NULL;
|
SQL指令和sql*plus命令的區別
|
iSQL*Plus概述
➢ 登錄到 iSQL*Plus
➢ 描述表的結構
➢ 編輯SQL語句
➢ 從iSQL*Plus執行SQL
➢ 將SQL語句保存或追加到文件中
➢ 執行存儲的文件
➢ 從文件將SQL語句調到緩衝區編輯
SQL*Plus 的編輯命令
➢ I[NPUT] 輸入SQL語句 ➢ I[NPUT] text ➢ L[IST] 顯示SQL語句 ➢ L[IST] n ➢ L[IST] m n ➢ R[UN] 執行SQL語句 ➢ n ➢ n text ➢ 0 text |
➢ A[PPEND] text 追加SQL語句 ➢ C[HANGE] / old / new 修改SQL語句 ➢ C[HANGE] / text / ➢ CL[EAR] BUFF[ER] 清空緩衝區 ➢ DEL 刪除SQL語句 ➢ DEL n ➢ DEL m n |
➢ SAVE filename 保存到文件 ➢ GET filename 從文件讀取到緩衝區 ➢ START filename 執行文件 ➢ @ filename ➢ EDIT filename編輯文件 ➢ SPOOL filename 導出執行結果到文件 ➢ EXIT
|
5、從多個表顯示數據
-
使用相等和不等連結寫SELECT語句來訪問多個表
-
使用外鏈接查詢數據
-
表的自鏈接
使用鏈接從多個表中查詢數據
|
在WHERE子句中寫鏈接條件
在多個表中具備相同的列名
笛卡爾現象
➢ 笛卡爾結果造成於:
鏈接條件被省略
鏈接條件無效
第一個表的全部記錄鏈接到第二個表的全部記錄
➢ 爲了不笛卡爾結果咱們老是在 WHERE 子句中使用有效鏈接
|
鏈接的類型
|
![]() |
|
|
等值鏈接示例
|
限定列名
➢ 使用表名做爲前綴在多個表中指定列名
➢ 使用表前綴能夠改進性能
➢ 使用列的別名以區分不一樣表的同名列
使用AND運算符附加查詢條件
and用法 附加條件 篩選出 deptno=10的信息
使用別名簡化查詢
|
|
多表鏈接
|
非等值鏈接
|
SAL在LOSAL和HISAL之間 |
示例:
|
|
自鏈接
empno爲7499的人的領導編號爲7698,此爲同一張表內的聯繫 |
示例:
SELECT worker.ename, worker.mgr ,' works for ', manager.empno ,manager.ename FROM emp worker, emp manager WHERE worker.mgr = manager.empno; |
|
外鏈接
|
➢ 使用外鏈接看到不知足鏈接條件的記錄
➢ 外鏈接運算符是加號(+)
➢ 外鏈接分爲左鏈接、右鏈接
此爲右鏈接,左鏈接條件爲e.deptno = d.deptno (+) |
顯示出了沒有員工的編號40部門 |
注:(+)在=左邊是右鏈接,表示把右邊的表的數據所有顯示出來
(+)在=右邊是左鏈接,表示把左邊的表的數據所有顯示出來
此外 左右鏈接還有一種寫法
OUTER JOIN句法
ISO99標準把複雜的加號從Oracle outer join中拿出去,並使得outer join SQL更容易理解。
LEFT OUTER JOIN
RIGHT OUTER JOIN
示例:
select ename , dept.deptno
from emp left outer join dept
on emp.deptno = dept.deptno
|
|
left outer join 左鏈接
展現左表中的全部記錄
on表示知足什麼條件 等同於where 只在左右鏈接時使用
6、組函數
• 熟悉組函數的用法
• 使用GROUP BY子句將數據分組
• 使用HAVING子句包括或排除被分組的記錄
什麼是分組函數?
分組函數運算每一組記錄,每一組返回一個結果
分組函數的類型?
➢ AVG ([DISTINCT|ALL]n) 求平均數
➢ SUM ([DISTINCT|ALL]n) 求和
➢ COUNT ({ *|[DISTINCT|ALL]expr}) 計數
➢ MAX ([DISTINCT|ALL]expr) 求最大值
➢ MIN ([DISTINCT|ALL]expr) 最小值
➢ STDDEV ([DISTINCT|ALL]x) 標準差
➢ VARIANCE ([DISTINCT|ALL]x) 方差
使用AVG 和 SUM 函數
➢ 在數字類型數據使用AVG 和 SUM 函數
|
|
使用MIN 和 MAX 函數
➢ MIN 和 MAX函數適用於任何數據類型
|
使用 COUNT 函數
➢ COUNT(*)返回表中的記錄數
|
➢ COUNT(expr) 返回非空記錄
|
分組函數和空值
➢ 分組函省略列中的空值
|
在分組函數中使用NVL函數
➢ NVL函數強制分組函數包括空值
|
GROUP BY子句
➢ 使用GROUP BY子句將表分紅小組
➢ 組函數忽略空值, 可使用NVL,NVL2,COALESCE 等函數處理空值
注:group by 寫在order by 以前
|
colaesce(字段,值,字段2,值),返回第一個不爲空的字段並顯示出這個字段,當第一個字段沒有非空時,順延查詢第二個字段知道結束 |
|
|
全部用來分組的列在SELECT列表中不能使用分組函數
|
多列分組
在多列上使用 GROUP BY子句
|
使用分組函數時的非法查詢
➢ 不能使用WHERE子句限定組
➢ 可以使用HAVING子句限定組
|
HAVING子句
➢ Having子句的做用是對行分組進行過濾
-
記錄被分組
-
使用組函數
-
匹配HAVING子句的組被顯示
|
|
having用在group by以後 是對group by 的補充
嵌套組函數
➢ 顯示最高的平均工資
|
嵌套組函數必須有group by
7、子查詢
• 定義子查詢
• 列出子查詢的種類
• 編寫單行和多行子查詢
➢ 子查詢在主查詢前執行一次
➢ 主查詢使用子查詢的結果
|
使用子查詢的規則
➢ 子查詢要用括號括起來
➢ 將子查詢放在比較運算符的右邊
➢ 子查詢中不要加ORDER BY子句
➢ 對單行子查詢使用單行運算符
➢ 對多行子查詢使用多行運算符
子查詢的種類
|
單行子查詢
➢ 返回一行記錄
➢ 使用單行記錄比較運算符
|
示例:
|
在子查詢中使用分組函數
|
在子查詢中使用HAVING子句
➢ 先執行子查詢
➢ 而後返回結果到主查詢的HAVING 子句
|
多行子查詢
➢ 返回多行
➢ 使用多行比較運算符
|
在多行子查詢中使用ANY運算符
|
在多行子查詢中使用ALL運算符
|
8、操做數據
描述DML語句
使用INSERT,UPDATE和DELETE命令操做數據
控制事務
➢ 使用 DML 語句可執行:
插入新數據
修改已有數據
刪除數據
➢ 一個事務是DML語句的邏輯工做單元
INSERT 語句
INSERT語句一次將一個記錄的數據輸入表中
插入空值(不指定null) |
|
|
插入空值(指定null) |
|
![]()
|
注:
1.在字段屬性能夠爲空時,插入的值能夠爲空
2.insert 操做執行以後不會自動顯示,要自主查詢
INSERT語句中使用函數
➢ 例如使用SYSDATE函數插入當前的日期和時間
|
![]() |
➢ 增長一個員工
![]() |
![]()
|
從其餘表中拷貝記錄
|
UPDATE 語句
➢ 使用UPDATE語句修改已存在的記錄(update不能修改主鍵)
修改記錄
➢ 使用WHERE子句修改指定的記錄.
|
|
➢ 修改全部的記錄.
![]() |
|
使用多列子查詢修改數據
|
|
注:update 不能修改做爲主鍵的字段爲不存在的值
DELETE 語句
➢ 使用DELETE命令從表中刪除記錄.
![]() |
➢ 刪除全部的記錄
![]() |
刪除的記錄基於其餘表的記錄
➢ 使用子查詢,刪除的記錄基於其餘的表。
![]() |
刪除記錄時違反完整性約束
![]() |
dept表的deptno與emp表相關聯(外鍵約束),刪除違反完整性約束
數據庫的事務
➢ 一組DML語句,修改的數據在他們中保持一致
➢ 一個 DDL 語句
➢ 一個 DCL 語句
數據庫的事務
➢ 開始於第一個執行的語句
➢ 結束於:
COMMIT 或 ROLLBACK
DDL or DCL (grant/revoke) 語句
某些錯誤,退出,或系統崩潰
事務的自動處理
➢ 當下列狀況發生時事務自動提交:
執行一個 DDL 語句
執行一個 DCL 語句
從 SQL*Plus正常退出
➢ 當從SQL*PLUS中強行退出或系統失敗時,事物自動回滾
COMMIT和 ROLLBACK的優勢
➢ 保證數據一致性
➢ 在數據永久性生效前從新查看修改的數據
➢ 相關邏輯操做單元
控制事務
![]()
|
提交或回滾前數據的狀態
➢ 之前的數據可恢復.
➢ 當前的用戶可看到DML操做的結果.
➢ 其餘用戶不能看到DML操做的結果.
➢ 被操做的數據被鎖住,其餘用戶不能修改這些數據.
提交後數據的狀態
➢ 數據的修改被永久寫在數據庫中.
➢ 數據之前的狀態永久性丟失.
➢ 全部的用戶都能看到操做後的結果.
➢ 記錄鎖被釋放,其餘用戶可操做這些記錄.
➢ 全部的 savepoints 被去掉.
注:
savepoint應用
|
回到a2以後還能夠再回到a1 , 回到a1後,不能回到a2,由於a2在此時並無被記錄
回滾後數據的狀態
➢ 語句將使全部的修改失效.
修改的數據被回退.
恢復數據之前的狀態.
行級鎖被釋放.
回退到某一標識
➢ 使用語句產生一個標識,將事務分紅幾個階段.
➢ 可回退到標識指定的階段.
語句回滾
➢ 若是一條 DML 語句執行時失敗,只有此語句回退.
Oracle 執行了一個自動的 savepoint.
其餘的變化被保留.
➢ 客戶應該執行COMMIT或ROLLBACK以結束事務.
事務特性
• 事務的ACID特性
• 一、原子性(atomicity):
一個事務中包含的全部sql語句都是一個不可分割的單元。
• 二、一致性(consistency)
事務必須確保數據庫的狀態是一致的。
• 三、隔離性(isolation)
多個事務獨立運行,彼此不影響。
• 四、持久性(durability)
事務一旦提交,數據庫的變化就會被永久保留下來。
讀一致性
➢ 讀一致性保證了查詢數據獲得一致的結果.
➢ 不一樣用戶修改的數據不會發生衝突.
➢ 對相同的數據操做時確保:
查詢時不用等寫完成
寫時不用等查詢完成
小結
|
9、管理表
• 瞭解數據庫的對象
• 建立表、改變表的定義,表中列可使用的數據類型
• 刪除表、改表名、截取表的全部記錄
|
表命名規則
➢ 必須以字母開頭
➢ 可包括數字
➢ 只能包含A-Z, a-z, 0-9, _, $, and #
➢ 不要使用oracle的保留字
➢ 同一用戶的對象不能同名
建立表
你必須有 :
➢ 建表的權限
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr];
➢ 有存儲區域
➢ 你可指定:
表名 Table name
列名, 列的數據類型, 列的大
建表過程:
1.建表
2.添加信息
當沒有輸入值時,sex會採用默認的值‘male’
也能夠經過本身輸入值來輸入
注:以現有的圖表來建立表時 能夠經過別名來更新字段名稱
引用其餘用戶的表
➢ 其餘用戶的表不能直接訪問
➢ 使用其餘用戶的表時需加用戶名做爲前綴
示例:
SELECT * FROM scott.emp;
缺省選項
➢ 在插入記錄時爲列指定缺省值
合法的值是字符,表達式.或SQL函數
非法值爲其餘的列名.
缺省的數據類型必須匹配列的數據類型.
查詢數據字典
➢ 查詢此用戶所擁有哪些表
|
![]() |
➢ 查詢此用戶擁有哪些類型的對象
|
|
➢ 查詢此用戶擁有的表,視圖,同義詞,序列號
|
|
數據類型
|
使用子查詢建立表
➢ 使用子查詢建立表
列的數目要和子查詢中的匹配
可定義列名和缺省值
使用CTAS建立表
|
|
|
ALTER TABLE 語句
➢ 使用ALTER TABLE 語句可:
加一列 : alter table add
修改列 : alter table modify
對新列定義缺省值
增長列
➢ 使用 ADD 子句增長列.
|
|
修改列
➢ 可修改列的數據類型,大小和缺省值.
|
|
![]() |
➢ 修改後的缺省值隻影響之後插入的數據.
修改列名
➢ 在Oracle9i及後續版本,能夠直接修改列名.
|
手動修改表
輸入命令,點擊鎖便可手動修改 |
刪除表
➢ 表中全部數據將被刪除
➢ 事務被提交
➢ 全部索引被刪除
➢ 不能回退
|
改變對象名稱
➢ 使用RENAME語句改變對象名稱
|
注:操做者必須是對象的全部者
截取表的全部記錄
➢ TRUNCATE TABLE 語句:
刪除表中全部記錄
|
復位HWM
釋放表的存儲空間
➢ 不能回退
➢ 和DELETE同樣,是刪除記錄的手段之一
在表中加註釋
➢ 使用COMMENT語句可向表或表中的列加註釋
能夠經過在表上右擊選擇view查看註釋,也能夠經過命令查看 |
給字段添加註釋,只能逐個字段添加註釋,不能一塊兒添加 |
➢ 可經過以下數據字典視圖看註釋:(用select * from)
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS
![]() |
where限定表名,但這個時候表名已是table_name字段的值,因此必需要大寫或用upper參數 |
小結
|
10、約束
• 瞭解什麼是約束
• 建立約束和維護約束
什麼是約束
➢ 約束是表級強制執行的規則.
➢ 當表中數據有相互依賴性時,可保護數據不被刪除.
➢ Oracle 有以下類型的約束:
NOT NULL ----非空
UNIQUE Key ----惟一
PRIMARY KEY ----主鍵
FOREIGN KEY ----外鍵
CHECK ----檢查
約束概況
➢ Oracle使用 SYS_Cn 格式命名約束
➢ 建立約束:
在建表的同時建立
建表後建立
➢ 可定義列級或表級約束.
➢ 可經過數據字典表查看約束.
建立約束
not null、check只能對列進行約束
|
給字段emp1.empno/emp.ename建立主鍵約束(非空且惟一)
非空約束(NOT NULL)
➢ 確保列值非空
這裏是從表級創建非空約束,定義了ename、deptno字段值不能爲空 |
惟一性約束(UNIQUE)
示例:
dname字段已經有sales存在,新添加的字段sales不能重複,即再同一字段不容許存在相同的值 |
|
主鍵約束( PRIMARY KEY)
要求在同一個字段內的值 惟一且非空 |
|
外鍵約束(FOREIGN KEY)
外鍵約束的字段被主鍵字段所約束,能夠爲空但不能是主鍵沒有的值 |
|
外鍵約束的關鍵字
➢ FOREIGN KEY
定義子表的哪一列做爲外鍵約束
➢ REFERENCES
指示主表和參照的列
➢ ON DELETE CASCADE
刪除主表記錄時將子表相關記錄刪除
➢ ON DELETE SET NULL
將外鍵引用置爲空值
CHECK 約束
➢ 定義每一記錄都要知足的條件
➢ 條件表達式不容許有:
CURRVAL, NEXTVAL, LEVEL, ROWNUM
SYSDATE, UID, USER, USERENV 函數
參照其餘記錄的值
建立的deptno的值只能在10~99之間 |
加約束
➢ 可加或刪除約束,但不能修改
➢ 可以使約束生效和失效
➢ 使用MODIFY子句可加 NOT NULL約束
使用modify給列增長not null約束 |
![]() |
使用modify 給列去除not null約束 |
![]()
|
增長外鍵約束到EMP表
給mgr增長外鍵,參照主鍵empno |
刪除約束
➢ 刪除約束emp_mgr_fk.
|
➢ 刪除主鍵約束和相關的外鍵約束.
![]() |
使約束失效
➢ 在ALTER TABLE 語句中執行DISABLE子句可以使完整性約束失效
➢ 使用 CASCADE 選項可以使依賴的完整約束失效
|
使約束生效
➢ 使用ENABLE子句將失效的約束生效
➢ 當使UNIQUE 或 PRIMARY KEY約束生效時,會自動建立 UNIQUE 或 PRIMARY KEY 索引.
|
注:也能夠經過view窗口使約束生/失效
![]() |
查看約束
➢ 經過查看 USER_CONSTRAINTS 表可獲得用戶的全部約束.
![]() |
查看約束創建在哪些列
➢ 經過查詢USER_CONS_COLUMNS 視圖可得到約束創建在哪些列上
|
11、視圖(view)
• 描述視圖
• 建立視圖
• 經過視圖得到數據
• 改變視圖的定義
• 經過視圖操做數據
• 刪除視圖
爲何使用視圖
➢ 限制對數據的訪問
➢ 很容易的寫成複雜的查詢
➢ 容許數據的獨立性
➢ 不一樣的視圖可得到相同的數據
簡單視圖和複雜視圖
|
建立視圖
➢ 建立視圖的語句中可嵌入子查詢.
➢ 子查詢中可包括複雜的 SELECT 語法.
➢ 子查詢中不能包含ORDER BY 子句
首先,scott用戶是沒有建立視圖的權限的,必須先以system帳戶對scott進行賦權:
|
![]() |
建立視圖
➢ 在子查詢中使用列別名建立視圖.
![]()
|
SELECT EMPLOYEE_NUMBER, NAME, SALARY FROM salvu30; |
查詢USER_VIEWS數據字典視圖
![]()
|
修改視圖
➢ 使用CREATE OR REPLACE VIEW 子句修改 視圖 ,併爲每列加別名.
|
➢ 在CREATE VIEW語句中列的別名的順序是和子查詢中一致的.
建立複雜的視圖
➢ 複雜視圖的特色:
從多個表查詢
包含函數
包含分組數據
![]()
|
對視圖進行DML操做的規則
➢ 可對簡單視圖執行DML操做
➢ 在下列狀況下不能刪除記錄:
視圖包括組函數
視圖包括GROUP BY 子句
視圖包括 DISTINCT
Rownum僞列關鍵詞
➢ 在下列狀況下不能修改記錄 :
前面所提到的狀況
列是由表達式定義的
包括ROWNUM 虛列
➢ 在下列狀況下不能添加記錄 :
前面所提到的狀況
視圖的基表有非空列,但在視圖中沒有此列
使用 WITH CHECK OPTION子句
➢ 使用WITH CHECK OPTION可以使DML操做限制在視圖所包含的範圍
內.
![]() |
![]() |
刪除視圖
➢ 刪除視圖並不刪除基表中的數據.
![]() |
![]()
|
小結
➢ 視圖可從其餘的表或視圖中獲取數據.
➢ 視圖提供以下優勢:
限制數據的訪問
簡化查詢
提供獨立的數據
容許多個視圖使用相同的數據
刪除時不影響基表
12、 其餘數據庫對象
• 描述其餘的數據庫對象和使用
• 建立,修改,使用序列號
• 建立和維護索引
• 建立公共和私有的同義詞
數據庫對象
|
什麼是序列號
➢ 自動生成惟一的數字
➢ 是一個共享的對象
➢ 典型的應用於表的主鍵
➢ 可替代應用代碼
➢ 將序列號值放在緩存中可提升訪問速度
CREATE SEQUENCE 語句
➢ 定義序列號
![]() |
Increment by n:遞增的量爲n
Maxvalue:最大值/nomaxvalue:沒有最大值
minvalue:最小值/nominvalue:沒有最小值
cycle:循環/nocycle:沒有循環
Cache n:緩存n條序列/不緩存
建立序列號
➢ 建立名字爲 DEPT_DEPTNO的序列號,以供DEPT表使用 .
➢ 不加 CYCLE 選項.
![]() |
|
確認序列號
➢ 經過查詢USER_SEQUENCES 數據字典表,可檢查序列號的數值.
|
➢ LAST_NUMBER 列顯示下一個可用的序列號.
NEXTVAL 和 CURRVAL
➢ NEXTVAL 返回下一個可用序列號值
➢ CURRVAL 包含當前的序列號值
使用序列號
➢ 使用序列號插入記錄
![]() |
➢ 查看插入的值
![]() |
![]()
|
注:插入的值能夠不按順序,但必定要在設定的範圍內並無出現過。
修改序列號
➢ 可修改步增值,最大值,最小值, cycle選項, cache 選項.
![]() |
➢ 修改的規則:
你必須是序列號的全部者並有ALTER權限.
只對之後的序列號受影響.
序列號可被刪除並重建,以得到新的開始值.
一些確認被執行. 例如:MAXVALUE不能小於當前序列號.
刪除序列號
➢ 使用 DROP SEQUENCE 語句刪除序列號.
![]() |
什麼是索引
➢ 是一種對象
➢ 使用指針加快記錄訪問速度
➢ 減少硬盤 I/O
➢ 索引獨立於表而存在
➢ 數據庫自動使用和維護
怎樣建索引
➢ 自動
惟一性索引自動被建立,當定義 PRIMARY KEY 或 UNIQUE 約
束時.
➢ 手動
使用CREATE INDEX命令.
建立索引
➢ 可基於一列或多列建立索引
![]() |
➢ 例子:
![]() |
建立索引規則
➢ 索引列應該常常在 WHERE 子句中,或是鏈接條件.
➢ 此列值域比較廣.
➢ 此列包含大量空值.
➢ 在 WHERE 子句或鏈接條件中常常一塊兒使用的列.
➢ 對大表查詢的結果小於總數據的2~4% .
下列的表不適合建索引:
表很小
列不常常在WHERE子句中使用
對大表查詢的結果大於總數據的2~4% .
表常常被修改
確認索引
➢ USER_INDEXES.
➢ USER_IND_COLUMNS .
![]() |
刪除索引
➢ 刪除索引.
![]() |
➢ 必須是索引的擁有者或者有 DROP ANY INDEX 權限.
同義詞
➢ 同義詞是數據庫對象的另一個名字,以方便使用.
參照其餘用戶的表.
較短的對象名.
|
加public表明全部人均可以用,不加表示只有當前用戶能夠用這個同義詞 |
建立和刪除同義詞
➢ 建立.
![]()
|
➢ 刪除.
![]()
|
小結
➢ 自動生成序列號.
➢ 查看序列號的信息(USER_SEQUENCES).
➢ 建索引提升性能.
➢ 查看索引信息(USER_INDEXES).
➢ 使用同義詞.
第十三章 用戶及權限
• 建立用戶
• 建立角色
• 受權和收回權限
權限
➢數據庫的安全性
➢ 系統安全性
➢ 數據安全性
➢系統權限: 得到後可訪問數據庫
➢對象權限: 操做數據庫對象的內容
➢Schema: 對象的集合(tables, views, sequences)
系統權限
➢ 多於100種系統權限可用
➢ DBA 有最高系統權限.
Create new users(建立新用戶)
Remove users(刪除用戶)
Remove tables(刪除表)
Backup tables(備份表)
建用戶
➢ DBA 可以使用 CREATE USER 語句建用戶.
使用系統權限
➢ 建立用戶後,DBA需授給用戶系統權限.
➢ 一個應用開發者應有下列系統權限:
CREATE SESSION(創建會話的權限)
CREATE TABLE(建表權限)
CREATE SEQUENCE(建序列號權限)
CREATE VIEW(建視圖權限)
CREATE PROCEDURE(存儲過程權限)
授予系統權限
➢ DBA 可將指定的系統權限授予用戶.
什麼是角色(經過角色賦予權限)
![]() |
建立角色,用角色同時給多用戶受權
改變用戶口令
➢ 當建用戶時會初始化一個口令.
➢ 用戶可以使用 ALTER USER 語句改變口令.
對象權限
➢ 對象不一樣,對象權限也不一樣.
➢ 對象的全部者擁有對象的全部權限.
➢ 對象的全部者可將指定的權限授予其餘的用戶.
|
授予對象權限
指定對象權限賦予給用戶
指定對象特定列的權限賦予給用戶
使用WITH GRANT OPTION 和 PUBLIC 關鍵字
➢ 使被授予的用戶可轉授此權限.
➢ 全部的用戶均可查詢此表
確認權限的數據字典表
![]() |
收回對象的權限
➢ 使用REVOKE語句從其餘用戶收回權限.
➢ 經過 WITH GRANT OPTION授予的權限也可收回.
小結