MySQL基於實例sales創建自定義函數、視圖、存儲過程及觸發器

来源:http://www.cnblogs.com/Mxr-Axe/archive/2016/07/25/5705694.html
-Advertisement-
Play Games

實例:資料庫sales 1.客戶表(Customer) 2.產品表(Product) 3.銷售表(ProOut) 一、創建一自定義函數sumMoney,要求能夠利用該函數計算出銷售金額,併進行測試,利用該函數計算出每種產品(ProNo)的銷售金額。 二、創建視圖viewPro,要求顯示每種產品的銷售 ...


 

實例:資料庫sales

1.客戶表(Customer)

客戶編號(CusNo) 姓名(CusName) 地址(Address) 電話(Tel)
C001 楊婷 北京 010-5328953
C002 李和平 上海 021-62359651
C003 葉新 成都 024-3222781
C004 馮辰誠 上海 021-87235965

2.產品表(Product)

產品編號(ProNo) 品名(ProName) 單價(price) 庫存數量(Stocks)
P0001 液晶電視 5600.00 800
P0002 空調 2390.00 460
P0003 洗衣機 3700.00 600
P0004 電熱水器 890.00 120

3.銷售表(ProOut)

銷售日期(SaleDate) 客戶編號(CusNo) 產品編號(ProNo) 銷售數量(Quantity)
2007-10-27 C001 P0001 3
2007-11-06 C004 P0003 40
2007-12-27 C001 P0003 5
2008-3-15 C002 P0002 12
2008-05-02 C003 P0002 21
2008-05-02 C003 P0001 9
2008-09-21 C004 P0001 30
2008-11-21 C004 P0001 73

一、創建一自定義函數sumMoney,要求能夠利用該函數計算出銷售金額,併進行測試,利用該函數計算出每種產品(ProNo)的銷售金額。
  

複製代碼
 1 DELIMITER $$
 2 CREATE FUNCTION sumMoney( pno VARCHAR(10)) -- 輸入產品編號
 3 RETURNS DOUBLE(10,2)   -- 返回金額數據類型
 4 BEGIN  -- 函數體(返回銷售金額=產品單價*銷售數)
 5 RETURN
 6 (SELECT SUM(quantity) FROM proout po,product pr WHERE po.prono=pr.prono AND pr.prono=pno GROUP BY po.prono) --銷售數
 7 *(SELECT pr.price FROM product pr WHERE pr.prono=pno ); --單價
 8 END$$
 9 DELIMITER ;
10 
11 測試:SELECT sumMoney('P0001'); 
複製代碼

              

二、創建視圖viewPro,要求顯示每種產品的銷售量和銷售金額。  

複製代碼
 1 DELIMITER $$
 2 CREATE FUNCTION sumMoney( pno VARCHAR(10))    -- 輸入產品編號
 3 RETURNS DOUBLE(10,2)   -- 返回金額數據類型
 4 BEGIN  -- 函數體(返回銷售金額=產品單價*銷售數)
 5 RETURN
 6 (SELECT SUM(quantity) FROM proout po,product pr WHERE po.prono=pr.prono AND pr.prono=pno GROUP BY po.prono) --銷售數
 7 *(SELECT pr.price FROM product pr WHERE pr.prono=pno ); --單價
 8 END$$
 9 DELIMITER ;
10 
11 測試:SELECT sumMoney('P0001'); 
複製代碼

            

三、創建存儲過程p_Pro, 要求能夠根據指定的客戶編號,統計該客戶購買每種產品的產品號、數量。

複製代碼
 1 DELIMITER $$
 2 CREATE
 3 PROCEDURE  p_Pro(cno VARCHAR(10)) -- 創建存儲過程PROCEDURE,名稱 p_Pro,參數名稱及參數類型(cno VARCHAR(10))
 4 BEGIN
 5 SELECT po.prono AS'產品號',SUM(po.quantity)AS'數量'
 6 FROM proout po WHERE po.cusno=cno GROUP BY po.prono; -- 存儲的內容
 7 END$$
 8 DELIMITER ;
 9 
10 測試:CALL p_Pro('C004');   -- 使用CALL關鍵字
複製代碼

         

四、創建一個觸發器t_Stocks,要求當插入銷售表(ProOut)的銷售記錄時,根據銷售數量(Quantity)的變化,能更新產品表(Product)中相應的庫存數量   (Stocks)。 

  這裡需要註意的是new和old的用在after和before時有不同,如下:

複製代碼
 1 DELIMITER $$
 2 CREATE TRIGGER t_Stocks AFTER INSERT
 3 ON proout FOR EACH ROW
 4 BEGIN
 5 DECLARE num INT ;       -- 定義變數,關鍵字DECLARE
 6 SET num =
 7 (SELECT stocks FROM product WHERE prono = new.prono);
 8 IF num < new.quantity
 9 THEN SET new.quantity = num ;
