create view 视图名[(视图字段列表)]
as
select 语句
[with [local | cascaded] check option]
建视图名中统一添加前缀view_或后缀_view
视图的作用
1:是操作变得简单
2:避免冗余数据
3:增强安全性
同一个数据可以创建不同的视图,为不同的用户分配不同的视图,这样可以实现不同的用户只能查询和修改对应的数据,从而增强数据的安全性。
4:提高数据的逻辑独立性
有了视图,应用程序可以建立在视图之上,从而使应用程序和数据表结构在一定程度上逻辑分离。
a: 视图可以向应用程序屏蔽表结构,如果表结构发生变化,只需修改视图,无需修改应用程序
b:使用视图可以向数据库屏蔽应用程序。如果应用程序发现变化,只需重新定义或修改视图,无需修改数据库表结构。
drop view视图名
create trigger 触发器名 触发时间 触发事件 on 表名 for each row
begin
触发程序
end;
查看触发器定义
show triggers;
删除触发器 drop trigger 触发器名;
触发器注意事项:
1:如果触发程序包含select语句,select不能返回结果集
2:同一个表不能创建两个相同的触发器
3:触发程序中不能显示或隐式的打开,开始或结束事务。
4:触发器针对记录操作,当批量操作时,性能降低。
5:MyISAM引擎中,触发器不能保证原子性。
8:MySQL触发程序不能对本表执行update操作,可以用set命令代替,否则会出错。
9:before触发程序中,auto_increment字段的new值为0,不是实际插入记录时自动生成的自增类型字段。
临时表分为内存临时表(in-memory)以及外存临时表(on-disk)
手工创建临时表,就是正常create table语句加上temporary
如:
create temporary table temp(name char(100));
insert into temp values('test');
select * from temp;
查看临时表 show create table临时表名;
删除 drop temporary table临时表名;
注意事项:
临时表是数据库对象,因此创建临时表需要指定该临时表属于哪个数据库。
临时表如果与基表重名,那么基表将被隐藏,除非临时表删除,基表才能被访问。
MyISAM,Merge ,InnoDB引擎都支持临时表
临时表引擎由default_tmp_storage_engine决定
show table 命令不会显示临时表
rename不能重命名临时表,但可以使用alter table 来重命名
通过视图虽然可以更新基表数据,但不建议这么做,因为通过视图更新基表数据,并不会触发触发器运行。
存储过程
create procedure 存储过程名(参数1,参数2,……)
[存储过程选项]
begin
存储过程语句块;
end;
存储过程参数有in , out , inout
存储过程必须通过call来调用
查看存储过程 show procedure status;
show procedure status like模式 过滤查找
select name from mysql.proc where db='choose' and type ='procedure';
通过命令 show create procedure存储过程名; 可以查看指定数据库指定存储过程的详细信息,存储过程信息保存在information_schema数据库中routines表
Select * from information_schema.routines where routine_name = '存储过程名';
drop procedure存储过程名; 来删除存储过程
存储过程与函数的区别:
1:函数有且仅有一个返回值,且必须指定返回值类型。存储过程可以没有返回值,也可以有,甚至多个,返回值需要使用out或者inout参数定义。
2:函数可以使用select……into语句为变量赋值,但不能使用select返回结果集。存储过程则都可以。
3:函数可以直接嵌入到sql语句或表达式中,可以扩展标准的sql语句,存储过程则需要单独调用,并使用call关键字。
4:函数中的函数体限制比较多,比如不能显示或隐式的打开,开始或结束事务。存储过程则限制较少,可以使用事务,可以使用预处理SQL语句。
5:应用程序调用函数时,通常将函数封装成sql字符串进行调用,而调用存储过程必须使用call关键字。存储过程返回值通过out或inout参数传递给mysql会话变量。
自定义错误处理程序:
declare 错误处理类型 handler for 错误触发条件 自定义错误处理程序;
自定义错误触发条件
declare 错误触发条件 condition for MySQL错误代码或者ANSI标准错误代码
如:
declare continue handler for 1452
begin
set @error1='外键约束错误!';
end;
可以修改为:
declare foreign_key_error condition for sqlstate '23000';
declare continue handler for foreign_key_error
begin
set @error1='外键约束错误!';
end;
说明:
MySQL预定义了sqlexception,sqlwarning,not found等错误触发条件,这些错误触发条件无需数据库开发人员定义,可以直接使用。
declare游标 --声明游标
opne游标-- 打开游标
fetch游标 --提取数据
处理结果集中的数据
close游标--关闭游标
declare游标名 cursor for select语句
声明游标后,游标中select语句并没有执行,没有select语句集。
open 游标名
打开游标名,select语句被执行,MySQL服务器内存有select语句结果集。
从游标中取数据
fetch 游标名 into 变量名1,变量名2,……
说明:变量名个数必须与声明游标时使用的select语句结果集中字段个数保存一致。
fetch语句需要循环语句配合,才能实现整个结果集的遍历。
当fetch语句取出最后一个记录,再次执行fetch语句将产生“ERROR 1329(02000):No data to FETCH”错误信息,数据库开发时可以针对1329自定义错误处理程序,以便结束结果集遍历。
关闭游标:
close 游标名
预处理SQL
1:创建预处理SQL
prepare 预处理SQL语句名 from SQL字符串
如:
prepare select_class_pre from 'select * from classes';
预处理语句是数据库对象,因此创建预处理语句SQL时,需要指定属于哪个数据库。
执行预处理语句:
execute预处名[using 填充数据[,填充数据……]]
using 将填充数据到SQL语句中对应位置的“?”问号。
如: execute select_class_pre;
释放预处理语句
deallocate prepare预处理名;
MySQL的存储程序分为4类:函数,触发器,存储过程以及事件。