学习MySQL过程中的随笔二
MySQL深入学习:
视图
使用视图的目的:多次使用同一张临时表(或者已经存在的表)
视图只是一个虚拟表,其本质为【根据SQL语句获取动态的数据集,并为其命名】,用户只需使用别名即可获得实时的数据集,并可以将其作为表使用。
1、创建视图:create view 视图名称 as SQL语句; # 例:create view v1 as select * from userinfo;
2、修改视图:alter view 视图名称 as SQL语句; # 例:alter view v1 as select name from userinfo;
3、删除视图:drop view 视图名称; # 例:drop view v1;
4、注意事项:由于视图是虚拟表,故无法用其对真实表进行增、删、改,仅仅作为查询使用
触发器
对于某个表进行【增、删、改】操作的前后关联某些特定的行为时,可以使用触发器。
1、创建触发器:
通用格式为:
delimiter // # 修改操作的结束符为//
create trigger 触发器名称 【before / after】 【insert / delete / update】 on student for each row
begin
关联SQL语句......
end //
delimiter ; # 还原结束符为;
# 插入前关联语句:insert into teacher (name) values ("new.name"); # 关于插入时,可以在创建触发器时将关联语句里的参数置为new,得到的为即将插入的数据行。
# 删除前关联语句:delete from teacher where id > 10; # 关于删除时,可以在创建触发器时将关联语句里的参数置为old,得到的为即将删除的数据行。
# 更新前关联语句:update teacher set name = "wahaha" where id = 10;
事例代码:
-- 触发器
delimiter //
create trigger cfq before insert on userinfo for each row
begin
-- insert into t1 (name) values ('wahha') ;
insert into t1 (name) values (new.name) ;
-- insert into t2 (name,age,color) values (new.name,20,"yellow") ;
-- delete from t1 where id = 7;
update t1 set name =" 哇哈" where id = 6 ;
end //
delimiter ;
drop trigger cfq;
insert into userinfo (name,email) values ("娃哈哈1","10000000@qq.com"),("娃哈哈2","10000000@qq.com"),("娃哈哈3","10000000@qq.com") ;
-- select * from userinfo ;
-- delete from userinfo where id > 65 ;
-- update userinfo set name = 'ABC' where id = 12;
2、删除触发器:drop trigger cfq;
3、使用触发器:触发器无法被用户直接调用,而是基于对表的【增、删、改】的操作后引发的。
4、报错的情况:
MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法 : 解决办法也有两种, 第一种是在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个, 例如: CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`() DETERMINISTIC BEGIN #Routine body goes here... END;; 第二种是信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。 设置方法有三种: 1.在客户端上执行SET GLOBAL log_bin_trust_function_creators = 1; 2.MySQL启动时,加上--log-bin-trust-function-creators选贤,参数设置为1 3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1
函数
MySQL中提供的内置函数:<--官方链接-->
1、自定义函数:
delimiter \\
create function f1(
i1 int,
i2 int
)
returns int
begin
declare num int default 0; # 声明默认值为0的变量num
set num=i1+i2;
return (num);
end \\
delimiter ;
2、调用函数:select f1 (1,100) ;
3、删除函数:drop function f1 ;
存储过程
存储过程实际上是SQL语句集合,比函数更为高级,二者都可以传参数,但在函数当中不能执行SQL语句,而在存储过程中却可以,当调用存储过程时,其中内部的SQL语句会按照逻辑执行。
对于存储过程,其中的参数有三类:
- in 仅用于传入参数
- out 仅用于返回
- inout 既可以传入,又可以当作返回值使用
-- 无参数的存储过程
delimiter //
create procedure p1()
begin
select * from userinfo where id > 60;
end //
delimiter ;
call p1();
drop procedure p1;
无参数的存储过程
-- 带in参数的存储函数
delimiter //
create procedure p1(
in n1 int,
in n2 int
)
begin
select * from userinfo where id > n1;
end //
delimiter ;
call p1(60,12);
drop procedure p1; -- 带out参数的存储函数
delimiter //
create procedure p1(
in n1 int,
out n2 int,
out n3 int
)
begin
set n2=123123;
set n3=456456;
select * from userinfo where id > n1;
end //
delimiter ;
set @v2=100;
set @v3=200;
call p1(60,@v2,@v3);
select @v2,@v3;
drop procedure p1;
有参数的存储过程
-- 事务
-- 类似于转账时,若转的过程中遇到错误,则金额会通过rollback的方式返回原账户
-- 第一步,创建存储过程
delimiter //
create procedure p1(
out p_return_code tinyint#定义状态量,根据返回值判断程序进行的状态
)
begin
declare exit handler for sqlexception#出错时执行的语句
begin
-- error
set p_return_code=1;
rollback;#回滚
end; declare exit handler for sqlwarning#有警告时执行的语句
begin
-- warning
set p_return_code=2;
rollback;#回滚
end; start transaction;#若无错误,则正常执行的语句
delete from b;
select * from userinfo;
commit;#提交数据 -- success
set p_return_code=0;#语句执行成功时,状态量设置为0
end //
delimiter ;
#第二步,执行存储过程,并在最后删除
set @v1=0;
call p1(@v1);
select @v1;
drop procedure p1;
事务(类似于转账出错)
#第一步,创建表格
create table A(
id int not null auto_increment primary key,
num int
)engine=innodb default charset=utf8; create table B(
id int not nint
)engine=innodb default charset=utf8; drop table A,B;#删除表格
#第二步,创建游标
delimiter //
create procedure p1()
begin
declare row_id int;#定义变量
declare row_num int;#定义变量
declare temp int;#定义变量
declare done int default false;#定义状态量,如果为true,则表示操作完成
declare my_cursor cursor for select id,num from a;#定义游标,得到一个表
declare continue handler for not found set done=true;#如果没有数据,则自动将状态设置为true open my_cursor;#创建游标,类似于打开文件
func:loop#创建循环,其关键字为loop
fetch my_cursor into row_id,row_num;#从游标中取数值
if done then leave func;#如果数据取完了为NULL,则退出
end if;
set temp=row_id+row_num;
insert into b(number)values(temp);#插入数据
end loop func;#退出循环
close my_cursor;#关闭游标
end //
demiliter ;
#第三步,执行存储过程,并在最后删除
call p1();
drop procedure p1;
游标(循环操作表格每一行)
-- 动态执行MySQL(防SQL注入)
#第一步,创建存储过程
delimiter //
create procedure p1(
in nid int
)
begin
set @nid=nid;
prepare prod from "select * from userinfo where is > ?";#执行的语句的名称为prod
execute prod using @nid;#将占位符替换成相对应的值
deallocate prepare prod;#执行语句
end //
delimiter ;
#第二步,执行并删除存储过程。
call p1(60);
drop procedure p1;
动态执行SQL(防SQL注入)
事务
索引
1. 索引
作用:
- 约束
- 加速查找
索引:
- 主键索引:加速查找 + 不能为空 + 不能重复
- 普通索引:加速查找
- 唯一索引:加速查找 + 不能重复
- 联合索引(多列):
- 联合主键索引
- 联合唯一索引
- 联合普通索引
待补充..........
其他
学习MySQL过程中的随笔二的更多相关文章
- 学习MySQL过程中的随笔一
第一天: 关于安装出现了很多问题,各种不懂的bug,没得法只能在网上查找解决方法,终于!!! 登录成功了,一下午的时间 附上参考资料:https://blog.csdn.net/weibo_boer/ ...
- 学习Mysql过程中拓展的其他技术栈:Docker入门介绍
一.Docker的介绍和安装 1. Docker是什么 百度百科的介绍: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linu ...
- 学习Mysql过程中拓展的其他技术栈:设置linux虚拟机的固定ip和克隆linux虚拟机
一.设置linux虚拟机的固定ip 1. 安装好虚拟机后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子 ...
- 关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录)
关于HTML中,绝对定位,相对定位的理解...(学习HTML过程中的小记录) 作者:王可利(Star·星星) HTML中 相对定位:position:relative; 绝对定位:position ...
- 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)
利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录) 作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...
- html/css 盒子布局 Margin 、Padding 、border 以及 清除浮动的知识 (学习HTML过程中的小记录)
html/css 盒子布局 Margin .Padding .border 以及 清除浮动的知识 (学习HTML过程中的小记录) 作者:王可利(Star·星星) width 是"宽 ...
- Python使用Mysql过程中一些错误
Python使用Mysql过程中一些错误 ssh登录远程服务器 ssh ubuntu@xxx.xxx.xx.xx 第一:ubuntu终端中登录Mysql mysql -uroot -p 然后输入密码即 ...
- 深度学习训练过程中的学习率衰减策略及pytorch实现
学习率是深度学习中的一个重要超参数,选择合适的学习率能够帮助模型更好地收敛. 本文主要介绍深度学习训练过程中的6种学习率衰减策略以及相应的Pytorch实现. 1. StepLR 按固定的训练epoc ...
- 各种报错各种坑 webpack让我在学习的过程中一度想要放弃
由于拓展部分不是必须的,只是可以增强用户体验,但是有些时候页面给分页预留的位置不够,这个时候我们就可以通过设置来除去这一部分 子分区由两种创建方法,一种是不定义每个子分区子分区的名字和路径由分区决定, ...
随机推荐
- ionic3 国际化 转义 html
<div [innerHTML]="assembleHTML(detail)"> import { DomSanitizer } from '@angular/plat ...
- 关于 UNIX 的哲理名言(中英文对照)
UNIX 的特点: Everything (including hardware) is a file.所有的事物(甚至硬件本身)都是一个的文件. Configuration data stored ...
- java学习 之 第一个程序及认识
以前也看过一系列的java方面的程序,但是还没有正式敲过,今天正式学习并且正式敲出代码.在这里记录下来今日所得 写作工具:Notepad++ 在写作工具方面好多人建议用 记事本,但是我还是认为用 No ...
- Jmeter_24个常用函数
JMeter提供了很多函数,如果能够熟练使用,可以为脚本带来很多方便. JMeter函数是一种特殊值,可用于除测试计划外的任何组件. 函数调用的格式如下所示:${__functionName(var1 ...
- python selenium Chrome模拟手机浏览器
在做移动端页面测试时可以利用Chrome mobile emulation 辅助完成页面的适配问题,但是目前手机市场上的型号居多我们也没有办法通过人工的模式一一的去适配,所以这里考虑到通过自动化的模式 ...
- 你好!酷痞 Coolpy
欢迎你进入酷痞的物联网世界.这里有着自由的空气和自然的气息.接下来我将告诉你如果一步步建立一个自己专属的物联网平台. 由于目前的酷痞的官方域名还没有通过备案所以现在用临时域名解说本说明. 最终酷痞的官 ...
- Azure Database for MySQL 报 Please specify SSL options and retry.
Exception has been thrown by the aspect of an invocation. ---> Authentication to host 'xxx.mysql. ...
- js检测访问设备
if (navigator.userAgent.match(/(iPod|iPhone|iPad)/)) { }
- bzoj3124: [Sdoi2013]直径 树形dp two points
题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...
- node版本升级参考
https://www.cnblogs.com/sese/p/9557161.html