视图的增删改查

视图相当于一张只能读的表,不可以修改。当组成视图的表发生数据变化的时候,视图会相对应的进行改变。

存储过程的练习

创建存储过程:

create [if not exists] procedure 名字 ([in | out | inout] 参数名称 参数类型)
begin
# sql语句
end;

查询存储过程:

存储过程存放于infomation_schema数据库,routines表e

-- 使用sql查询
SELECT *
from information_schema.ROUTINES
where information_schema.routines.routine_schema != 'sys'

运行结果:

删除存储过程:

drop PROCEDURE pr_test;

运行结果:

存储过程的练习:

-- 存储过程的练习 无参数
create PROCEDURE pr_test()
BEGIN
select * from dept;
END; -- 使用存储过程
call pr_test(); -- 存储过程 带有输入参数
-- 如果只有一个输入参数 关键字in 可以省略
create PROCEDURE pr_test1(_deptno int)
BEGIN
SELECT * from emp WHERE deptno = _deptno;
END; call pr_test1(10);
call pr_test1(20);
call pr_test1(30); -- 存储过程 带有输出参数
-- 输出参数的out关键字不可以省略 create PROCEDURE pr_test2(out _ename VARCHAR(50))
BEGIN
SELECT ename into _ename from emp;
END; -- 测试
set @ename = ''; -- 测试 如果包含多条数据 是不能直接进行赋值的
call pr_test2(@ename) ; SELECT @ename; -- 测试存储过程 单个输出参数
CREATE PROCEDURE pr_test3(out _ename VARCHAR(50))
BEGIN
SELECT ename INTO _ename from emp WHERE emp.deptno = 10;
END; -- 输出参数
set @deptno = ''; -- 执行存储过程
call pr_test3(@deptno); -- 输出结果
SELECT @deptno; -- 测试存储过程 有输入参数 也有输出参数
-- 关键字in 可以省略 out 不可以省略
create PROCEDURE pr_test5(_id int,out _ename varchar(20))
BEGIN
SELECT ename into _ename from emp WHERE deptno = _id;
END; -- 测试数据
set @result = ''; --
call pr_test5(10,@result); -- 查询结果
SELECT @result; -- 测试存储过程 即使输入参数 也是输出参数
CREATE PROCEDURE pr_test6(INOUT res VARCHAR(20) )
BEGIN
SELECT emp.deptno into res from emp where emp.empno = res;
END; SELECT * from emp; --
set @res = '7876'; --
call pr_test6(@res); --
SELECT @res;

函数的使用、查看、删除

-- 函数的练习
-- 创建函数
create FUNCTION fun_show_detail() # 注意事项1: 这里的括号一定不能丢
returns varchar(30) # 注意事项2: 这里是rerurns
BEGIN
declare _res VARCHAR(50); # 注意事项3: Delare 需要搭配存储过程和函数使用 不能单独使用
SELECT 1 INTO _res ;
return _res;
END; -- 使用函数
SELECT fun_show_detail()
-- 删除函数
drop FUNCTION fun_show_detail;

触发器

查询当前数据库中所有的触发器:

show TRIGGERS from emp;

删除触发器:

drop TRIGGER tr_emp_update

触发器练习:

-- 创建触发器
create trigger tr_emp_insert
BEFORE INSERT
on emp FOR EACH ROW
BEGIN
insert into emp(empno,ename) values(1,'测试');
END;
-- 触发触发器
insert into emp(empno,ename) values(2,'外面测试');

执行结果:

因为这样会循环的触发触发器,所以不能直接这样进行数据的插入。可以通过set的方式进行赋值。

create trigger tr_emp_insert
BEFORE INSERT
on emp FOR EACH ROW
BEGIN
-- insert into emp set empno = 1,ename ='测试';
set new.empno = 2,new.ename ='测试';
END;

执行sql:

insert into emp(empno,ename) values(2,'外面测试');

再次执行:

所以如果是before xxx,不会直接进行增删改,会执行触发器里面的代码。

关于触发器的new虚拟表格和old虚拟表格

当进行insert的时候,new表格可以获取插入的数据。

当进行delete的时候,old表格可以获取被删除行的数据。

当进行update的时候,new表格中是修改后的数据,old表格中是被修改行的数据。

定时任务event

定时任务 执行一次

语法:

CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE AT timestamp [+ INTERVAL interval] ... DO
begin
# 要执行的sql语句
end;

间隔任务 多次执行

语法:

CREATE
[DEFINER = user]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE EVERY quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND} DO
begin
# 要执行的sql语句
end;

查询定时任务

show EVENTS FROM emp;

删除定时任务

drop event event_name

流程控制

case

给我整懵了,怎么测试怎么出错。

出错原因:

​ 1.case语句不能直接使用,需要搭配存储过程或者函数使用,或者搭配select语句使用。

​ 2.搭配select语句,里面每个语句结束后不能添加分号,结尾语句必须为end,不能为end case;

SELECT case 10
when 10 then '10' -- 这里不能加分号
when 9 then '9' -- 这里不能加分号
else '8'
end; -- 这里不能用end case;结尾

​ 3.搭配存储过程或者函数使用,结尾必须为end case,中间的比较语句也必须加分号,then 后面必须跟着语句使用。

create PROCEDURE test1111()
begin
case 10
when 10 then SELECT '10'; -- 这里必须为sql语句,而且要加分号
when 9 then SELECT '9'; -- 这里必须为sql语句,而且要加分号
else SELECT '8'; -- 这里必须为sql语句,而且要加分号
end case; -- 这里必须以end case;结尾
end;

语法1:

CASE case_value
WHEN when_value THEN statement_list
[WHEN when_value THEN statement_list] ...
[ELSE statement_list]
END CASE

