第十三节 -视图、事物、索引、存储过程、触发器
东西比较多比较杂,笔记当时学的时候记得也是东一榔头,西一棒槌的
视图:
为什么要用视图?
语法:
create view 视图名字(列名1,列名2) as 一条select语句
1、可以简化查询
查询每个栏目下面商品的平均价格,并按照平均价格排序,查询平均价前三高的栏目。
SELECT cat_id,AVG(market_price) AS price
FROM goods
GROUP BY cat_id ORDER BY price DESC LIMIT 3;
视图情况:
CREATE VIEW v_top3_avg_by_cat AS
SELECT cat_id,AVG(market_price) AS price
FROM goods
GROUP BY cat_id ORDER BY price DESC LIMIT 0,3;
查询操作返回结果集,这个查询结果就可以当成一张表来使用。
视图就是将这个查询返回的结果集起了一个名字保存起来,视图就是
临时存储数据构成的一张表。
不是一个真正的表,但是我们使用时候可以当成一张表来使用。
2、可以进行权限控制
把表的增删改查的权限封闭,但是只开放相应的视图权限,视图里面只是有我们想开放的数据。
-- 班级名称 学生人数
-- 通过查询视图实现,班级人数>1
1、视图的数据来源于数据表,修改视图的时候也会修改数据表。
2、但是我们建议使用视图主要用于查询数据,不建议用视图去修改数据。
索引:书的目录
什么是索引:
索引是一个“内置表”,该表的数据是对某个真实表的某个(些)字段的数据做了“排序”之后的存储形式。
其作用是:极大提高表查找数据的速度!——其效率(速度)可以匹敌二分查找(非常著名的算法)。
注意:索引在提高查找速度的同时,降低增删改的速度。
对创建(设计)表来说,建立索引是非常简单的事,形式如下:
索引类型 (字段名1,字段名2, .... ) //可以使用多个字段建立索引,但通常是一个
有以下几种索引:
1、普通索引:key(字段名1,字段名2, .... ):它只具有索引的基本功能——提速(其他索引不但有提速还有额外功能)
2、唯一索引:unique key (字段名1,字段名2, .... )
3、主键索引:primary key (字段名1,字段名2, .... )
事务:
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全部执行成功,要么全部实行失败。
例如:张三--李四转账
数据库开启事务的命令:
Connection接口下面的方法:
void setAutoCommit(boolean autoCommit);autoCommit - 为 true 表示启用自动提交模式;为 false 表示禁用自动提交模式(默认情况下就是true)
void commit();手动提交事物。
void rollback();回滚(出现异常的时候,所有已经执行成功的代码需要回退到事务开始前的状态)
默认情况下,Connetion对象处于自动提交模式下,这意味着他在执行每个语句后都会自动提交更改。
如果禁用自动提交模式,那么提交更改就必须显示调用commit方法,否则就无法保存数据库的更改。
结束事务:COMMIT 或 ROLLBACK
COMMIT 表示提交,即事务中的多条 SQL 语句所更改的数据会持久化到数据库中。或者 ROLLBACK 表示回滚,即回滚到事务的起点,将之前所做的所有操作撤销。
ROLLBACK 可以结束事务,但不代表会将数据持久化到数据库中,而只有 COMMIT提交才可以将数据持久化到数据库中。
为什么JDBC事务里面要使用 rollback() ?segmentfault.com
书写结构:
private Connection conn = null;
private PreparedStatement ps = null;
try {
conn.setAutoCommit(false); //将自动提交设置为false
ps.executeUpdate("修改SQL"); //执行修改操作
ps.executeQuery("查询SQL"); //执行查询操作
conn.commit(); //当两个操作成功后手动提交
} catch (Exception e) {
conn.rollback(); //一旦其中一个操作出错都将回滚,使两个操作都不成功
e.printStackTrace();
}
存储过程:
包含一系列sql语句的集合,完成一个复杂的功能,存储过程可以被反复使用,执行效率高。
存储过程功能上类似于Java里面封装的函数。
DELIMITER:定界符
MYSQL的默认结束符为";",其实就是告诉mysql解释器,该段命令是否已经结束了,mysql可以执行了。
在命令行客户端中,如果有一行命令以分号结束,如输入下面的语句:
mysql> select * from test_table;
回车后,mysql将会执行该命令。
但有时候,不希望MySQL这么做,可能输入较多的sql语句,且语句中包含有分号,那么我们就可以重新定义定界符。
-- 存储过程 类似于java中函数
delimiter $$ -- 将原来";"这个定界符替换为"$$"
CREATE PROCEDURE show_student()
BEGIN
UPDATE goods SET goods_number=goods_number+1;
SELECT * FROM goods;
END $$
delimiter ; -- 存储过程定义完了之后恢复原来的定界符";"
CALL show_student; -- 调用存储过程
触发器(Trigger):
是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件触发。
触发器经常用于加强数据的完整性约束和业务规则等。
在MySQL中,触发器可以在你执行INSERT、UPDATE或DELETE的时候,执行一些特定的操作。在创建触发器时,可以指定是在执行SQL语句之前或是之后执行这些操作。通过触发器,你可以实现一些业务逻辑或一些数据限制,在简化应用程序逻辑,优化系统性能时非常有用。
实现一个触发器:在student表里面插入一条记录的时候在student_total表里面的total字段加1
文末 over~