首页 > 数据库 >MySQL

MySQL

时间:2023-10-19 09:16:00浏览次数:34  
标签:-- Pro 视图 DELIMITER num MySQL PROCEDURE

1. 视图

概述:

视图(View)是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

视图相对于普通的表的优势主要包括以下几项。

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
  • 安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

 

视图简单使用:

-- 创建视图
-- create view 视图名称 as 视图内容
--例:
CREATE view Pro_Goods
as
select * from products left JOIN category on products.category_id = category.cid

--查询视图
--【注:这里面可根据各种条件来进行查询】
select * from Pro_Goods

--查看视图
show CREATE VIEW Pro_Goods

--删除视图
DROP VIEW Pro_Goods

 

2.存储过程和函数

2.1 基本操作

删除存储过程

drop PROCEDURE if EXISTS Pro_MyTest

 

创建存储过程

DELIMITER //
CREATE PROCEDURE Pro_MyTest()
BEGIN
	SELECT * FROM products;
end
// DELIMITER;

 

查看存储过程

call Pro_MyTest

 

2.2  存储过程--变量

drop PROCEDURE if EXISTS Pro_MyTest2

DELIMITER //
CREATE PROCEDURE Pro_MyTest2()
BEGIN
-- 	声明一个变量
 DECLARE num int;
	set num=50;
	select num+50;
end
// DELIMITER;
call Pro_MyTest2

 

2.3 存储过程--if

-- 存储过程--if
drop PROCEDURE if EXISTS Pro_MyTest3

DELIMITER //
CREATE PROCEDURE Pro_MyTest3()
BEGIN
-- 	声明一个变量
 DECLARE num int;
 DECLARE msg VARCHAR(200);
	set num=180;
	if num >= 180 THEN set msg="很高";
	ELSEIF num >= 170 THEN set msg="还行";
	ELSE set msg="就那样";
	END IF;
	SELECT msg;
end
// DELIMITER;
call Pro_MyTest3

 

2.4 存储过程--传参 

-- 存储过程--传参
drop PROCEDURE if EXISTS Pro_MyTest4

DELIMITER //
CREATE PROCEDURE Pro_MyTest4(in num int,out msg VARCHAR(200))
BEGIN
	if num >= 180 THEN set msg="很高";
	ELSEIF num >= 170 THEN set msg="还行";
	ELSE set msg="就那样";
	END IF;
end
// DELIMITER;
call Pro_MyTest4(180,@m);
SELECT @m

【注:

@description : 这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。

@@global.sort_buffer_size : 这种在变量前加上 "@@" 符号, 叫做 系统变量

】 

 

2.5 存储过程--case结构

-- 需求:
-- 给定一个月份, 然后计算出所在的季度
drop PROCEDURE if EXISTS Pro_MyTest5

DELIMITER //
CREATE PROCEDURE Pro_MyTest5(in num int,out msg VARCHAR(200))
BEGIN
	case
	WHEN num>=1 and num<=3 then set msg="第一季度";
	WHEN num>=4 and num<=6 then set msg="第二季度";
	WHEN num>=7 and num<=9 then set msg="第三季度";
	WHEN num>=10 and num<=12 then set msg="第四季度";
	WHEN num>=13 then set msg="输入有误";
	end case;
end
// DELIMITER;
call Pro_MyTest5(15,@m);
SELECT @m

 改进,上述改为if语句执行

drop PROCEDURE if EXISTS Pro_MyTest6

DELIMITER //
CREATE PROCEDURE Pro_MyTest6(in num int,out msg VARCHAR(200))
BEGIN
	if num>=1 and num <=3 then set msg="第一季度";
	elseif num>=4 and num <=6 then set msg="第二季度";
	elseif num>=7 and num <=9 then set msg="第三季度";
	elseif num>=10 and num <=12 then set msg="第四季度";
	else set msg="输入有误";
	end if;
end
// DELIMITER;
call Pro_MyTest6(1,@m);
SELECT @m

 

2.6 存储过程-- while循环 

-- 计算从1加到n的值
drop PROCEDURE if EXISTS Pro_MyTest7

