1. 程式人生 > >MySQL(二)--事務與視圖

MySQL(二)--事務與視圖

atom enc 消失 ability count 事務 統計 tran 操作

  • 一、事務
    • 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(二)--事務與視圖