您的位置:首页 > 数据库 > MySQL

MySQL基于实例sales创建自定义函数、视图、存储过程、触发器及查询结果创建新表

2016-07-26 00:21 495 查看

实例:数据库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)的销售金额。 



              

二、创建视图viewPro,要求显示每种产品的销售量和销售金额。  



            

三、创建存储过程p_Pro,要求能够根据指定的客户编号,统计该客户购买每种产品的产品号、数量。



     

四、创建一个触发器t_Stocks,要求当插入销售表(ProOut)的销售记录时,根据销售数量(Quantity)的变化,能更新产品表(Product)中相应的库存数量(Stocks)。 

  这里需要注意的是new和old的用在after和before时有不同,如下:



  运行结果:出现错误ErrorCode:1362

           UpdatingofNEWrowisnotallowedinaftertrigger

   原因是什么呢?是因为:

   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中。

   修改后语句:

1DELIMITER$$
2CREATETRIGGERt_StocksBEFOREINSERT
3ONprooutFOREACHROW
4BEGIN
5DECLAREnumINT;
6SETnum=
7(SELECTstocksFROMproductWHEREprono=new.prono);
8IFnum<new.quantity
9THENSETnew.quantity=num;
10ENDIF;    
11UPDATEproductSETstocks=stocks-new.quantityWHEREprono=new.prono;
12END$$
13DELIMITER;

测试:INSERTINTOprooutVALUES('2009-02-35','C002','P0001',900);--原来Stocks是800

         

                                               

五、在查询的基础上创建一张新表Cus,要求显示客户“C004”在2008年购买的产品号、数量。      

       MySQL提供的方法和SQLServer的select(查询)into[新表]from[源表]方法不同,使用的是Createtable[表名]as(查询)的方法。

      复制整个表为CREATETABLE[新表]SELECT*FEOM[源表];

<p><spandata-mce-style="font-size:16px;"style="font-size:16px;"><spandata-mce-style="font-size:16px;"style="font-size:16px;"><spandata-mce-style="font-size:16px;"style="font-size:16
1c13f
px;"></span></span></span></p><divclass="cnblogs_code"><pre><spandata-mce-style="color:#008080;"style="color:#08080;">1</span><spandata-mce-style="color:#0000ff;"style="color:#000099;">DROP</span><spanstyle="color:#000099;"><spandata-mce-style="color:#0000ff;"style="">TABLE</span><spandata-mce-style="color:#0000ff;"style="">IF</span></span><spandata-mce-style="color:#808080;"style="color:#808080;">EXISTS</span><spandata-mce-style="color:#000000;"style="color:#000000;">cus;
</span><spandata-mce-style="color:#008080;"style="color:#08080;">2</span><spandata-mce-style="color:#0000ff;"style="color:#000099;">CREATE</span><spanstyle="color:#000099;"><spandata-mce-style="color:#0000ff;"style="">TABLE</span></span>cus<spandata-mce-style="color:#0000ff;"style="color:#000099;">AS</span><spanstyle="color:#000099;"></span>
<spandata-mce-style="color:#008080;"style="color:#08080;">3</span><spandata-mce-style="color:#0000ff;"style="color:#000099;">SELECT</span>po.prono,<spandata-mce-style="color:#ff00ff;"style="color:#ff0ff;">SUM</span><spandata-mce-style="color:#000000;"style="color:#000000;">(po.quantity)
</span><spandata-mce-style="color:#008080;"style="color:#08080;">4</span><spandata-mce-style="color:#0000ff;"style="color:#000099;">FROM</span><spandata-mce-style="color:#000000;"style="color:#000000;">prooutpo
</span><spandata-mce-style="color:#008080;"style="color:#08080;">5</span><spandata-mce-style="color:#0000ff;"style="color:#000099;">WHERE</span>po.cusno<spandata-mce-style="color:#808080;"style="color:#808080;">=</span><spandata-mce-style="color:#ff0000;"style="color:#ff00;">'</span><spandata-mce-style="color:#ff0000;"style="color:#ff00;">c003</span><spandata-mce-style="color:#ff0000;"style="color:#ff00;">'</span><spandata-mce-style="color:#808080;"style="color:#808080;">AND</span><spandata-mce-style="color:#ff00ff;"style="color:#ff0ff;">YEAR</span>(po.saledate)<spandata-mce-style="color:#808080;"style="color:#808080;">=</span><spandata-mce-style="color:#800000;"style="color:#8000;">2008</span><spandata-mce-style="color:#0000ff;"style="color:#000099;">GROUP</span><spanstyle="color:#000099;"><spandata-mce-style="color:#0000ff;"style="">BY</span></span><spandata-mce-style="color:#000000;"style="color:#000000;">prono;</span>

  







阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