语法2:

CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE

区别:

语法1:匹配的是值,所以when里面不能是表达式。

语法2:匹配的是表达式,when里面是表达式。

if

语法:

IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF

突然发现这些流程控制语句好像大多数都得搭配函数/存储过程使用。

create PROCEDURE test_if()
BEGIN
IF 3>2 THEN
SELECT '正确';
ELSE
SELECT '错误';
END IF; end; call test_if();

while

语法:

[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]

示例代码:阶乘

CREATE FUNCTION get_jc(num int)
RETURNS int
BEGIN
DECLARE i int DEFAULT 1;
DECLARE res int DEFAULT 1; WHILE i <= num DO
set res = res * i;
set i = i + 1;
END WHILE; RETURN res;
end; SELECT get_jc(3);

运行结果:

loop

语法:

[begin_label:] LOOP
statement_list
END LOOP [end_label]

示例代码:阶乘

create FUNCTION test_jc(num int)
RETURNS int
BEGIN
DECLARE i int DEFAULT 1;
DECLARE res int DEFAULT 1; lab: LOOP IF i > num THEN
LEAVE lab;
END IF; set res = res * i;
set i = i + 1; END LOOP; RETURN res;
END; select test_jc(4);

运行结果:

[CURSOR]游标

这个东西,有点意思。

https://dev.mysql.com/doc/refman/8.0/en/cursors.html

MySQL视图、存储过程、函数、触发器、定时任务、流程控制总结的更多相关文章

  1. oracle 之索引,同义词 ,关键词,视图 ,存储过程,函数,触发器

    --创建索引 关键词 index create[unique] index index_name on table_name(column_name [,column_name…]) [tablesp ...

  2. 查看SQL SERVER 加密存储过程,函数,触发器,视图

    原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...

  3. MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法

    在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环.还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,在这里就不错具体 ...

  4. Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

    002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 ...

  5. python操作MySQL,SQL注入的问题,SQL语句补充,视图触发器存储过程,事务,流程控制,函数

    python操作MySQL 使用过程: 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 由于能操作MySQL的模块是第三方模块,我们需要pip安装. pip3 insta ...

  6. MySQL视图,函数,触发器,存储过程

    1. 视图 视图是一个虚拟表,它的本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的临时表摘出来, ...

  7. mysql 触发器、流程控制、事务等

    视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ​ 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ​ 如果要频繁使用一张虚拟表,可以 ...

  8. mysql 存储过程 函数 触发器

    mysql存储过程与函数 存储过程下载  demo mysql> delimiter // -- 这里//为修改默认分隔符: mysql> CREATE PROCEDURE simplep ...

  9. MySQL函数--时间格式--流程控制if判断

    目录 一:函数 1.MySQL什么是函数? 2.通过help查看函数帮助 3.移除指定字符 4.大小写转换 5.获取左右起始指定个数字符 6.返回读音相似值(对英文效果) 二:时间格式实战案例 1.时 ...

  10. MySQL笔记 存储过程 游标 触发器

    第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成 存储过程简单来说,就 ...

随机推荐

  1. easyui textbox setvalue 和 settext前后之别

    今天在这里转了好久,浪费了不少时间.话不多说直接上干货: 1.text与value设置不同的值一定要先赋值 value后赋值text, 否则全为value值 2.若只setValue,则getValu ...

  2. 【JUC】信号量Semaphore详解

    欢迎关注专栏[JAVA并发] 欢迎关注个人公众号-- JAVA旭阳 前言 大家应该都用过synchronized 关键字加锁,用来保证某个时刻只允许一个线程运行.那么如果控制某个时刻允许指定数量的线程 ...

  3. 利用云服务提供商的免费证书,在服务器上发布https前端应用和WebAPI的应用

    我们如果要在服务器上发布https前端应用和WebAPI的应用,那么我们就需要用到https证书了.我们一般发布的应用的云服务器上,都会提供一定量的相关的免费证书(一般为20个)供我们使用,每个一年期 ...

  4. jupyter 数据显示设置

    #设置显示行数pd.set_option('display.max_row',None)#设置显示列数pd.set_option('display.max_column',None)#设置显示宽度pd ...

  5. ChatGPT杀疯了,这人工智能也太离谱了吧

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/2ac8440d.html 你好,我是测试蔡坨坨. 这几天被ChatGPT刷屏,各大网站平台都能看到关于它的文章和视频,上线短 ...

  6. 如何使用OpenCV+MMPEAG打开摄像头,显示的同时推送RTMP流。

    注意,设置中: 代码详解: 1. char* outUrl = "rtmp://localhost/live/livestream"; 这个地址,是AMS(Adeobe Media ...

  7. 手写promise解决回调地狱问题

    在介绍promise之前我们先来看一段代码: 根据案例我们可以看出,这段代码可以无限的嵌套下去,但是每嵌套一层,代码的运行就会降低,而解决回调地狱最好的办法就是new promise 一.什么是 pr ...

  8. day08-功能实现07

    家居网购项目实现07 以下皆为部分代码,详见 https://github.com/liyuelian/furniture_mall.git 16.功能15-会员显示登录名 16.1需求分析/图解 会 ...

  9. 周而复始,往复循环,递归、尾递归算法与无限极层级结构的探究和使用(Golang1.18)

    所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山....,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang ...

  10. 4、Idea设置显示多行文件

    使用IDEA时,可能会没有注意到,一旦打开过多的Java文件时,默认会堆积在一行显示,就像浏览器打开了多个标签一样,此时需要通过右侧箭头筛选的方式来选择其他文件.为了解决这一问题,需要打开多行显示的方 ...