10 END IF ;     -- IF 條件表達式 THEN 執行語句 END IF;
11 /*假設給的銷售數大於庫存數,那新的庫存數將為負數,這與實際不相符,所以對銷售數進行判斷,如果大於庫存數,重新賦值銷售數=庫存數*/
12 UPDATE  product  SET stocks = stocks - new.quantity WHERE prono = new.prono ;
13 END $$
14 DELIMITER ;
複製代碼

  運行結果:出現錯誤 Error Code :1362

            Updating of NEW row is not allowed in after trigger

   原因是什麼呢?是因為:

   AFTER是先完成數據的INSERT/UPDATE/DELETE,再觸發,觸發的語句晚於監視的增刪改操作,無法影響前面的INSERT/UPDATE/DELETE動作。

   也就是說在AFTER中對new數據進行重新賦值不能影響前面的INSERT/UPDATE/DELETE動作,也就變得沒有意義,因此在AFTER中不能對new數據進行 賦值,只能讀取。

     BEFORE是先完成觸發,再進行INSERT/UPDATE/DELETE,觸發的語句先於監視的INSERT/UPDATE/DELETE,也就是有機會判斷、修改INSERT /UPDATE/DELETE操作,因此對new數據賦值要放在BEFORE中。

   修改後語句:

複製代碼
 1 DELIMITER $$
 2 CREATE TRIGGER t_Stocks BEFORE INSERT
 3 ON proout FOR EACH ROW
 4 BEGIN
 5 DECLARE num INT ;    
 6 SET num =
 7 (SELECT stocks FROM product WHERE prono = new.prono);
 8 IF num < new.quantity
 9 THEN SET new.quantity = num ;
10 END IF ;     
11 UPDATE  product  SET stocks = stocks - new.quantity WHERE prono = new.prono ;
12 END $$
13 DELIMITER ;
14 
15 測試:INSERT INTO proout VALUES('2009-02-35','C002','P0001',900);   -- 原來Stocks是800
複製代碼

          

    

五、在查詢的基礎上創建一張新表Cus,要求顯示客戶“C003”在2008年購買的產品號、數量。      

        MySQL提供的方法和SQL Server的 select (查詢) into [新表] from [源表]方法不同,使用的是Create table [表名] as (查詢)的方法。

       複製整個表為 CREATE TABLE [新表] SELECT * FEOM [源表];

 

1 DROP TABLE IF EXISTS cus;
2 CREATE TABLE cus AS 
3 SELECT po.prono,SUM(po.quantity) 
4 FROM proout po 
5 WHERE po.cusno='c003' AND YEAR(po.saledate)=2008 GROUP BY prono;

 

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1/需要一個wnmp之類的虛擬伺服器 2/創建路由 php artisan make:route routes Route::group(['middleware' => ['web','admin.login'],'prefix'=>'admin','namespace'=>'Admin' ], ...
  • 在ORACLE資料庫中,DBA_OBJECTS視圖中OBJECT_TYPE為LOB的對象是什麼東西呢?其實OBJECT_TYPE為LOB就是大對象(LOB),它指那些用來存儲大量數據的資料庫欄位。下麵演示一下: CREATE TABLE TEST( "ID" NUMBER, "NAME" NVARC... ...
  • 原創文章,轉載請標明原文鏈接:http://www.cnblogs.com/wingsless/p/5708992.html 昨天寫了有關事務日誌的一些基本點(http://www.cnblogs.com/wingsless/p/5705314.html),今天結合我最近的學習成果繼續總結事務日誌的 ...
  • mongostat是mongdb自帶的狀態檢測工具,在命令行下使用。它會間隔固定時間獲取mongodb的當前運行狀態,並輸出。如果你發現資料庫突然變慢或者有其他問題的話,你第一手的操作就考慮採用mongostat來查看mongo的狀態。 mongostat命令格式,當然也可以加參數: 在第一個例子中 ...
  • 數據透明加密註意事項: 1、資料庫加密只能在 企業版本進行,非企業版不能加密 2、資料庫加密完成,備份一個加密證書備用 3、資料庫一旦加密就解除不了加密 (加密前你可以把備份的資料庫還原到任意可以還原的機器資料庫上,加密完以後 即使關閉加密,如果要在另外機器上還原也需要吧原先的加密證書導入到機器上) ...
  • 1:查看、修改AWR報告快照數據的採樣間隔、保存策略 SQL> COL DBID FOR 999999999999SQL> COL SNAP_INTERVAL FOR A26SQL> COL RETENTION FOR A26SQL> COL TOPNSQL FOR A10SQL> select *... ...
  • 安裝環境:VMware9(橋接模式) + Linux bogon 2.6.32-642.3.1.el6.x86_64(查看linux版本信息:uname -a) 先給出MySQL For Linux 源碼下載地址,是xx.tar.zg格式的,如下: http://www.filewatcher.co ...
  • 大三上學期,我們學習了資料庫和JAVASE,資料庫對於我們是一門非常重要的課程。我們進行了為期兩周的課程設計。我的代碼是從網上找的學生信息管理系統,然後根據自己的需求進行修改,最終還是完成了此次課程設計。 西安建築科技大學課程設計(論文)任務書 一、課程設計(論文)題目 辦公室日常管理信息系統 二、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...