MySQL 视图函数存储过程触发器杂项

现有表 stuInfo

CREATE TABLE IF NOT EXISTS  stuInfo(
	id INT PRIMARY KEY AUTO_INCREMENT,
	stuName VARCHAR(10) NOT NULL,
	age INT DEFAULT 18
);

插入数据

INSERT INTO stuInfo VALUES(0,'z3', 18);
INSERT INTO stuInfo VALUES(0,'l4', 19);
INSERT INTO stuInfo VALUES(0,'w5', 20);
INSERT INTO stuInfo VALUES(0,'f6', 21);

1、 视图 多个地方使用了同样的查询结果 或 该查询使用的sql语句较为复杂时 使用视图

MySQL中的视图 view 是一张虚拟表,可以当做普通表一样使用,是通过表动态生成的数据。视图只保存了sql 逻辑,不保存查询结果。也就是说当原表中数据改变,视图中数据也会改变。视图 是 MySQL5.1之后的新特性。

创建视图 CREATE VIEW 视图名 AS 查询语句;
CREATE VIEW view1 AS SELECT * FROM stuInfo;

删除视图 DROP VIEW 视图名1,视图名2;
DROP VIEW view1;

修改视图 两种方式

CREATE OR REPLACE VIEW 视图名 AS 查询语句;
ALTER VIEW 视图名 AS 查询语句;

CREATE OR REPLACE VIEW view2 AS SELECT stuName,age FROM stuInfo;
ALTER VIEW view2 AS SELECT * FROM stuInfo;

查看视图
查看视图结构 DESC 视图名;
DESC view2
查看视图创建语句 SHOW CREATE VIEW 视图名;
SHOW CREATE VIEW view2;

视图使用和普通表基本一致
使用视图查看数据 SELECT * FROM view2;
视图查询结果
注: 视图也可以进行增删改操作。对原数据有影响。但是不推荐使用,一般不用。

函数存储过程使用前准备 变量

  • 系统变量
    • 全局变量 服务器每次启动为所有全局变量赋初始值 针对所有连接有效,不能跨服务重启
    • 会话变量 仅针对当前连接有效
  • 自定义变量
    • 用户变量 针对当前会话(连接)有效, 可以使用在任何地方
    • 局部变量 只能使用在 begin end 中 begin end 中有效

系统变量查看:global 表示全局变量 session表示会话变量 默认session
查看全部 show global/session variables;
查看部分 show global/session variables like '%...%';
查看指定值 select @@global/session.变量名;

系统变量赋值:global 表示全局变量 session表示会话变量 默认session
方式1 set global/session 系统变量名=值;
方式2 set @@global/session.系统变量名=值

自定义变量 顾名思义用户个人定义的变量 需声明才能使用

  • 用户变量

    声明并初始化:尽量声明时就初始化。

    set @用户变量名=值;
    set @用户变量名:=值;
    select @用户变量名:=值;
    

    重新赋值

    set @用户变量名=值;
    select 字段 into @变量名 from 表;	# 使用该方法赋值 返回值必须是一行
    

    查看

    select @用户变量名
    

局部变量 局部有效 只能用在begin end中

  • 声明
    • 声明未初始化 declare 变量名 类型;
    • 声明并初始化 declare 变量名 类型default 值;
  • 赋值
    • set 变量名=值; # 变量名前可不加 @
    • select 字段 into @变量名 from 表; # @ 不可省
  • 查看 select 变量名

存储过程

一组预先编译好的sql语句的集合,可理解为批处理语句,减少编译次数并减少了和数据库服务器的连接次数,频率。

DELIMITER $ # 修改结束语句标志为 $ 而不是 ;因为存储过程中每一行语句结束都要使用 ; 为提高阅读性,可修改结束语句。 不一定要是 $

创建语句

DELIMITER $
create procedure 存储过程名(参数列表)
begin
	存储过程体(一组合法的sql语句)
end $

参数列表包含三部分 参数模式(in/out/inout) 参数名 参数类型
in 作为输入 调用时需传入值, out 作为输出 可当做返回值 inout 可作为输入输出

调用语法 call 存储过程名(实参列表)

无参存储过程示例

DELIMITER $
CREATE PROCEDURE myproce1()
BEGIN
	INSERT INTO stuInfo VALUES (0,'张无忌', 22);
	INSERT INTO stuInfo VALUES (0,'杨过', 23);
END $

 CALL myproce1();

带 IN 参数存储过程 示例

DELIMITER $
CREATE PROCEDURE myproce2(IN stuName VARCHAR(10), IN age INT)
BEGIN
	INSERT INTO stuInfo VALUES (0,stuName, age);
END $

CALL myproce2("郭靖", 30);

带 OUT 参数存储过程 示例

DELIMITER $
CREATE PROCEDURE myproce3(IN id INT, OUT stuName VARCHAR(10), OUT age INT)
BEGIN
	SELECT s.stuName,s.age INTO stuName, age
	FROM stuInfo AS s
	WHERE s.id = id;
END $


CALL myproce3(5, @stuName, @age)$
SELECT @stuName,@age$

带 inout 参数的存储过程示例 ab 翻倍

DELIMITER $
CREATE PROCEDURE myproce4(INOUT a INT, INOUT b INT)
BEGIN
	SET a = a*2;
	SET b = b*2;
END $

SET @a=10$
SET @b=20$
CALL myproce4(@a, @b)$
SELECT @a,@b$

