【SQL】MySQL基礎2——視圖,存儲過程,游標,約束,觸發器

文章目錄

  • 1. 視圖
  • 2. 存儲過程
    • 2.1 創建存儲過程
    • 2.2 執行存儲過程
  • 3. 游標
  • 4. 約束
    • 4.1 主鍵約束
    • 4.2 外鍵約束
    • 4.3 唯一約束
    • 4.4 檢查約束
  • 5. 觸發器

1. 視圖

視圖是虛擬的表,它是動態檢索的部分。使用視圖的原因:避免重復的SQL語句;使用表的部分而不是全部;限制用戶只能訪問表的部分以保護數據;更改數據格式和表示。
視圖要唯一命名;可以用視圖創建視圖;需要管理創建視圖的權限。

-- case1: 簡化SQL語句,為3表的連接創建視圖
CREATE VIEW ProductCustomers AS
SELECT cust_nam, cust_contact, prod_id
FROM Customers, Orders, OrderItems
WHERE Customers.cust_id = Orders.cust_idAND OrderItems.order_num = Orders.order_num;SELECT cust_nem, cust_contact
FROM ProductCustomers
WHERE prod_id = 'RGAN01';-- csae2: 重新格式化數據,為格式化的查詢創建視圖
CREATE VIEW VendorLocations AS
SELECT CONCAT(RTRIM(vend_name), ' (', RTRIM(vend_country), ')') AS vend_title
FROM Vendors
ORDER BY vend_name;SELECT * FROM VendorLocations;-- case3: 過濾數據
CREATE VIEW CustomersEmailList AS
SELECT cust_id, cust_name, cust_email
FROM Customers
WHERE cust_email IS NOT NULL;SELECT * FROM CustomerEmailList;-- case4: 為使用計算字段的查詢創建視圖
CREATE VIEW OrderItemExpanded AS
SELECT prod_id,quantity,item_price,quantity * item_price AS expanded_price
FROM OrderItems;SELECT *
FROM OrderItesExpanded
WHERE order_num = 20008;

2. 存儲過程

存儲過程(Stored Procedure)是一組為了完成特定功能而預先編譯并存儲在數據庫中的 SQL 語句集合。它類似于編程語言中的函數,有輸入輸出參數,可以接收用戶傳遞的數據,經過一系列的邏輯處理后返回結果。
存儲過程的作用:封裝復雜操作,向應用側減少操作步驟,從而減少出錯可能,有利于保證數據一致性;存儲過程內部變動對應用側無感知,基礎數據訪問被限制從而保證安全性;存儲過程以編譯形式存儲,DBMS工作量小,性能有所提高。

2.1 創建存儲過程

創建存儲過程涉及多行,為了避免默認分隔符 “;” 終止存儲過程的定義,需要使用DELIMITER操作符臨時修改分隔符,定義完成后再改回來。存儲過程中的局部變量應聲明放在最前面。
– v_rows是存儲過程中的一個整型變量,參數ListCOunt保存為存儲過程返回值。存儲過程的執行結果先保存在v_rows中,再賦值給返回參數ListCOunt

DELIMITER //
CREATE PROCEDURE MailingListCount(OUT ListCount INT)
BEGINDECLARE v_rows INT DEFAULT 0;SELECT COUNT(*) INTO v_rowsFROM CustomersWHERE cust_email IS NOT NULL;SET ListCount = v_rows;
END //
DELIMITER ;-- 查看已經創建的存儲過程
show procedure status;-- 刪除存儲過程
drop procedure xxx;

2.2 執行存儲過程

SET @ListCount = 0;
CALL MailingListCount(@ListCount);
SELECT @ListCount;

3. 游標

游標主要用于從結果集中相鄰地取出數據。游標只能讀取,不能更新和刪除。
游標主要是在存儲過程、函數或觸發器內部使用,并且它們是局部對象,僅在定義它們的塊內可見,不具備全局的視圖或系統表來直接展示所有已創建的游標。
游標的定義沒有執行數據檢索操作。打開游標操作才實際執行檢索操作。

