MySQL(学习笔记)——数据库视图、触发器及存储过程

 数据库视图、触发器及存储过程

 1.什么是视图

  定义:视图是从数据库中一个或多个表中导出来的虚拟表,不在内存中。


MySQL(学习笔记)——数据库视图、触发器及存储过程_第1张图片

  语法:

create view 视图名 //(创建一张视图)
as
select 字段名1,字段名2,… from 表名
//(视图表头)    (视图里的信息从哪张实体表来)

  实例:

mysql> #制作一个视图提供给销售人员 他们需要知道商品名称 出售价格 商品的类型 产地等信息
mysql> create view view_sellSet as
    -> select c.c_name as 商品名称 ,c.c_madein as 商品产地,ct.ct_name as 商品类型 , c.c_outprice as 商品售价 
	->from commodity as c inner join commoditytype as ct on c.c_type=ct.ct_id where c.c_outprice is not null;
Query OK, 0 rows affected (0.02 sec)

mysql> # 视图使用上就和正常的数据表一致
mysql> #  视图在MySQL中拥有和实体表一致的地位
mysql> show tables;
+------------------+
| Tables_in_ishop1 |
+------------------+
| commodity        |
| commoditytype    |
| customer         |
| order            |
| view_sellset     |
+------------------+
5 rows in set (0.04 sec)

  视图是否能够进行增删改?是否会影响实表数据?
  因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表进行更新的,如果对视图增加或者删除记录,实际上是对其基本表增加或者删除记录。即视图的修改,会直接影响实表的数据


 2.什么是触发器

  定义:触发器是由事件来触发的与表事件相关的特殊的存储过程。

  触发器创建语法四要素:
  1.监视地点(table)
  2.监视事件(insert/update/delete)
  3.触发时间(after/before)
  4.触发事件(insert/update/delete)

  语法:
  create trigger tri_test1
  after insert on 表名
  for each row
  begin
  update 表名 set num=num-new.字段名 where 字段名=new.字段名;
  end;
  insert中通过new.调用表中数据
  delete中通过old.调用表中数据
  update中new.和old.可同时使用,调用的是不同时刻的表数据
  实例:

mysql> #写一个触发器 当新增一条订单时 自动从商品表的库存中扣去相应的商品订单数量
mysql> delimiter $  //修改命令结束标识符,保证触发事件的语句能够执行到下一句end
mysql> create trigger tri_1
	-> after insert on `order`
	-> for each row
	-> begin
	-> update commodity set c_num=c_num-new.o_num where c_id=new.o_cid;
	-> end$	                          //new.o_num表示新增订单中的商品数量
mysql> delimiter ;  //写完触发器,要将命令结束标识符修改回来

mysql> #修改订单的触发器
mysql> create trigger tri_3
	-> after update on `order`
	-> for each row
	-> begin
	-> update commodity set c_num=c_num+old.o_num-new.o_num where c_id=new.o_cid;
	-> end$                           //old.o_num调用上一次订单中购买的商品数量
	                                  //new.o_num调用新增订单中购买的商品数量
Query OK, 0 rows affected (0.10 sec)

mysql> #删除订单的触发器
mysql> create trigger tri_4
	-> after delete on `order`
	-> for each row
	-> begin
	-> update commodity set c_num=c_num+old.o_num where c_id=old.o_cid;
	-> end$
Query OK, 0 rows affected (0.11 sec)

 3.什么是存储过程

  定义:存储过程是能完成一定操作的一组SQL语句。
  作用:大大提高效率(存储过程本身执行速度非常快,调用存储过程大大减少数据库交互次数);提高代码重用性

  语法

  create procedure sp_name(proc_parameter[…])
  begin
  [characteristic …] routine_body
  end;
  sp_name:存储过程名称
  proc_parameter:存储过程的参数列表
  characteristic:存储过程的特性
  routine_body:SQL语句的内容,可以用begin…end来标志SQL语句的开始和结束

  实例
  存储过程分为 无参存储过程    有参存储过程
  有参存储过程具有 in / out / inout 三种参数形式

  无参存储过程案例