DELIMITER //
CREATE PROCEDURE Pro_MyTest7(in num int)
BEGIN
	DECLARE total int DEFAULT 0;
	DECLARE n int DEFAULT 1;
	while n<=num do
	set total=total+n;
	set n=n+1;
	end while;
	select total;
end
// DELIMITER;
call Pro_MyTest7(50);

 

2.7  存储过程--repeat语句

-- 计算从1加到n的值
-- [注:repeat语句下的until后面不跟分号]
drop PROCEDURE if EXISTS Pro_MyTest8

DELIMITER //
CREATE PROCEDURE Pro_MyTest8(in num int)
BEGIN
	DECLARE total int DEFAULT 0;
	repeat
	set total=total+num;
	set num=num-1;
	until num=0
	end repeat;
	select total;
end
// DELIMITER;
call Pro_MyTest8(50);

【注:repeat语句下的until后面不跟分号】 

 

2.8 存储过程--loop语句 && leave

-- 计算从1加到n的值
drop PROCEDURE if EXISTS Pro_MyTest9

DELIMITER //
CREATE PROCEDURE Pro_MyTest9(in num int)
BEGIN
	DECLARE total int DEFAULT 0;
	ins:LOOP
	IF num<=0 THEN
		LEAVE ins; 
	END IF; 
	set total=total+num;
	set num=num-1;
END LOOP ins;
	select total;
end
// DELIMITER;
call Pro_MyTest9(5);

 【注:ins是随便写的主要是用于标识】

Loop语法:

标识: LOOP
	-- 结束循环条件
	IF 条件 THEN
		LEAVE 标识; 
		这一行是循环体
		直到满足循环条件时结束
	END IF; 
END LOOP 标识;

 

2.9 存储过程--游标/光标

游标语法:

--  存储过程--游标/光标
声明光标:
DECLARE cursor_name CURSOR FOR select_statement ;
打开光标:
OPEN cursor_name ;
捕获光标:
FETCH cursor_name INTO var_name [, var_name] ...
关闭光标:
CLOSE cursor_name ;

 

游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPEN、FETCH 和 CLOSE,其语法分别如下:

drop PROCEDURE if EXISTS Pro_MyTest10

DELIMITER //
CREATE PROCEDURE Pro_MyTest10()
BEGIN
	declare eid int(11);
	declare ename VARCHAR(200);
	declare sex VARCHAR(200);
	declare salary int(255);
	declare time date;
	declare dept_name VARCHAR(200);
    -- 创建游标
	declare emp_result cursor for select * from emp;
    -- 打开游标
	open emp_result;
    -- 捕获游标
	fetch emp_result into eid,ename,sex,salary,time,dept_name;
  select concat('id=',eid , ', name=',ename, ', sex=', sex, ', 薪资为: ',salary,'入职时间:',time,'部门名称:',dept_name);
    -- 关闭游标
	close emp_result;
end
// DELIMITER;
call Pro_MyTest10();

 

【注:捕获游标时,如果只写一次捕获游标语句,只会输出一条,所以,捕获一次输出一条】

【注:所以,需要加上循环捕获游标的方式】

 

循环捕获游标:

【注:那么在数据库中,其并不知道什么时候才算循环结束,所以应该有一个结束条件】:

DECLARE has_data int default 1;
DECLARE EXIT HANDLER FOR NOT FOUND set has_data = 0;
 if has_data=0 then
        leave xw;
     end if;
     
     -- 此处就是结束循环的条件

 

完整代码:

-- 使用循环捕获游标
drop PROCEDURE if EXISTS Pro_MyTest11

DELIMITER //
CREATE PROCEDURE Pro_MyTest11()
BEGIN
	declare eid int(11);
	declare ename VARCHAR(200);
	declare sex VARCHAR(200);
	declare salary int(255);
	declare time date;
	declare dept_name VARCHAR(200);
	DECLARE has_data int default 1;    -- 必要的离开条件
	declare emp_result cursor for select * from emp;
	DECLARE EXIT HANDLER FOR NOT FOUND set has_data = 0;    -- 必要的离开条件
	open emp_result;
	-- 开始循环
	xw:loop
	if has_data=0 then    -- 必要的离开条件 has_data=0
				LEAVE xw;
	end if;
	fetch emp_result into eid,ename,sex,salary,time,dept_name;
  select concat('id=',eid , ', name=',ename, ', sex=', sex, ', 薪资为: ',salary,'入职时间:',time,'部门名称:',dept_name);
	end loop xw;
	close emp_result;
