学习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让我在学习的过程中一度想要放弃
由于拓展部分不是必须的,只是可以增强用户体验,但是有些时候页面给分页预留的位置不够,这个时候我们就可以通过设置来除去这一部分 子分区由两种创建方法,一种是不定义每个子分区子分区的名字和路径由分区决定, ...
随机推荐
- mysql数据库基本语句
我们除了可以在mysql数据库或phpmyadmin中登陆数据库我们还可以使用linux中命令进行创建,下面我来给大家介绍一个简单的数据库创建方法吧. 首选用putty连接linux服务器,进行命令行 ...
- pl/sql学习(4): 包package
本文简单介绍包, 目前来看我用的不多, 除了之前 为了实现 一个procedure 的输出参数是结果集的时候用到过 package. 概念: 包是一组相关过程.函数.变量.常量和游标等PL/SQL程序 ...
- Felx布局基础教程
网页布局即layout是css的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...
- MySQL入门命令
SQL(Structured Query Language) SQL是结构化查询语言,是一种用来操作RDBMS的数据库语言,当前关系型数据库都支持使用SQL语言进行操作,也就是说可以通过 SQL 操作 ...
- Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- 使用 Sonar 检测代码质量
经历了一段时间的加班赶项目进度之后,今天终于闲下来了.忽然不知道干啥.于是,想着做点什么吧.突然想起了码云上面有个代码分析的功能,用的是 Sonar 于是想来玩玩这个. 一.下载Sonar,和初始化, ...
- RN页面获取组件位置和大小的方法
在RN的页面布局和操作中,有时需要获取元素的大小和位置信息,本文从网上抄袭了几个常用方法,以备不时之需. 首先是获取设备屏幕的宽高 import {Dimensions} from 'react-na ...
- tensorflow例子-【老鱼学tensorflow】
本节主要用一个例子来讲述一下基本的tensorflow用法. 在这个例子中,我们首先伪造一些线性数据点,其实这些数据中本身就隐藏了一些规律,但我们假装不知道是什么规律,然后想通过神经网络来揭示这个规律 ...
- LeetCode问题
1.Two Sum """Given an array of integers, return indices of the two numbers such that ...
- Attribute-Recognition行人属性识别资料
(摘自王逍同学的论文arxiv-2019+Pedestrian Attribute Recognition A Survey) 1. 数据集 Dataset Pedestrians Attribute ...