【数据库学习笔记】MySQL_03_存储过程,触发器,权限,视图,函数
2017-10-01 19:07
1476 查看
MySQL_03
A.存储过程
1.概述
存储过程,带有逻辑的sql语句(while if)
2.特点
a.执行效率非常快,存储过程是在数据库的服务器端执行的
b.移植性很差,不同数据库的存储过程是不能移植的
3.语法
4.带有输入参数的存储过程
查询一个员工id,查询员工信息
5.带有输出参数的存储过程
6.删除存储过程
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.查看会话变量
9.带有输入输出参数的存储过程
输出
10.带有条件判断的存储过程
输入一个整数,如果1,返回星期一,如果2,返回星期二.......
11.带有循环功能的存储过程
需求,求1-100的和
12.使用查询的结果赋值给变量(into)
B.触发器
1.概述
当操作了某张表时,希望同时触发一些动作/行为,可以使用触发器完成
2.语法
create trigger 触发器名 after 增/改/删 on 表名 for each row
insert into 表名(字段名) values(‘增加了一条记录’);
3.需求
当向员工表插入一条记录时,希望mysql自动往日指表插入数据
修改,删除触发器自己尝试
C.权限
1.mysql权限问题
a.root:拥有所有权限(可以干任何事情)
b.权限账户:只拥有部分权限(CURD),例如只能此操作某个数据库的某张表
c.如何修改mysql的用户密码
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.创建视图语法
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中字符串的操作是以单个字符为单位的
2.自定义函数
函数名 函数参数 返回值 函数体(作用域)
语法:
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;
相关文章推荐
- [MySQL] 存储过程、函数、触发器和视图的权限检查
- Java学习笔记之数据库(触发器、事物、索引、投影和除、视图、存储过程和函数 )含各种链)___ 一直补充
- 14.数据库oracle必学,其他最好了解一种以上(mysql,sql server,access==) oracle:视图,索引,存储过程,触发器,游标,包,常用函数
- java 从零开始,学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- MySQL 之 视图、触发器、存储过程、函数、事物与数据库锁
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Oracle_函数_触发器_游标_存储过程_视图>(三十五)
- [MySQL] 存储过程、函数、触发器和视图的权限检查
- 【数据库学习笔记】Oracle_04_存储过程,函数,触发器,索引,同义词
- java 从零开始,学习笔记之基础入门<Oracle_函数_触发器_游标_存储过程_视图>(三十五)
- Mysql 存储过程、函数、触发器和视图的权限检查
- Mysql 数据库学习笔记03 存储过程
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<SQL_Server_视图_函数_存储过程_触发器等>(二十三)
- mysql导出存储过程、函数、视图、触发器
- mysql导出存储过程、函数、视图、触发器
- 查询SQLServer2005中某个数据库中的表结构、索引、视图、存储过程、触发器以及自定义函数
- MySQL学习笔记 第九讲:视图、事务、触发器
- C# 得到sqlserver 数据库存储过程,触发器,视图,函数 的定义
- Oracle 中的PL/SQL基础、存储过程、触发器、函数、包(学习笔记)
- MySQL学习笔记 4 -触发器、MySQL视图
- mysql 触发器 存储过程 函数 视图