一、事務1、提交2、回滾3、ACID特性二、視圖1、創建視圖2、刪除視圖3、更新視圖4、使用視圖三、子查詢1、 使用子查詢2、 標量子查詢3、 關聯子查詢一、事務在 RDBMS 中,事務是對錶中數據進行更新的單位。簡單來講,事務就是需要在同一個處理單元中執行的一系列更新處理的集合。事務開始語句STA... ...
一、事務
在 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);