1、鏈接
a)inner join中,on,能夠用where替代,但用on來專門指定join條件,其它條件寫在where中可讀性更好。
b)outer join
對於鏈接字段爲空的元祖,使用inner join時不會列出,outer join卻不同,left /right join會保留左(右)側的鏈接字段爲空的元祖。left join的過程能夠理解爲先執行inner join,而後再向結果集中添加左側關係中剩餘的元祖。
在outer join中,on和where就不能互換了
c)在SQL server中left outer join也是能夠寫的,但通常會省略inner、outer
2、視圖
a)前面學習過程當中接觸的表都是在數據庫中實際存在的,但有時用戶並不須要一張表的所有信息;甚至有時候不想讓用戶拿到額外的信息,好比有時只容許用戶查閱instructor表的id, name;或者有一些複雜的查詢咱們不但願每次都去重複寫一遍。這時可使用虛擬的表(virtual relation),即視圖(view),視圖不屬於數據庫的表,但能夠被用戶訪問到。
b)視圖的定義
寫法爲create view v as <query expression>;其中query expression能夠是任何查詢語句。好比以前的instructor視圖能夠這樣定義:
create view faculty as
select ID, name
from instructor;
而後只爲用戶提供訪問faculty視圖的權限,就能夠達成目的。
c)視圖被定義後,就能夠像真實的表同樣被使用,視圖還能夠嵌套視圖。在使用到視圖的時候,數據庫會執行視圖的定義語句來生成結果集,因此視圖的內容是實時的。
d) 物化視圖(Materialized Views)
視圖通常在被使用時纔會實時查詢出結果,這種方式雖然能保證數據是最新的,但開銷卻較大,在一些對計算資源有限制的場合、或者視圖被頻繁使用的時候、以及對查詢速度有要求時,須要視圖結果集能被保存起來,這種視圖稱爲物化視圖。
e)視圖的更新
視圖能夠爲查詢帶來方便,但視圖的更新卻涉及到多個問題,形成這些問題的根源是對視圖的更改須要反映到真實表上。因爲容許視圖出如今真實表能夠出現的任意位置,因此對於以前的faculty視圖,就能夠插入數據:
insert into faculty values (30765, ‘Green’);
但instructor.salary只能插入null了,instructor.salary若是規定不容許爲空,則操做會因違反一致性而被阻止。此外再考慮視圖關聯多張表、視圖的嵌套等狀況,會使得問題變得很是複雜,因此一般對視圖的更新是不被容許的。
3、事務
a)SQL標準規定了事務形式爲:包含查詢、更新語句,必須用commit work或rollback work來結束且」work」可省略。
b)若是SQL語句可能出錯,則能夠包含在事務中,commit相似於保存編輯好的文檔,而rollback至關於撤銷對文檔所作的修改。可是事務一旦被commit,就沒法再被rollback。事務是原子性的,事務包含的操做要麼所有成功,要麼所有失敗。若是在SQL語句執行過程當中發生系統奔潰、斷電等事故,只要沒有執行過commit,則在系統重啓後會首先回滾。
c)在許多數據庫產品中,默認每條單獨的SQL就是一個事務,執行結束後自動commit。
學習資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan
數據庫