您的位置:首页 > 数据库 > MySQL

【数据库学习笔记】MySQL_03_存储过程,触发器,权限,视图,函数

2017-10-01 19:07 1476 查看
MySQL_03

A.存储过程

1.概述

存储过程,带有逻辑的sql语句(while if)

2.特点

a.执行效率非常快,存储过程是在数据库的服务器端执行的

b.移植性很差,不同数据库的存储过程是不能移植的

3.语法

-- 创建存储过程
DELIMITER $	-- 声明存储过程的结束符
CREATE PROCEDURE pro_test()	-- 存储过程名称(参数列表)
BEGIN 	-- 开始
-- 可以写多个sql语句	-- sql语句+流程控制
SELECT * FROM 表名
END $	-- 结束符

-- 执行存储过程
CALL pro_test();	-- call 存储过程名称(参数);

-- 参数
IN 	-- 表示输入参数,可以携带数据到存储过程
OUT 	-- 表示输出参数,可以从存储过程中返回结果
INOUT	-- 表示输入输出参数,既可以输入功能,也可以输出功能


4.带有输入参数的存储过程

查询一个员工id,查询员工信息

-- 创建存储过程
DELIMITER $
CREATE PROCEDURE pro_findById(IN e_id INT)
BEGIN
SELECT * FROM employee WHERE id = e_id;
END $

-- 调用
CALL pro_findById(4);


5.带有输出参数的存储过程

-- 带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20))
BEGIN
-- 给参数赋值
SET str = 'hello world';
END $
怎么获取输出的参数,稍等。。。。

6.删除存储过程

DROP PROCEDURE pro_testOut;


7.调用

如何接受返回参数的值

a.全局变量(内置变量):mysql数据库内置的变量(所有连接都起作用)

1)查看所有全局变量:show variables



2)查看某个全局变量:select @@变量名

3)修改全局变量:set 变量名=新值

4)character_set_client:mysql服务器的接收数据的编码

5)character_set_results:mysql服务器输出数据的编码

6)set character_set_client=gbk:设置数据库编码

7)select @@character_set_client:查看数据库编码



b.会话变量:只存在于当前客户端与数据库服务器端的一次连接当中

如果连接断开,那么数据全部丢失

c.局部变量:在存储过程中使用的变量就叫局部变量,只要存储过程执行完毕,局部变量就丢失

8.接收返回值

a.定义一个回话变量

b.使用会话变量接收存储过程的返回值

c.查看会话变量

-- 带有输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testOut(OUT str VARCHAR(20))
BEGIN
-- 给参数赋值
SET str = 'hello world';
END $

-- 定义会话变量
SET @NAME='';
-- 接收返回值
CALL pro_testOut(@NAME);
-- 查看变量值
SELECT @NAME;



9.带有输入输出参数的存储过程

-- 带有输入输出参数的存储过程
DELIMITER $
CREATE PROCEDURE pro_testInOut(INOUT n INT)
BEGIN
-- 查看变量
SELECT n;

-- 设置变量
SET n = 500;
END $

-- 调用
SET @n = 10;

CALL pro_testInOut(@n);

SELECT @n;
输入



输出



10.带有条件判断的存储过程

输入一个整数,如果1,返回星期一,如果2,返回星期二.......

-- 创建存储过程
DELIMITER $
CREATE PROCEDURE pro_testIf(IN num INT, OUT WEEK VARCHAR(20))
BEGIN
IF num = 1 THEN
SET WEEK = '星期一';
ELSEIF num = 2 THEN
SET WEEK = '星期二';
ELSEIF num = 3 THEN
SET WEEK = '星期三';
ELSEIF num = 4 THEN
SET WEEK = '星期四';
ELSEIF num = 5 THEN
SET WEEK = '星期五';
ELSEIF num = 6 THEN
SET WEEK = '星期六';
ELSEIF num = 7 THEN
SET WEEK = '星期天';
ELSE
SET WEEK = '输入错误!';
END IF;		-- 结束语句
END $

CALL pro_testIf(4, @WEEK);
SELECT @WEEK;



11.带有循环功能的存储过程

需求,求1-100的和

-- 创建存储过程
DELIMITER $
CREATE PROCEDURE pro_testWhile(IN num INT, OUT result INT)
BEGIN
-- 定义一个局部变量
DECLARE i INT DEFAULT 1;	-- 定义i初始值为1
DECLARE vsum INT DEFAULT 0;	-- 定义vsum初始值为0
WHILE i <= num DO
SET vsum = vsum + i;
SET i = i + 1;
END WHILE;
SET result = vsum;
END $

CALL pro_testWhile(100, @result);

SELECT @result;



12.使用查询的结果赋值给变量(into)

-- 创建存储过程
-- 查询id为1的员工信息
DELIMITER $
CREATE PROCEDURE pro_findById(IN eid INT, OUT vname VARCHAR(20))
BEGIN
SELECT empName INTO vname FROM employee WHERE id = eid;
END $

CALL pro_findById(1, @NAME);

SELECT @NAME;


B.触发器

1.概述

当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成

2.语法

create trigger 触发器名 after 增/改/删 on 表名 for each row

insert into 表名(字段名) values(‘增加了一条记录’);

3.需求

当向员工表插入一条记录时,希望mysql自动往日指表插入数据

-- 先创建日志表
CREATE TABLE loger(
id INT PRIMARY KEY AUTO_INCREMENT,
message VARCHAR(50),
TIME TIMESTAMP 		-- 当值为空,显示当前时间
);