-- 僅僅檢索一行
CREATE PROCEDURE CurTest()
BEGINDECLARE v_cust_id char(10);DECLARE v_cust_name char(50);DECLARE CustCursor CURSORFORSELECT cust_id, cust_name FROM CustomersWHERE cust_country = 'USA';OPEN CustCursor;FETCH CustCursor INTO v_cust_id, v_cust_name;SELECT v_cust_id, v_cust_name;CLOSE CustCursor;
END;-- 檢索多行
CREATE PROCEDURE CurTest()
BEGINDECLARE v_cust_id char(10);DECLARE v_cust_name char(50);DECLARE done INT;DECLARE CustCursor CURSORFORSELECT cust_id, cust_name FROM CustomersWHERE cust_country = 'USA';DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN CustCursor;read_loop: LOOPFETCH CustCursor INTO v_cust_id, v_cust_name;IF done THENLEAVE read_loop;END IF;SELECT CONCAT('Customer ID: ', v_cust_id, ', Name: ', v_cust_name);END LOOP;CLOSE CustCursor;
END;

4. 約束

約束是管理插入或者處理數據庫數據的規則,DBMS通過在數據庫表上施加約束來實現引用完整性。OrderItems表的order_num字段引用了Orders表的order_num字段,OrderItems表中的order_num字段值一定要出現在Orders表的order_num列中,這就是引用完整性。

4.1 主鍵約束

-- 創建主鍵方法一:
CREATE TABLE Vendors
(vend_id CHAR(10) NOT NULL PRIMARY KEY,...
)-- 創還能主鍵方法二:
ALTER TABLE Vendors
ADD CONSTRAINT PRIMARY KEY(vend_id);

4.2 外鍵約束

外鍵是表中的一列,其值必須在另一表的主鍵中。比如Orders表的cust_id可以作為外鍵,其值在Customers表中cust_id列中,而cust_id列式Customers表的主鍵。再如OrderItems表的order_num列可以作為外鍵,而order_num列又是Orders表的主鍵。設置外鍵的作用是,外鍵取值范圍限定在其作為主鍵的表所給出的那些主鍵值上。

-- 定義外鍵約束方法一:
CREATE TABLE Orders
(order_num INT NOT NULL PRIMARY KEY,order_date DATETIME NOT NULL,cust_id CHAR(10) NOT NULL REFERENCES Customers(cust_id)
);
-- 定義外鍵方法二:
ALTER TABLE Orders
ADD CONSTRAINT
FOREIGN KEY(cust_id) REFRENCES Customers(cust_id);

4.3 唯一約束

唯一約束和和主鍵的區別:唯一約束允許NULL值;唯一約束允許修改或者更新;唯一約束列值可以重用;唯一約束不能用來定義外鍵;

-- 定義唯一約束之一
CREATE TABLE Employees
(employee_id INT NOT NULL PRIMARY KEY,secure_no INT DEFULT 000,phone char(11) DEFAULT '',name char(10) DEFAULT '',age INT DEAFULT 18,UNIQUE(secure_no, phone)
)-- 定義唯一約束之二:命名的唯一約束
ALERT TABLE Employees
ADD CONSTRAINT unique_constraint
UNIQUE (secure_no, phone);-- 定義唯一約束之三:匿名的唯一約束
ALERT TABLE Employees
ADD UNIQUE(secure_no, phone);-- 刪除唯一約束,唯一約束本質是唯一索引
ALTER TABLE employees
DROP INDEX unique_constraint;

4.4 檢查約束

檢查約束用于確保插入的值滿足檢查的條件。

-- case1: 檢查字段quantity值大于0
CREATE TABLE OrderItems
(order_num INT NOT NULL,order_item INT NOT NULL,prod_id CHAR(10) NOT NULL,quantity INT NOT NULL CHECK (quantity > 0),item_price MONEY NOT NULL
);-- case2:檢查性別是否只包含字母M和字母F
ALTER TABLE employee
ADD CONSTRAINT chk_gender CHECK (gender IN ('M', 'F'));

5. 觸發器

當特定的數據庫操作發生時要執行一些額外的工作,就需要使用觸發器。觸發器是綁定到單個表的。執行對表的特定操作會觸發觸發器的操作。觸發器的用途:操作執行前數據統一格式;記錄某個表的變動到另一個表;進行額外驗證;產生計算列的值;更新時間戳。
注意點:觸發器操作可以在其所綁定的操作之前或者之后執行,MySQL不允許在觸發器操作對同一張表在綁定操作后再進行操作。比如只能在插入操作之前把要插入的數據轉為大寫。

