1.集合運算符
查詢部門號是10和20的員工信息: ?思考有幾種方式解決該問題??
- SQL> ?select * from emp where deptno in(10, 20)????
- SQL> ?select * from emp where deptno=10 or deptno=20 ??
- 集合運算:
Select *?from emp where deptno=10 加上
Select *?from emp where deptno=20
集合運算所操作的對象是兩個或者多個集合,而不再是表中的列(select一直在操作表中的列)
2.集合運算應用
- 參與運算的各個集合必須列數相同,且類型一致。
- 采用第一個集合的表頭作為最終使用的表頭。 (列名別名也只能在第一個集合上起)
- 可以使用括號()先執行后面的語句。
3.insert語句基本用法
使用 INSERT 語句向表中插入數據。其語法為:
INSERT INTO table [(column?[, column...])]
VALUES (value [, value...]);
如果:values后面的值,涵蓋了表中的所有列,那么table的列名可以省略不寫。
SQL> ?desc emp; ? 查看員工表的結構,得到所有的列名。
SQL> ?insert into?emp values?(1001, 'Tom', 'Engineer', 7839, sysdate, 5000, 200, 10 ) ???
SQL> ?insert into emp values (1005, 'Bone', 'Raphealy', 7829, to_date('17-12月-82', 'DD-MON-RR'), NULL, 300, 20); ?
如果:插入的時候沒有插入所有的列,就必須顯式的寫出這些列的名字。
SQL> ?insert into emp(empno, ename, sal, deptno) values(1002, 'Marry', 6000, 20); ?
注意:字符串和日期都應該使用 ' ' 號引用起來。
沒有寫出的列自動填NULL, 這種方式稱之為“隱式插入空值”。
?“顯式插入空值”: SQL> ?insert into emp(empno, ename, sal) values(1003, 'Jim', null); ??
SQL> insert into dept values(1, '1name', '1loc');
SQL> insert into dept(deptno, dname, loc) values(2, '2name', '2loc');
SQL> insert into dept(deptno, loc, dname) values(3, '3loc', '3name');
SQL> insert into dept(deptno, dname) values(4, '4name');
4.地址符
使用 INSERT 語句向表中插入數據。其語法為:
INSERT INTO table [(column?[, column...])]
VALUES (value [, value...]);
如果:values后面的值,涵蓋了表中的所有列,那么table的列名可以省略不寫。
SQL> ?desc emp; ? 查看員工表的結構,得到所有的列名。
SQL> ?insert into?emp values?(1001, 'Tom', 'Engineer', 7839, sysdate, 5000, 200, 10 ) ???
SQL> ?insert into emp values (1005, 'Bone', 'Raphealy', 7829, to_date('17-12月-82', 'DD-MON-RR'), NULL, 300, 20); ?
如果:插入的時候沒有插入所有的列,就必須顯式的寫出這些列的名字。
SQL> ?insert into emp(empno, ename, sal, deptno) values(1002, 'Marry', 6000, 20); ?
注意:字符串和日期都應該使用 ' ' 號引用起來。
沒有寫出的列自動填NULL, 這種方式稱之為“隱式插入空值”。
?“顯式插入空值”: SQL> ?insert into emp(empno, ename, sal) values(1003, 'Jim', null); ??
SQL> insert into dept values(1, '1name', '1loc');
SQL> insert into dept(deptno, dname, loc) values(2, '2name', '2loc');
SQL> insert into dept(deptno, loc, dname) values(3, '3loc', '3name');
SQL> insert into dept(deptno, dname) values(4, '4name');
5.批量處理
一次插入多條數據。
SQL> ?create table emp10 as select * from emp where 1=2; 創建一張表,用于測試。
SQL> ?select * from tab; ? 可以查看多了一張新表emp10,但select * from emp10?結果為空
SQL> ?desc emp10; ?? 發現該表的結構和emp表的結構完全相同。
一次性將emp表中所有10號部門的員工,放到新表emp10中來。
SQL> ?insert into?emp10 select * from emp where deptno=10 ; ???
一次性將 emp表中的指定列插入到表emp10中。
注意:insert的列名,要和select的列名一致
SQL> ?insert into emp10(empno, ename, sal, deptno)
???select empno, ename, sal, deptno ?from emp
???where deptno=10; ? 注意沒有values關鍵字了。且列名必須一一對應
總結: 子查詢可以出現在DML的任何語句中,不只是查詢套查詢。
6.更新數據和刪除數據操作
對于更新操作來說,一般會有一個“where”條件,如果沒有這限制條件,更新的就是整張表。
SQL> ?update?emp10 set sal=4000, comm=300 where?ename = 'CLARK'; ??( 或 where empno=7782;?)
注意:若沒有where限定,那么會將所有的員工的sal都設置成4000,comm設置成300;
SQL> ?update emp10 set comm = null where empno=1000; ?? 這個操作是否能成功呢?
SQL> ?select *?from emp where comm = null 這個查詢可以成功嗎?
主語句、子語句操作的可以不是同一張表。
涉及問題: 數據完整性問題——約束。 (插入、更新、刪除都可能造成表數據的變化)
約束:主鍵約束、外鍵約束、唯一約束、非空約束。 (簡單了解。后面約束章節講解)
7.事務
數據庫事務,是由有限的數據庫操作序列組成的邏輯執行單元,這一系列操作要么全部執行,要么全部放棄執行。
數據庫事務由以下的部分組成:
- 一個或多個DML語句
- 一個 DDL(Data Definition Language – 數據定義語言) 語句
- 一個 DCL(Data Control Language – 數據控制語言) 語句
?事務的特點:要么都成功,要么都不執行。
8.課程小結
事務4大特性
- 原子性?(Atomicity):事務中的全部操作在數據庫中是不可分割的,要么全部完成,要么均不執行。
- 一致性?(Consistency):幾個并行執行的事務,其執行結果必須與按某一順序串行執行的結果相一致。
- 隔離性 (Isolation):事務的執行不受其他事務的干擾,當數據庫被多個客戶端并發訪問時,隔離它們的操作,防止出現:臟讀、幻讀、不可重復讀。
- 持久性?(Durability):對于任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即使數據庫出現故障。?
9.表的創建
數據庫的對象:表、視圖、索引、序列、同義詞
:存儲過程、存儲函數、觸發器、包、包體、數據庫鏈路(datalink)、快照。(12個)
表 基本的數據存儲集合,由行和列組成。
視圖 從表中抽出的邏輯上相關的數據集合。
序列 提供有規律的數值。
索引 提高查詢的效率
同義詞 給對象起別名
10.修改表列
基本的數據存儲集合,由行和列組成。
表名和列名遵循如下命名規則:
- 必須以字母開頭
- 必須在 1–30 個字符之間
- 必須只能包含 A–Z, a–z, 0–9, _, $, 和 #
- 必須不能和用戶定義的其他對象重名
- 必須不能是Oracle 的保留字
- Oracle默認存儲表名是都是大寫
11.清空表
delete from 表名 (沒有where?條件) 也可以清空一張表
- delete 逐條刪除表“內容”,truncate 先摧毀表再重建。
(由于delete使用頻繁,Oracle對delete優化后delete快于truncate)
- delete 是DML語句,truncate 是DDL語句。DML語句可以閃回(flashback)和回滾rollback,DDL語句不可以閃回和回滾。
(閃回: 做錯了一個操作并且commit了,對應的撤銷行為。了解)
- 由于delete是逐條操作數據,所以delete會產生碎片,truncate不會產生碎片。
(同樣是由于Oracle對delete進行了優化,讓delete不產生碎片)。兩個數據之間的數據被刪除,刪除的數據——碎片,整理碎片,數據連續,行移動。
- delete不會釋放空間,truncate 會釋放空間。用delete刪除一張10M的表,空間不會釋放。而truncate會。所以當確定表不再使用,應使用truncate。
12.刪除表和重命名表
當表被刪除:
- 數據和結構都被刪除
- 所有正在運行的相關事務被提交
- 所有相關索引被刪除
- DROP TABLE 語句不能回滾,但是可以閃回
SQL> ?select * from tab?? 查看當前用戶下有哪些表。 拷貝保存表名。
SQL> ?drop table testsp?? 將測試保存點的表刪除。
SQL> ?select * from tab?? 再次查詢跟剛剛保存的表名比對,少了testsp,但多了另外一張命名復雜的表。
Oracle的回收站:
1. 查看回收站:show recyclebin??(sqlplus 命令) 那個復雜的命名即是testsp在回收站中的名字。
SQL> select * from testsp?? 這樣是不能訪問的。
SQL> select * from "BIN$+vu2thd8TiaX5pA3GKHsng==$0" ? 要使用“回收站中的名字”
2. 清空回收站:purge recyclebin?
SQL> drop table test1 purge? 表示直接刪除表,不經過回收站。
將表從回收站里恢復,涉及“閃回”的知識,作為了解性知識點。
注意:并不是所有的用戶都有“回收站”,對于沒有回收站的用戶(管理員)來說,刪除操作是不可逆的。
13.約束概念和分類
Not Null 非空約束
例如:人的名字,不允許為空。
2. Unique 唯一性約束
例如:電子郵件地址,不可以重復。
3. Check 檢查性約束
如:人的性別,只能填男或者女;工作后薪水滿足的條件應該大于0。
4. Primary Key 主鍵約束
主鍵是唯一標識表中某一行數據的列,主鍵約束隱含Not null + Unique。
一個表只能有一個主鍵,但是主鍵可以是某一列,也可以是多列組成表的主鍵,比如說可以用員工名和部門號兩列組成emp表的主鍵。將某兩個列作為主鍵必須用表級約束
constraint 約束名?primary key (列1,列2)
5. Foreign Key 外鍵約束
例如:部門表dept和員工表emp,不應該存在不屬于任何一個部門的員工。用來約束兩張表的關系。
一個表(子表)的外鍵必須是其他某個表(父表)的具有唯一約束的列(一般都用主鍵),子表外鍵的值必須滿足能在父表的列中存在,或者為NULL。
這里邊就涉及到一個問題,就是是父表的鍵值被刪除,這時候子表里邊的外鍵值應該怎么辦?有以下三種方案:
- 不允許刪除(restrict默認)
- 子表里邊的數據跟著刪除(cascade)
- 子表里邊的數據設置為空(set null)
多數情況下,使用SET NULL方法,防止子表列被刪除,數據出錯。
所以這里邊也涉及到刪除表的時候的順序:
1) 先將子表的內容刪除,然后再刪除父表。
2) 將子表外鍵一列設置為NULL值,斷開引用關系,然后刪除父表。