-- 创建触发器(添加)
CREATE TRIGGER tri_empAdd AFTER INSERT ON USER FOR EACH ROW 	-- 当往user表插入一条记录时
INSERT INTO loger(message) VALUES('员工表插入了一条记录');

-- 插入数据
INSERT INTO USER VALUES(105, '杨七');

-- 查询日志表
SELECT * FROM loger;



修改,删除触发器自己尝试

C.权限

1.mysql权限问题

a.root:拥有所有权限(可以干任何事情)

-- 使用数据库
USE mysql;

-- 查询用户密码 经过md5加密
SELECT PASSWORD('root');

-- 查询数据库用户
SELECT * FROM USER;


b.权限账户:只拥有部分权限(CURD),例如只能此操作某个数据库的某张表

c.如何修改mysql的用户密码

UPDATE USER SET PASSWORD=PASSWORD('root') WHERE USER='root';


d.password:md5加密函数

查询密码显示的是加密后的



2.忘记密码怎么办

a.打开MySQL目录下的my.ini文件,在文件的最后添加一行“skip-grant-tables”,保存并关闭文件

b.重启MySQL服务

c.在命令行中输入“mysql -uroot -p”(不输入密码),回车即可进入数据库

d.执行,“use mysql;”使用mysql数据库

e.执行,“update user set password=PASSWORD("rootadmin") where user='root';”(修改root的密码)

f.打开MySQL目录下的my.ini文件,删除最后一行的“skip-grant-tables”,保存并关闭文件

g.重启MySQL服务

h.在命令行中输入“mysql -uroot -prootadmin”,问题搞定

D.视图

1.概述

有结构,但没有结果的虚拟表

虚拟表的结构来源不是自定义,而是从对应的基表中产生

2.创建视图语法

-- create view 视图名称 as select语句(这个语句可以是一张或多张表的的普通查询,或多表查询)

-- 创建单表示图
CREATE VIEW my_v1 AS SELECT * FROM student;

-- 创建多表示图
CREATE VIEW my_v2 AS SELECT a.字段名,b.字段名 FROM a,b WHERE a.id = b.id;


3.查看视图

其实视图是一张虚拟表,关于查询表的语句,对视图都是可以用的

把table 改为 view

4.视图一旦创建,系统会在视图对应的数据库文件夹下,创建一个对应的结构文件:frm文件.

5.视图的使用

只是为了查询,你可以把视图当作表一样去使用

视图的执行:其实本质就是执行封装的select 语句

6.删除试图

drop view 视图名称

7.修改试图的意义

a.视图可以节省SQL语句,将一条复杂的查询语句,使用视图进行保存,以后可以直接对视图

b.数据安全,视图操作注意是针对查询语句的,如果对视图结构进行处理(比如删除),不会影响基表的数据.

所以相对来说数据比较安全

c.视图往往是在大项目中去使用,而且是多系统中去使用.我可以对外提供一些有用的数据,隐藏一些关键的数据.

d.视图对外可以提供友好的数据:不同的视图提供不同的数据,对外提供的数据好像是经过专门设计的一样.

e.视图可以更好的进行权限控制 比如对外隐藏我的一些基表的名称

8.视图数据的操作

视图是可以进行数据操作的(比如 增,删,改,视图中的数据),但是有很多限制

a.插入数据

1)多表视图不能插入数据

2)单表视图中可以插入数据(如果视图中字段没有基表中不能为空的字段且没有默认值的字段,是插入不成功的)

3)视图是可以向基表中插入数据的 (视图的操作是影响基表的)

b.删除数据

1)多表视图不能删除数据

2)单表视图可以删除数据,也会影响到基表

c.更新数据

单表视图,多表视图都可以更新数据

更新限制:with check option

E.函数

1.系统函数

直接调用即可.任何函数都有返回值,函数的调用是通过select调用.因为有返回值,所以只能用select 调用

Mysql中字符串的操作是以单个字符为单位的

SET @username='你好世界';-- 定义一个变量

-- 截取
SELECT SUBSTRING(@username,1,1);-- 从1位置截取一个字符

-- 长度
SELECT CHAR_LENGTH(@username); -- 字符长度4个
SELECT LENGTH(@username); -- 字节长度12个

-- instr 查找某个字符在一个字符串的位置 如果找到返回此字符的索引,如果没找到返回0
SELECT INSTR(@username,'好');

-- lpad (@username,10,'要填充的字符') 左填充:将字符串 按照指定长度填充到旧字符串的左边
SELECT LPAD(@username,10,'欢迎'); -- 注意10个长度算上原来'你好世界'的这4个长度,也就是说欢迎填充了6个
-- rpad 右填充

-- insert 替换字符串
SELECT INSERT(@username,2,2,'哈哈');-- 从第二个字符开始替换两个字符 替换成哈哈

-- strcmp(字符串1,字符串2) 比较两个字符串大小 按照字典顺序去比较
SELECT STRCMP('a','b');


2.自定义函数

函数名 函数参数 返回值 函数体(作用域)

语法:

CREATE FUNCTION 函数名(参数列表可有可无) RETURNS 数据类型  --规定要返回的数据类型
BEGIN
函数体
返回值:RETURN 返回类型(我们指定的类型);
end
例如

CREATE FUNCTION SHOW() RETURNS INT
RETURN 100;

-- 调用函数
SELECT SHOW();

-- 查看所有函数
SHOW functions STATUS;

-- 查看创建函数
SHOW CREATE FUNCTION test;

-- 删除函数
DROP FUNCTION test;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