SQL - 淺談視圖

用途

當業務複雜化,咱們就須要外鍵關聯,而對於高頻CRUD的表,外鍵關聯具有的強耦合,會致使維護成本偏高。sql

這時,開始使用中間表,中間表的瓶頸在於:數據的數量級將極大影響效率。數據庫

最終,咱們找到了視圖。函數

概念

視圖是一個虛擬表,它存在、可被查詢,卻很難修改、不建議修改(具有多種限制)。優勢在於:視圖的字段由咱們定義,這樣大大的優化了查詢效率。
(能夠想象,視圖查詢實際上是對格式化表的查詢優化

每次查詢視圖,數據庫都將顯示最新的數據。
每次修改數據,數據庫都將同步到基礎表(若是規則容許的話)。code

優越之處

  • 分拆表、重構數據庫,視圖保證了業務邏輯不變ci

  • 視圖做爲格式化表,有效遮蔽了保密數據同步

代碼

下列代碼建立了一個名爲table_test的簡單視圖。it

CREATE VIEW table_test AS(
    SELECT s.id AS id, 
    u.city AS city, 
    u.username AS username, 
    u.age AS age, 
    c.people AS people, 
    c.area AS area
    FROM user u, city c WHERE u.cityid = c.id
);

接下來,咱們對這個視圖的結構,進行修改。(再次重申,不建議修改視圖數據)table

ALTER VIEW table_test AS(
    SELECT s.id AS id, 
    u.city AS city, 
    u.username AS username, 
    c.people AS people, 
    c.area AS area
    FROM user u, city c WHERE u.cityid = c.id
);

不可修改

儘管有各類各樣的原則,去建議你們不對視圖作修改,但業務場景永遠高於理論原則,因此在這裏,列出 「擁有如下結構,將不能修改視圖數據」class

  • 聚合函數(SUM(), MIN(), MAX(), COUNT()等)。

  • DISTINCT

  • GROUP BY

  • HAVING

  • UNION或UNION ALL

  • 位於選擇列表中的子查詢

  • Join

  • FROM子句中的不可更新視圖

  • WHERE子句中的子查詢,引用FROM子句中的表。

  • 僅引用文字值(在該狀況下,沒有要更新的基本表)。

  • ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成爲不可更新的)。

相關文章
相關標籤/搜索