-- 插入前轉為大寫
CREATE TRIGGER customer_state
BEFORE INSERT ON Customers
FOR EACH ROW
BEGIN-- 在插入之前將 cust_state 轉換為大寫SET NEW.cust_state = UPPER(NEW.cust_state);
END;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76034.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OGG故障指南:OGG-01163 Bad column length (xxx) specified for column

報錯 OGG-01163 Bad column length (xxx) specified for column AAA in table OWNER.TABLE, maximum allowable length is yyy原因 源端修改了字段長度。 雖然源端和目標端的長度已經通過DDL語句修改到一致,在extract進程未重啟的情況下,生成的trail文…

Linux進程狀態補充(10)

文章目錄 前言一、阻塞二、掛起三、運行R四、休眠D五、四個重要概念總結 前言 上篇內容大家看的云里霧里,這實在是正常不過,因為例如 寫實拷貝 等一些概念的深層原理我還沒有講解,大家不用緊張,我們繼續往下學習就行!&…

信息學奧賽一本通 1609:【例 4】Cats Transport | 洛谷 CF311B Cats Transport

【題目鏈接】 ybt 1609:【例 4】Cats Transport 洛谷 CF311B Cats Transport 【題目考點】 1. 動態規劃:斜率優化動規 【解題思路】 解法1:設a點的前綴和 輸入的 d d d序列是從 d 2 d_2 d2?到 d n d_n dn?,共n-1個數字。人…

bluecode-20240913_1_數據解碼

時間限制:C/C 1000MS,其他語言 2000MS 內存限制:C/C 256MB,其他語言 512MB 難度:困難 數據解碼 指定有一段經過編碼的二進制數據,數據由0個或多個"編碼單元"組成。"編碼單元"的編碼方式…

接口自動化進階 —— Pytest全局配置pytest.ini文件詳解!

pytest.ini 是 Pytest 的全局配置文件,用于自定義測試運行的行為和規則。通過配置 pytest.ini,可以避免在命令行中重復輸入參數,提升測試的效率和一致性。 1. 配置文件的位置和格式 位置:pytest.ini 文件通常放在項目的根目錄下。…

ModuleNotFoundError: No module named ‘demjson‘

錯誤 ModuleNotFoundError: No module named demjson 表明 Python 無法在其環境中找到名為 demjson 的模塊。demjson 是一個第三方庫,用于在 Python 中編碼和解碼 JSON 數據。如果你嘗試導入它但遇到了這個錯誤,那很可能是因為你的 Python 環境中沒有安裝…

1、C51單片機(STC8G2K64S4)串口實驗

一、串口1接線圖 1、下面是單片機外接電路圖,P30,P31分別用于RXD和TXD功能引腳 2、我們來查看單片機手冊 串口1需要設置的寄存器 串口1的功能腳配置選擇位,看電路圖選擇的是P3.0,P3.1。 3、串口1:SCON控制寄存器 設置為0x50:0101 0000。&a…

3PL EDI:SA Piper Logistics EDI需求分析

SA Piper Logistics成立于2005年,是一家專注于全球供應鏈管理的第三方物流服務商(3PL),總部位于美國芝加哥。公司以“優化物流效率,重塑供應鏈價值”為使命,提供倉儲管理、運輸規劃、訂單履行及跨境清關等一…

vscode正則表達式使用

小標題 ^\d.\d.\d\s.*$ ^表示匹配字符串的開頭。\d\.\d\.\d表示匹配一到多個數字,接著一個小數點,再接著一到多個數字,然后又一個小數點和一到多個數字,用來匹配類似 “2.1.1” 這樣的標題號部分。\s表示匹配一個空格。.*表示匹配…

力扣.旋轉矩陣Ⅱ

59. 螺旋矩陣 II - 力扣&#xff08;LeetCode&#xff09; 代碼區&#xff1a; class Solution {const int MAX25; public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> ans;vector<int> hang;int len_nn;int arry[25][25]…

軟件工程面試題(十)

