初识数据库4

数据库视图

试图是一个虚拟表,是一个映射,不存在内存中,是从数据库中一个或多个表中导出来的表,是不存在的。

创建视图

语法CREATE VIEW 视图名 AS<select statemen>
示例

create view view_sellset as
elect c_name as '商品名称',c_outprice as '商品售价', c_madein as '商品产地',c_type as '商品类型' 
from commodity inner join commoditytype on c_type=ct_id 
where c_outprice is not null;

Query OK, 0 rows affected (0.13 sec)

查看视图

语法

  • DESCRIBE语句查看视图基本信息
    describe 视图名;
  • SHOW TABLE STATUS语句查看视图基本信息
    SHOW TABLE STATUS LIKE ‘视图名’;
  • SHOW CREATE VIEW语句查看视图详细信息
    SHOW CREATE VIEW 视图名;

修改视图

语法ALTER VIEW 视图名 AS <select statement>

更新视图

更新视图是指通过插入、更新、删除表中的数据,
因为视图是一个虚拟表,其中没有数据。通过视图更
新的时候都是转到基本表进行更新的,如果对视图增
加或者删除记录,实际上是对其基本表增加或者删除
记录

删除视图

语法DROP VIEW [IF EXIST]视图名[,视图名2]...

触发器

触发器是什么?
当你执行一句sql命令后MYSQL自动去完成一件事。
观察颜色

触发器 new(insert语句,只有new合法)

mysql> #修改命令结束标识符
mysql> delimiter $
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 $
Query OK, 0 rows affected (0.33 sec)
mysql> delimiter ;
mysql> select c_name,c_num from commodity where c_id=12;
+-----------------------+-------+
| c_name                | c_num |
+-----------------------+-------+
| 乐高玩具-蝙蝠侠纪念版 |    16 |
+-----------------------+-------+
1 row in set (0.00 sec)

mysql> insert into `order`(o_cuid,o_cid,o_num) values(1,12,12);
Query OK, 1 row affected (0.62 sec)

mysql> select c_name,c_num from commodity where c_id=12;
+-----------------------+-------+
| c_name                | c_num |
+-----------------------+-------+
| 乐高玩具-蝙蝠侠纪念版 |     4 |
+-----------------------+-------+
1 row in set (0.00 sec)

触发器old(delete语句,只有old是合法的)

mysql> delimiter $
mysql> create trigger tri_2
    -> 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.14 sec)

触发器new和old(update语句,new和old可同时使用)

mysql> delimiter $
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=old.o_cid;
    -> end $
Query OK, 0 rows affected (0.11 sec)

存储过程

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

创建存储过程

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

mysql> delimiter $
mysql> create procedure pro1()
    -> begin
    -> select * from commodity;
    -> end $
Query OK, 0 rows affected (0.08 sec)
delimiter ;
mysql> call pro1;

示例输入in

mysql> delimiter $
mysql> create procedure pro2(in cuid int(11))
    -> begin
    -> select c_name from commodity where c_id in(select o_cid from `order` where cuid=o_cuid);
    -> end $
Query OK, 0 rows affected (0.02 sec)
mysql> call pro2(1);

示例输出out

mysql> delimiter $
mysql> create procedure pro3(in cid int(11),out cnum int(11))
    -> begin
    -> select c_num into cnum from commodity where cid=c_id;
    -> end &
delimiter ;
Query OK, 0 rows affected (0.00 sec)

mysql> set @en=1;
Query OK, 0 rows affected (0.00 sec)
mysql> call pro3(2,@en);
Query OK, 1 row affected (0.00 sec)
mysql> select @en;
+------+
| @en  |
+------+
|   60 |
+------+
1 row in set (0.00 sec)

数据库设计三范式

  • 第一范式(确保每列保持原子性):不能分割
  • 第二范式(确保表中的每列都和主键相关): 一张数据表至少有一个主键
  • 第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关: 一张数据表有且只有一个主键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值