end
// DELIMITER;
call Pro_MyTest11();

 

 


 以上便是MySQL中的部分内容,如有漏缺请在下方留言告知,我会及时补充

标签:--,Pro,视图,DELIMITER,num,MySQL,PROCEDURE
From: https://www.cnblogs.com/9--1/p/17773106.html

相关文章

  • MySQL 5.7生命周期终结的技术探讨
    MySQL5.7将于2023年10月31日终结生命周期。终结意味着自2023年10月31日起,MySQL官方将不再提供对MySQL5.7版本的技术支持和更新。具体来说,这意味着以下几点。安全补丁和错误修复:MySQL官方将不再发布关于MySQL5.7版本的安全补丁和错误修复。这可能会导致在未来发现的安全漏......
  • 初识数据库Mysql
    1、数据库管理系统:管理数据的软件2、关系型数据excelMySQL、Oracle、SQLServer、SQLite、DB2,⾮关系型mapRedis、MongoDB。3、数据库的管理系统(DatabaseManagementSystem)。4、Mysql现在流⾏的免费开源的关系型数据库。5、6、数据库语句分类DDLdatadefini......
  • glibc方式安装mysql
    cd/usr/local/srcmkdirmysql   useraddmysql下载wgethttps://repo.huaweicloud.com/mysql/Downloads/MySQL-5.7/mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz解压tarzxvfmysql-5.7.33-linux-glibc2.12-x86_64.tar.gz移动并改名mvmysql-5.7.33-linux-glibc2.12-x86......
  • datax从oracle到mysql数据传输
    datax进行数据迁移: 所需配置:1、服务器:windows/linux(本人使用的本地windows)         2、环境:python2.6.3  和java.11.0.20(本人使用)         3、datax(https://github.com/taosdata/DataX)以上下载完成后可以通过下面命令来查看是否下载......
  • 将自定义的日志直接写入到 mysql 数据库
    将日志直接写入到MySQL数据库中可能会对性能产生影响。如果需要高性能的日志记录解决方案,则可以考虑使用专门的日志记录器,例如Elasticsearch、Logstash和Kibana(ELK)堆栈。安装MySQL数据库,并创建一个新的数据库和表来存储日志数据。使用MySQL连接器来连接到MySQL数据库。创建一个包含......
  • MySQL性能优化
    https://www.bilibili.com/video/BV17e411w7EM/?spm_id_from=333.788.recommend_more_video.0&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • MySQL主从复制无法同步删除操作吗?【转】
    简介在MySQL主从复制中,当主库执行删除操作时,从库并不会同步删除对应的数据。这是由于MySQL的复制机制决定的。为了解决这个问题,我们可以通过在主库上创建触发器来实现删除操作的同步。解决方案概览下面是解决方案的整体流程图: 创建触发器首先,我们需要在主库上创建一个触发......
  • mysql主从复制-重做从库
    mysql主从复制-重做从库在主服务器执行查看从节点的数量SHOWSLAVEHOSTS;+-----------+------+------+-----------+--------------------------------------+|Server_id|Host|Port|Master_id|Slave_UUID|+-----------+------+-----......
  • Mysql 连接池配置问题
     使用SglSugar BulkCopy方法进行大批量插入时一直报错,检查了实体、数据库字段属性都无异常,最后发现数据库连接中配置了 AllowZeroDatetime=true;ConvertZeroDateTime= true;注释后异常解决。  AllowZeroDatetime=true,可以解决的是Mysql中datetime默认值为0000-00......
  • MySQL 是怎么加锁的
    MySQL是怎么加锁的什么SQL语句会加行级锁?普通select不会加锁,除非是串行化隔离等级。但是select...forupdate或者select...lockinsharemode加锁,统称为锁定读。还有updatedelete语句也会加锁行级锁有哪些种类?三种,分别是recordlock,gaplock,next-keylockrecordloc......