查看 SHOW CREATE PROCEDURE 存储过程名;

删除 DROP PROCEDURE IF EXISTS 存储过程名;

一番操作后 数据
哈哈哈哈

函数

创建函数语句

CREATE FUNCTION 函数名(参数列表) RETURNS  返回值类型
BEGIN
	函数体
END

参数列表 包含 参数名 参数类型 如 name varchar(10)
函数体一定要包含return 语句 没有会报错 建议return语句一定放在最后
调用语法 SELECT 函数名(实参列表)

实例:
无参函数示例

DELIMITER $
CREATE FUNCTION myfunc1() RETURNS  INT
BEGIN
	DECLARE c INT DEFAULT 0;
	SELECT COUNT(*) INTO c FROM stuInfo;
	RETURN c;
END $

SET @count=0$
SELECT myfunc1() INTO @count$
SELECT @count$

带参数的函数实例

DELIMITER $
CREATE FUNCTION myfunc2(id INT) RETURNS  VARCHAR(10)
BEGIN
	DECLARE stuName VARCHAR(10);
	SELECT s.stuName INTO stuName FROM stuInfo s WHERE s.id=id;
	RETURN stuName;
END $

SET @stuName=" "$
SELECT myfunc2(6) INTO @stuName$
SELECT @stuName$

查看 SHOW CREATE FUNCTION 函数名;
删除 DROP FUNCTION IF EXISTS 函数名;

存储过程适合批量插入,批量更新 而函数适合处理数据后返回一个结果。函数有且仅有一个返回值

触发器 trigger

它就是事先为某张表绑定好一段代码,当表中的某些内容发生改变的时候(增删改)系统会自动触发代码执行,无需自已执行。

触发器要素:事件类型,触发时间,触发对象
事件类型:增删改 三种类型 insert delete update
触发时间:之前:before 之后:alter
触发对象:表中的每一条记录(行)
一张表中只能拥有一种触发时间的一种类型的触发器:一张表最多能有6个触发器

MYSQL中触发器中不能对本表进行 insert ,update ,delete 操作,以免递归循环触发。

触发器 创建语法

CREATE TRIGGER 触发器名称 触发时机 触发类型 ON 表 FOR EACH ROW(关键字固定写法,每一行记录都能触发)
BEGIN
	/*触发器开始:old 代表旧记录,new 代表新的记录*/
	触发器执行语句
END

不管触发器是否触发,只要当某种操作准备执行,系统就会将当前要操作的记录的当前状态和即将执行之后的新的状态分别给保留下来供触发器使用,
其中要操作的当前状态保存到old中,要操作之后的可能状态保存给new
是触发器所在的表新旧状态。
old 代表的是旧记录
new 代表的是新记录

任何一条记录除了有数据,还有字段名
使用语法:old.字段名 / new.字段名

示例 只是为了演示。。现实中不可能这样建表的。当新增一个学生stuNum就+1当前学生数量
创建表 class

CREATE TABLE IF NOT EXISTS class(
	id INT PRIMARY KEY AUTO_INCREMENT,
	stuNum INT DEFAULT 0
);

INSERT INTO class VALUES(0,0);

ALTER TABLE stuInfo MODIFY COLUMN classId INT DEFAULT 1;	# 学生信息表新加classId字段
ALTER TABLE stuInfo ADD FOREIGN KEY(classId) REFERENCES class(id);	# 添加外键约束
truncate table stuInfo;	# 删除stuInfo表中数据

创建触发器

DELIMITER $
CREATE TRIGGER before_age AFTER INSERT ON stuInfo FOR EACH ROW
BEGIN
	UPDATE class SET stuNum=stuNum+1 WHERE id=new.classId;
END $

stuInfo 中数据
数据为空
class中数据
class中数据
向stuInfo中插入数据

INSERT INTO stuInfo VALUES (0,'张无忌', 22,1);
INSERT INTO stuInfo VALUES (0,'杨过', 23,1);

stuInfo 中数据
两条
class 中
真的有数据了

条件选择与循环调用

if函数 if(式1, 式2, 式3) 式1成立则返回式2的值 不成立则返回式3

case 结构1 类似于switch

case 变量|表达式|字段
when 判断值1 then 返回值1
when 判断值2 then 返回值2
......
else 返回值n
end

case结构2 类似于 if else if else

case 
when 条件1 then 返回值1
when 条件2 then 返回值2
......
else 返回值n
end

case 可以作为select中表达式使用。也可以单独使用,放在begin end 中。

if结构 多重分支 只能放在begin end 中

if 条件1 then 语句1;
elseif 条件2 then 语句2;
【else 语句n;】
end if

循环 分 while lopp repeat 三种
循环控制 跳转语句 iterate 类似于continue ,leave 类似于 break。

while语句

   【标签:】while 循环条件 do
			循环体  # 可使用循环控制语句跳转到标签处
	end while【标签】;

loop 语句 可以用来模拟简单死循环,循环体中没有判断跳出语句就会一直执行
【标签:】loop
循环体 # 可使用循环控制语句跳转到标签处
end loop【标签】;

repeat 语句

【标签:】repeat 
	循环体  # 可使用循环控制语句跳转到标签处
 until 结束循环条件
 end repeat【标签】;

三中循环都只能用在 begin end 中

发布了59 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/dandanfengyun/article/details/97545402
今日推荐