视图 =>查询返回结果集=>虚拟表=>字段、条件...
触发器=>满足条件增删改
函数=>实现某些功能,返回一个结果
存储过程 =>类似视图和函数的结合
视图:是一条SELECT语句执行后返回的结果集
作用:
实现细粒度授权:通过视图限定用户查看指定的数据(列、行)
简化复杂的查询操作:将复杂的查询封装在视图中
数据授权最小级别:SELECT
最小粒度:表级别、视图、存储过程...
DROP TABLE IF EXISTS course;
CREATE TABLE course (
sid int(11) NOT NULL AUTO_INCREMENT,
sname varchar(32) NOT NULL,
PRIMARY KEY (sid)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
INSERT INTO `course` VALUES ('1', '语文');
INSERT INTO `course` VALUES ('2', '数学');
INSERT INTO `course` VALUES ('3', '英语');
INSERT INTO `course` VALUES ('4', '物理');
INSERT INTO `course` VALUES ('5', '');
创建视图
CREATE VIEW view_name AS (
SQL语句
);
show create view view_name\G;


使用视图
SELECT * FROM c_xf;

视图就是一张虚拟表,可以像普通表一样使用
查看数据库中有哪些视图
show table status where comment='view'\G;

查看视图创建语句
show create view 视图名;
删除视图
drop view c_xf;

修改视图
alter view c_xf as (SQL语句)

===================================
触发器:表相关的数据库对象,在满足指定条件 时,触发执行定义的SQL语句集合
!!慎用 隐性的!!
触发条件:event:INSERT ,UPDATE,DELETE(没有select)
time:BEFORE,AFTER
触发频率:针对每一行数据
触发器定义在表上

1、单个sql语句
create trigger 触发器名 时机 事件 on 表名 for each row 执行语句;
例:创建一个名为trig1的触发器,如果在course表插入一条数据后,自动往time表中插入一条数据(时间为now())
time:id,datetime



2、多个sql语句
delimiter //
create trigger 触发器名 时机 事件 on 表名 for each row
begin
SQL语句;
SQL语句;
end //
delimiter ;

SHOW TRIGGERS \G //列出当前库所有触发器的基本信息

SHOW CREATE TRIGGER trig2 \G //查看某一个触发器的完整创建语句
删除触发器
drop trigger 触发器名 ;
函数(实现指定功能)
接收一些参数,并返回一个值的SQL代码
作用:提供代码的复用性和可读性,使用方便
CONCAT=>字符串拼接
delimiter \\
create function 函数名(参数 类型) returns 返回值类型
[deterministric|no sql|reads sql data]
begin
函数体;
return 值;
end \\
delimiter ;
- 必须写 RETURNS 指定返回类型
- 体内必须有 RETURN 返回数据
- 多条语句用
BEGIN END - 改分隔符避免分号截断
如果你的 MySQL 开启了二进制日志 (binlog), 必须明确函数是否为确定型,所以强制要求声明 DETERMINISTIC/NO SQL/READS SQL DATA中的一个, 否则会阻止创建函数
DETERMINISTIC:确定的,相同输入一定相同输出
NO SQL:没有SQL语句,只是计算
READS SQL DATA:只查询数据,不修改数据
DECLARE是声明局部变量 ,必须写在BEGIN开头,定义变量的名称和类型
SET是给已声明的变量赋值,把计算结果 / 值存到变量中
delimiter //
create function new_price(price double(10,2),rate double(5,2))
returns double(10,2)
deterministic
begin
declare t_price double(10,2);
set t_price=price*(1-rate);
return t_price;
end //
delimiter;
该函数只依赖输入的price和rate两个参数,没有任何外部依赖 ,所以是 DETERMINISTIC
创建函数

调用函数
select new_price(price,0.15);


展示函数
SHOW CREATE FUNCTION 函数名\G

删除函数
drop function [if exists] 函数名;
注 :没有修改函数的方法, 主流方式是 "先删后建"
存储过程 (MySQL支持弱,用得也不多)
存储过程类似视图和函数的结合
存储过程完成特定SQL语句功能 ,并编译保存在数据库中
用户需要的时候,通过CALL调用
- 复杂的SQL操作封装到存储过程中,简化对SQL的调用
- 能提升速度,会多占用一些磁盘空间
- 定制化查询(权限)
语法
delimiter //
create procedure 过程名(
[IN 入参 数据类型],
[OUT 出参 数据类型],
[INOUT 出入参 数据类型]
)
BEGIN
-- 业务SQL语句
执行语句;
END //
delimiter ;
call procedure_name();
IN(输入参数)、OUT(输出参数)、INOUT(输入输出参数
创建存储过程,查询产品表中的所有信息


创建存储过程,查询产品表中指定的cid的信息

创建存储过程,返回产品表的最高价

SELECT MAX(price) INTO max_price FROM product; // 将查询结果直接赋值给变量
SELECT ... INTO 要求查询结果只能是 1 行 1 列(单值),否则会报错
错误:参数与期望的数量不一样

定义参数:set @max_prrice=0;

|------------|----------------|---------|-------------|
| 变量类型 | 格式 | 作用域 | 生命周期 |
| 用户变量 | @变量名 | 当前会话 | 会话断开即销毁 |
| 全局系统变量 | @@global.变量名 | 所有会话 | mysql运行期间 |
| 会话系统变量 | @@session.变量名 | 当前会话 | 会话断开即销毁 |
| 局部变量 | declare 变量名 类型 | 存过程/函数内 | 过程/函数执行完即销毁 |
查看存储过程
SHOW PROCEDURE STATUS \G
查看存储过程的创建语句
SHOW CREATE PROCEDURE get_products_max\G

删除存储过程
DROP PROCEDURE [IF EXISTS] get_products_max;

修改 => 先删除后修改