1、OSI七層模型tcp四層模型是什么樣的 OSI七層參考模型 :物理層 、數據鏈路層 、網絡層 、傳輸層、應用層、會話層、表示層 TCP/IP:第一層網絡接口層第二層 第二層??網間層 第三層??傳輸層 第四層??應用層 2、JAVA測試模式(ZZ): 模式(一) Main 模式 模式(二)…

淘寶雙十一大促監控系統開發:實時追蹤爆品數據與流量波動

以下是開發一個淘寶雙十一大促監控系統&#xff0c;以實時追蹤爆品數據與流量波動的詳細步驟及示例代碼&#xff1a; 實現思路 數據獲取&#xff1a;利用淘寶 API 或者爬蟲技術&#xff0c;獲取商品的銷售數據、瀏覽量等信息。數據存儲&#xff1a;將獲取到的數據存儲到數據庫…

高并發金融系統,“可觀測-可追溯-可回滾“的閉環審計體系

一句話總結 在高并發金融系統中&#xff0c;審計方案設計需平衡"觀測粒度"與"系統損耗"&#xff0c;通過雙AOP實現非侵入式采集&#xff0c;三表機制保障操作原子性&#xff0c;最終形成"可觀測-可追溯-可回滾"的閉環體系。 業務痛點與需求 在…

Docker 的實質作用是什么

Docker 的實質作用是什么 目錄 Docker 的實質作用是什么**1. Docker 的實質作用****2. 為什么使用 Docker?****(1)解決環境一致性問題****(2)提升資源利用率****(3)簡化部署與擴展****(4)加速開發與協作****3. 舉例說明****總結**Docker 的實質是容器化平臺,核心作用…

【測試】每日3道面試題 3/29

每日更新&#xff0c;建議關注收藏點贊。 自動化測試中的PO模式 page object model POM 是一個設計模式&#xff0c;在自動化測試中將頁面元素和操作抽象為對象。具體是將每個頁面或頁面一部分封裝為一個類&#xff0c;包含頁面元素和相關操作。 PO 模式不僅適用于 Web 應用的自…

ISIS-4 LSP計算

上一章我們介紹了ISIS的LSDB的形成以及相關實驗 這一章我們來介紹ISIS是怎樣來計算我們的路由的 1、LSDB數據庫 之前我們在ISIS概述里面已經提及到Level-1的路由器設備只會維護Level-1的LSDB Level1-2會維護Level-1以及Level-2的LSDB,Level-2只會維護Level-2的LSDB 2、ATT置…

第7期:生成式AI倫理邊界——當技術撞上道德與法律的防火墻

現實版"黑鏡"事件 某直播平臺主播使用AI換臉技術冒充明星帶貨&#xff0c;當晚銷售額破億。三天后收到法院傳票——這不僅侵犯肖像權&#xff0c;生成的虛假宣傳內容還引發大規模消費投訴。這個案例讓行業意識到&#xff1a;沒有倫理約束的AI&#xff0c;就像沒有剎車…

Vue2 使用 v-if、v-else、v-else-if、v-show 以及 v-has 自定義指令實現條件渲染

提示&#xff1a;渲染就是顯示 文章目錄 前言v-if 的基礎用法v-elsev-else-ifv-show 和 v-if 對比自定義指令 v-hasv-if 和 v-has 結合使用場景完整示例補充說明 前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 在 Vue2 中&#xff0c;可以通過 v-if 和…

【項目合集】只能xx養殖系統,STM32、esp8266、OLED屏幕、dht11、光敏、水位、加熱、風扇

硬件 STM32 主控ESP8266 WIIF 模塊煙霧傳感器dht11 溫濕度傳感器光敏傳傳感器&#xff08;偏暗、亮兩種狀態&#xff09;水位檢測OLED 顯示當前狀態&#xff08;環境數據&#xff09;加熱模塊&#xff08;燈代替&#xff09;風扇模塊電源模塊繼電器&#xff08;控制風扇&#…

Java多線程與高并發專題——Condition 和 wait/notify的關系

引入 上一篇關于Condition&#xff0c;我們對Condition有了進一步了解&#xff0c;在之前生產/消費者模式一文&#xff0c;我們講過如何用 Condition 和 wait/notify 來實現生產者/消費者模式&#xff0c;其中的精髓就在于用Condition 和 wait/notify 來實現簡易版阻塞隊列&am…