首頁  >  文章  >  資料庫  >  MySQL懸系之事務與視圖介紹

MySQL懸系之事務與視圖介紹

零下一度
零下一度原創
2017-06-27 09:59:321064瀏覽
  • 一、交易

    • 1、提交

    • 2、回滾

    • #3、ACID特性

  • 二、檢視

    • 1、建立檢視

    • 2、刪除視圖

    • 3、更新視圖

    • ##4、使用視圖

  • 三、子查詢

    • #1、 使用子查詢

    • 2、標量子查詢

    • 3、關聯子查詢

#一、交易

##在RDBMS 中,交易是對錶中資料進行更新的單位。簡單來講,事務就是需要在同一個處理單元中執行的一系列更新處理的集合。

事务开始语句START TRANSACTION;

      DML语句①;
      DML语句②;
      DML语句③;
         .
         .
         .
事务结束语句(COMMIT或者ROLLBACK);

1、提交

COMMIT 是提交交易包含的全部更新處理的結束指令,相當於檔案處理中的覆蓋保存。一旦提交,就無法恢復到事務開始前的狀態了。

2、回滾

ROLLBACK 是取消交易包含的全部更新處理的結束指令,相當於檔案處理中的放棄保存。一旦回滾,資料庫就會恢復到交易開始之前的狀態。

3、ACID特性

DBMS 的事務都遵循四種特性,將這四種特性的首字母結合起來統稱為 ACID 特性。

    原子性(Atomicity) 原子性是指在事務結束時,其中所包含的更新處理要麼全部執行,要麼完全不執行。
  • 一致性(Consistency) 一致性指的是交易中包含的處理要滿足資料庫事先設定的約束,如主鍵約束或 NOT NULL 約束等。例如,設定了 NOT NULL 限制的欄位是無法更新為 NULL 的,試圖插入違反主鍵限制的記錄就會出錯,無法執行。對事務來說,這些不合法的 SQL 會被回滾。
  • 隔離性(Isolation) 隔離性指的是確保不同事務之間互不干擾的特性。此特性保證了事務之間不會互相嵌套。此外,在某個事務中進行的更改,在該事務結束之前,對其他事務而言是不可見的。因此,即使某個事務向表中新增了記錄,在沒有提交之前,其他事務也是看不到新新增的記錄的。
  • 持久性(Durability) 持久性指的是在交易(不論是提交還是回滾)結束後,DBMS 能夠保證該時間點的資料狀態會被保存的特性。即使由於系統故障導致資料遺失,資料庫也一定能透過某種手段進行恢復。
  • 二、視圖

視圖和表格的本質不同在於「是否保存了實際的資料」。

表格中儲存的是實際數據,而檢視中保存的是從表格中取出資料所使用的SELECT語句。

我們應該將常用的SELECT語句做成檢視。

1、建立檢視

--格式:CREATE VIEW 视图名称(<视图列名1>, <视图列名2>, ……) AS <SELECT语句>

CREATE VIEW v1 (product_name, name_cnt)
AS 
SELECT product_name, count(*)
FROM
    表名/视图名
GROUP BY product_name

注意:

    #避免在檢視的基礎上建立檢視。對多數 DBMS 來說,多重視圖會降低 SQL 的效能。
  • 定義視圖時不能使用ORDER BY子句
  • #2、刪除視圖
--格式:DROP VIEW 视图名称

DROP VIEW v1

3、更新視圖

-- 格式:ALTER VIEW 视图名称 AS <SELECT语句>

-- 格式:INSERT INTO 视图名称 VALUES(...)

注意:

    視圖和表格需要同時進行更新,因此透過匯總(聚合結合連表)得到的視圖無法進行更新INSERT。
記住,對視圖的更新歸根結底是對視圖所對應的表進行更新。

4、使用視圖

使用視圖時,將其當作表進行操作即可,由於視圖是虛擬表,因此無法使用其對真實表進行建立、更新且刪除操作,僅能做查詢用。

select * from v1

三、子查詢

1、 使用子查詢

子查詢就是一次檢視(SELECT語句)。與檢視不同,子查詢在SELECT語句執行完畢後就會消失。

-- 根据商品种类统计商品数量的视图
CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)
  FROM Product
 GROUP BY product_type;
 
 -- 确认创建好的视图
SELECT product_type, cnt_product
  FROM ProductSum;
  
--子查询
SELECT product_type, cnt_product
  FROM (SELECT product_type, COUNT(*)
           FROM Product
    GROUP BY product_type)AS ProductSum;

2、 標量子查詢

標量子查詢則有一個特殊的限制,那就是必須而且只能回傳1 行1 列的結果,也就是返回表中某一行的某一列的值。

SELECT product_id, product_name, sale_price
  FROM Product
 WHERE sale_price > (SELECT AVG(sale_price)
                       FROM Product);

3、 關聯子查詢

在細分的群組內進行比較時,需要使用關聯子查詢。

--子查询中添加的 WHERE 子句的条件
--该条件的意思是,在同一商品种类中对各商品的销售单价和平均单价进行比较。
SELECT product_id, product_name, sale_price
  FROM Product AS P1
 WHERE sale_price > (SELECT AVG(sale_price)
                          FROM Product AS P2
                          WHERE P1.product_type = P2.product_type
                         GROUP BY product_type);

以上是MySQL懸系之事務與視圖介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn