视图
概述
视图(view)是数据库中的一个对象,它是数据库管理系统提供给用户的以多种角度观察数据库中数据的一种重要机制。它对应三种模式中的外模式。
在SQL中,视图是基于SQL语句的结果集的可视化的表。
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。但视图与基本表不同,试图是一个虚表。数据库中只存储视图的定义,而不存储视图所包含的数据,这些数据仍存放在原来的基本表中。这种模式有两个好处:
视图数据始终与基本表数据保持一致,当基本表发生变化时,从视图中查询出的数据也会随之变化。
节省存储空间。当数据量非常大时,重复存储数据非常耗费空间。
视图可以从一个基本表中提取数据,也可以从多个基本表中提取数据,甚至还可以从其他视图中提取数据,合理利用可以带来很多好处:
1、简化数据查询。
2、使用户能够从多角度看待同一数据。
3、提高数据的安全性。
4、提供了一定程度的逻辑独立性。
定义:
CREATE VIEW [视图名] [(列名)[...n]]
AS
SELECT 语句
在定义视图时需要注意:
1、SELECT 语句中通常不包含ORDER BY 和DISTINCT 子句
2、在定义视图时要么指定视图的全部列名,要么全部省略,不能只写部分列名。
/*
创建一个植物和僵尸的介绍图,视图中包含
植物名称,植物HP,僵尸名称,僵尸HP
*/
CREATE VIEW PVZSimple
AS
SELECT P.name,P.HP,Z.name,Z.HP
FROM table_Plant P,table_Zomble Z
WHERE P.id=Z.id
-- 使用视图,跟基本表类似
-- 查询 PVZSimple 的所有数据
SELECT * FROM PVZSimple
视图的修改与删除
修改视图
修改视图定义的SQL语句为ALTER VIEW,其语法如下:
ALTER VIEW [视图名] [列名[...n]]
AS
SELECT语句
样例
/*
修改上例创建的视图,使其包含植物的ATK
*/
CREATE VIEW PVZSimple
AS
SELECT P.name,P.HP,P.ATK,Z.name,Z.HP
FROM table_Plant P,table_Zomble Z
WHERE P.id=Z.id
我个人理解就是重写。
删除视图
基本语法
DROP VIEW [视图名]
样例
-- 删除视图 PVZSimple
DROP VIEW PVZSimple
存储过程
存储过程的概念
存储过程 (Stored Procedure) 是在大型数据库系统中 , 一组为了完成特定功能的 SQL 语句集 , 存储在数据库中 , 经过第一次编译后再次调用不需要再次编译 , 用户通过指定存储过程的名字并给出参数 (如果该存储过程带有参数) 来执行它 , 存储过程是数据库中的一个重要对象 ; 存储过程中可以包含 逻辑控制语句 和 数据操纵语句 , 它可以接受参数 , 输出参数 , 返回单个或多个结果集以及返回值 ;
存储过程的优缺点
优点 :
1、由于应用程序随着时间推移会不断更改 , 增删功能 , SQL 语句会变得更复杂 , 存储过程为封装此类代码提供了一个替换位置 ;
2、由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中 , 所以存储过程运行要比单个的 SQL 语句块要快 ;
3、由于在调用时只需用提供存储过程名和必要的参数信息 , 所以在一定程度上也可以减少网络流量 , 简单网络负担 ;
4、可维护性高 , 更新存储过程通常比更改 , 测试以及重新部署程序集需要较少的时间和精力 ;
5、代码精简一致 , 一个存储过程可以用于应用程序代码的不同位置 ;
6、增强安全性 :
通过向用户授予对存储过程 (而不是基于表) 的访问权限 , 它们可以提供对特定数据的访问 ;
提高代码安全 , 防止 SQL注入 (但未彻底解决 , 例如将数据操作语言 DML 附加到输入参数) ;
SQLParameter 类指定存储过程参数的数据类型 , 作为深层次防御性策略的一部分 , 可以验证用户提供的值类型 (但也不是万无一失 , 还是应该传递至数据库前得到附加验证) ;
缺点 :
1、如果更改范围大到需要对输入存储过程的参数进行更改 , 或者要更改由其返回的数据 , 则仍需要更新程序集中的代码以添加参数 , 等等 ;
2、可移植性差 , 由于存储过程将应用程序绑定到 Server , 因此使用存储过程封装业务逻辑将限制应用程序的可移植性 ; 如果应用程序的可移植性在您的环境中非常重要 , 则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择 ;
编写简单存储过程
创建一个存储过程
CREATE PROCEDURE GetPlant()
BEGIN
SELECT * FROM table_Plant;
END;
调用存储过程
CALL GetPlant();
删除存储过程
DROP PROCEDURE IF EXISTS GetPlant;
带参数的存储过程
MySql 支持 IN (传递给存储过程) , OUT (从存储过程传出) 和 INOUT (对存储过程传入和传出) 类型的参数 , 存储过程的代码位于 BEGIN 和 END 语句内 , 它们是一系列 SQL 语句 , 用来检索值 , 然后保存到相应的变量 (通过指定INTO关键字) ;
下面的存储过程接受三个参数 , 分别用于获取用户表的最小 , 平均 , 最大分数 , 每个参数必须具有指定的类型 , 这里使用int , 关键字 OUT 指出相应的参数用来从存储过程传出
CREATE PROCEDURE GetZombleATK(
out minATK int
out maxATK int,
out avgAtK int
)
BEGIN
select min(ATK) into minATK FROM table_Zomble;
select max(ATK) into maxATK FROM table_Zomble;
select avg(ATK) into avgATK FROM table_Zomble;
END;
调用此存储过程 , 必须指定3个变量名(所有 MySql 变量都必须以 @
开始) , 如下所示 :
CALL GetZombleATK(@minATK,@maxATK,@avgATK);
该调用并没有任何输出 , 只是把调用的结果赋给了调用时传入的变量 @minATK, @maxATK, @avgATK
, 然后即可调用显示该变量的值 :
SELECT @minATK,@maxATK,@avgATK;
使用 IN 参数,输入一个僵尸 id,返回该僵尸的名字
CREATE PROCEDURE GetZombleNameByID(
in ZombleID int,
out ZombleName varchar(50)
)
BEGIN
SELECT name FROM table_Zomble
WHERE ZombleID=id
into ZombleName;
END;
调用存储过程
CALL GetZombleNameByID(1,@ZombleName);
SELECT @ZombleName;
DELIMITER
MySql 的命令行客户机的语句分隔符默认为分号 ;
,而实用程序也是用 ;
作为分隔符,这会使得存储过程的 SQL 出现语法错误,使用 DELIMITER $$
告诉命令行实用程序将 $$
作为新的语句结束分隔符,最后再使用 DELIMITER ;
MySQL事务
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
- 事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。
事务控制语句:
- BEGIN 或 START TRANSACTION 显式地开启一个事务;
- COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
- ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
- SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
- RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
- ROLLBACK TO identifier 把事务回滚到标记点;
- SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交