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

MySQL基础语法3

2019-08-31 09:04 148 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/mu12306/article/details/100055083

MySQL基础语法3

知识点:
1.xx是什么
2.xxz怎么用
3.为什么用xx

视图

视图是什么

视图是一个虚拟表。硬盘上存在的是实表,硬盘上不存在的是虚表。虚表是对实表中存在字段的映射。

怎么用视图?

视图在使用上就和正常的数据表一致。视图在mysql中拥有的实体表一致的地位

mysql> show tables;
+------------------+
| Tables_in_ishop1 |
+------------------+
| commodity        |
| commoditytype    |
| customer         |
| order            |
| view_sellset     |
+------------------+
5 rows in set (0.04 sec)

为什么用视图?

1.对复杂的sql语句进行分装。
2.对于数据库敏感信息的保护

视图是否能进行增删改?是否会影响实表?

视图的修改会影响实表的数据。
视图本身没有办法修改。

范式

什么是范式?

大家共同约定、共同遵守的规范。

什么是数据库设计的三大范式?

三大范式层层递进。下一个范式的满足意味着上一个范式也满足。

第一范式:保持每列的原子性。
第二范式:确保表中的每列都和主键相关。
ps: 一张数据表至少要有一个主键

第三范式:确保数据表中的每一列必须和主键直接相关,而不是间接相关。
ps: 一张数据表有且只有一个主键

触发器

什么是触发器?

是mysql提供的一种功能。
当你执行一句sql命令后,让mysql自动完成一件事情。

怎么用触发器?

场景:银行转账时,原来需要用事务执行两句sql命令。现在需要做到这边扣钱,那边自动加钱。

触发器创建语法四要素:
1.监视地点 (table) 基于表,表示对哪张表进行监控
2.监视事件(insert/updata/delete) 用来监视执行的语句
3.触发时间 (after/before) 在我执行我的命令后、之前执行我预设好的命令
在大多数场景下,先执行后执行没有区别。但是有例外存在。

4.触发事件 (insert/updata/delete)预设的让mysql执行的命令语句 可以使用多聚sql语句,捆绑在一起。多句sql使用分号隔开。

实现触发器之前,修改命令结束标识符,为了写end完成触发器,否则按下回车,在完成触发器前就开始执行命令了。
如果触发器写完,命令结束标识符却不改回来,触发器就不会发挥作用。

delimiter $
delimiter ;

触发器的应用?

写一个触发器 当新增一条订单的时候 自动从商品表的库存中扣去相应的订单数量

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.08 sec)

mysql> delimiter ;

存储过程

存储过程是什么?

能完成一定操作的一组SQL语句。操作:mysql提供的类似JAVA中的方法。

存储过程怎么用?

最简单存储过程的案例:查询商品表

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

mysql> delimiter ;
mysql> call  pro_queryall();

具有传入参数的存储过程案例:动态查询客户购买的商品信息

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);

ps:变量名和字段名重复时,不建议使用

out参数的使用 动态查询某商品的库存

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> set @cn=12;
Query OK, 0 rows affected (0.00 sec)

mysql> select @cn;
+------+
| @cn  |
+------+
|   12 |
+------+
1 row in set (0.02 sec)

mysql> set @cn=-1;
Query OK, 0 rows affected (0.00 sec)

mysql> call pro_askcnum(12,@cn);
Query OK, 1 row affected (0.00 sec)

mysql> select @cn;
+------+
| @cn  |
+------+
|    6 |
+------+
1 row in set (0.00 sec)

ps:mysql所有的变量都是字符串类型,当你进行运算时,mysql会尝试进行类型转换,如果不成功会抛出异常

存储过程的应用?

在企业中很少用。
因为企业中的数据存储服务器专门用来进行数据的存储和查找。所有企业有一个业务逻辑处理服务器,专门用来进行业务处理。

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