mysql> #最简单的案例 查询商品表
mysql> delimiter $
mysql> create procedure pro_queryall()
    -> begin
    -> select * from commodity;
    -> end$
Query OK, 0 rows affected (0.03 sec)

mysql> delimiter ;

  传入参数in的存储过程

mysql>  #第二个案例 动态查询客户购买的商品信息
mysql> delimiter $
mysql> create procedure pro_ask(in cu_id int(11))
    -> begin
    -> select c_name from commodity where c_id in (select o_cid from `order` where o_cuid=cu_id);
    -> end$
Query OK, 0 rows affected (0.03 sec)

mysql> delimiter ;

mysql> call pro_ask(1);   //调用存储过程使用call关键字
+-------------+
| c_name      |
+-------------+
| 中华铅笔HB  |
| 礼盒丝带-红 |
+-------------+
2 rows in set (0.01 sec)

Query OK, 0 rows affected (0.03 sec)

  传出参数out的存储过程

mysql> #  简单的案例 动态查询某商品的库存
mysql> delimiter $
mysql> create procedure pro_askcnum(in cid int(11),out cnum int(11))
    -> begin
    -> select c_num into cnum from commodity where c_id=cid;
    -> end$
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

  MySQL所有的变量都是字符串 当你进行运算的时候 MySQL会尝试进行数值的转换 如果转换不成功则抛出异常


  SQL中 if 语句的使用

mysql> # if(sva=1,"男","女")
mysql> select cu_name,cu_gender,if(cu_gender=1,'男','女')  //相当于Java中的三目运算
    -> from customer;
+---------+-----------+---------------------------+
| cu_name | cu_gender | if(cu_gender=1,'男','女') |
+---------+-----------+---------------------------+
| 刘德华  |         1 | 男                        |
| 张学友  |         1 | 男                        |
| 林志玲  |         0 | 女                        |
+---------+-----------+---------------------------+
3 rows in set (0.01 sec) 

  if(cu_gender=1,‘男’,‘女’)为派生字段即原表中没有的字段

  SQL中 case 语句的使用

mysql> select c_name,c_num,case when c_num<=10
    -> then '库存少' else '库存充足' end
    -> from commodity limit 20;
+-----------------------+-------+--------------------------------------------------------+
| c_name | c_num | case when c_num<=10 then '库存少' else '库存充足' end |
+-----------------------+-------+--------------------------------------------------------+
| 变形金刚-擎天柱       |    60 | 库存充足                                               |
| 变形金刚-霸天虎       |    50 | 库存充足                                               |
| 变形金刚-威震天       |    15 | 库存充足                                               |
| 魔仙玩偶1             |   100 | 库存充足                                               |
| 超人玩偶              |   100 | 库存充足                                               |
| 小霸王游戏机          |   300 | 库存充足                                               |
| X-BOX游戏机           |    12 | 库存充足                                               |
| 任天堂游戏机          |    30 | 库存充足                                               |
| 乐高玩具-散装         |   100 | 库存充足                                               |
| 乐高玩具-快乐家庭     |    20 | 库存充足                                               |
| 乐高玩具-蝙蝠侠纪念版 |     6 | 库存少                                                 |
| 夏日有人手办          |    10 | 库存少                                                 |
| EVA模型玩具           |    10 | 库存少                                                 |
| 平板电脑模型          |   120 | 库存充足                                               |
| 手机模型玩具          |    60 | 库存充足                                               |
| 手机模型玩具          |    10 | 库存少                                                 |
| 手机模型玩具          |     8 | 库存少                                                 |
| hellokitty手机链      |    40 | 库存充足                                               |
| 水枪-小               |    80 | 库存充足                                               |
| 水枪-大               |    80 | 库存充足                                               |
+-----------------------+-------+--------------------------------------------------------+
20 rows in set (0.01 sec)

  派生字段:case when c_num<=10 then ‘库存少’ else ‘库存充足’ end

你可能感兴趣的:(数据库)