MySQL高级语句 Part2(视图表 +存储过程+条件语句+循环语句)

news2024/11/16 21:02:07

这里写目录标题

  • 一、视图表 create view
    • 1.1 视图表概述
    • 1.2 视图表能否修改?(面试题)
    • 1.3 基本语法
      • 1.3.1 创建
      • 1.3.2 查看
      • 1.3.3 删除
    • 1.4 通过视图表求无交集值
  • 二、case语句
  • 三、空值(null) 和 无值(' ') 的区别
  • 四、正则表达式
    • 4.1 基本语法和匹配模式
    • 4.2 举个例子
  • 五、存储过程
    • 5.1 简介
    • 5.2 存储过程的优点
    • 5.3 建立存储过程的步骤
    • 5.4 相关命令
      • 5.4.1 创建
      • 5.4.2 调用
      • 5.4.3 查看
      • 5.4.4 删除
    • 5.5 存储过程的参数
    • 5.6 存储过程的控制语句
    • 5.6.1 条件语句`if-then-else ···· end if`
    • 5.6.2 循环语句`while ···· end while`

一、视图表 create view

1.1 视图表概述

视图,可以被当作是虚拟表或存储查询。

视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。

临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
视图不含有数据只存储它的定义,它的用途一般可以简化复杂的查询。

比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写sql语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。

1.2 视图表能否修改?(面试题)

视图表保存的是select语句的定义,视图表的表数据能否修改,视情况而定。

如果 select 语句查询的字段是没有被处理过的源表字段,则可以通过视图表修改源表数据;
如果select 语句查询的字段是group by语句函数 处理过的字段,则不可以直接修改视图表的数据。

举个例子

create view v_store_info as select store_name,sales from store_info;

update v_store_info set sales=1000 where store_name='Houston';

在这里插入图片描述

create view v_sales as select store_name,sum(sales) from store_info group by store_name having sum(sales)>1000;

update v_sales set store_name='xxxx' where store_name='Los Angeles';

在这里插入图片描述
在这里插入图片描述

1.3 基本语法

1.3.1 创建

语法
create view "视图表名" as "select 语句";

举个例子

create view v_region_sales as select a.region region,sum(b.sales) sales from location a 
inner join store_info b on a.store_name = b.store_name group by region;

在这里插入图片描述

1.3.2 查看

语法
select * from 视图表名;
select * from v_region_sales;

在这里插入图片描述

1.3.3 删除

语法
drop view 视图表名;
drop view v_region_sales;

在这里插入图片描述

1.4 通过视图表求无交集值

将两个表中某个字段的不重复值进行合并

只出现一次(count =1 ) ,即无交集

通过

create view 视图表名 as select distinct 字段 from 左表 union all select distinct 字段 from 右表;

select 字段 from 视图表名 group by 字段 having count(字段)=1;
#先建立视图表
create viem v_union as select distinct store_name from location union all select distinct store_name from store_info;

在这里插入图片描述

#再通过视图表求无交集
select store_name from v_union group by store_name having count(*)=1;

在这里插入图片描述

二、case语句

在MySQL中,CASE语句用于根据给定条件对数据进行条件判断和分支选择。

它可以在SELECT、UPDATE、DELETE语句中使用,也可以用于表达式中。

语法
select case ("字段名")
  when "条件1" then "结果1"
  when "条件2" then "结果2"
  ...
  [else "结果n"]
  end
from "表名";

# "条件" 可以是一个数值或是公式。 else 子句则并不是必须的。
#举个例子
select store_name, case store_name 
  when 'los angeles' then sales * 2 
  when 'boston' then 2000
  else sales 
  end 
'new sales',date 
from store_info;

#将'sales的值作为new sales的值返回

在这里插入图片描述

三、空值(null) 和 无值(’ ') 的区别

1)无值的长度为 0,不占用空间的;而 null 值的长度是 null,是占用空间的;

2)is null 或者 is not null,是用来判断字段是不是为 null 或者不是 null,不能查出是不是无值的;

3)无值的判断使用=' '或者<>' '来处理,<>!=代表不等于;

4)在通过 count( )指定字段统计有多少行数时,如果遇到 NULL 值会自动忽略掉,遇到无值会加入到记录中进行计算。

四、正则表达式

4.1 基本语法和匹配模式

语法
select "字段" from "表名" where "字段" regexp {匹配模式};

匹配模式不区分大小写

匹配模式描述实例
^匹配文本的开始字符‘^bd’ 匹配以 bd 开头的字符串
$匹配文本的结束字符‘qn$’ 匹配以 qn 结尾的字符串
.匹配任何单个字符‘s.t’ 匹配任何 s 和 t 之间有一个字符的字符串
*匹配零个或多个在它前面的字符‘fo*t’ 匹配 t 前面有任意个 o
+匹配前面的字符 1 次或多次‘hom+’ 匹配以 ho 开头,后面至少一个m 的字符串
字符串匹配包含指定的字符串‘clo’ 匹配含有 clo 的字符串
p1|p2匹配 p1 或 p2‘bg|fg’ 匹配 bg 或者 fg
[]匹配字符集合中的任意一个字符‘[abc]’ 匹配 a 或者 b 或者 c
[^…]匹配不在括号中的任何字符[^ a b] 匹配不包含 a 或者 b 的字符串
{n}匹配前面的字符串 n 次‘g{2}’ 匹配含有 2 个 g 的字符串
{n,m}匹配前面的字符串至少 n 次,至多m 次‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次

4.2 举个例子

select * from store_info where store_name regexp '^[a-g]';

在这里插入图片描述

select * from store_info where store_name regexp 'Hou+';

在这里插入图片描述

select * from store_info where store_name regexp 'os';

在这里插入图片描述

select * from store_info where store_name regexp 'ho|bo';

select * from store_info where store_name regexp 'Ho|Bo';

在这里插入图片描述

select * from store_info where store_name regexp 'b{1}';

在这里插入图片描述

五、存储过程

存储过程也叫做数据库脚本(MySQL脚本,SQL脚本)

5.1 简介

存储过程是一组为了完成特定功能的sql语句集合。

存储过程在使用过程中是将常用或者复杂的工作预先使用sql语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统sql速度更快、执行效率更高。

5.2 存储过程的优点

1、执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
2、sql语句加上控制语句的集合,灵活性高
3、在服务器端存储,客户端调用时,降低网络负载
4、可多次重复被调用,可随时修改,不影响客户端调用
5、可完成所有的数据库操作,也可控制数据库的信息访问权限

5.3 建立存储过程的步骤

1)临时修改SQL语句的结束符(——>自定义符号,比如$$ ,##,...);

2)创建存储过程;

3)将SQL语句结束符改回;

4)调用存储过程。

5.4 相关命令

5.4.1 创建

delimiter $$							
#将语句的结束符号从分号;临时改为两个$$(可以是自定义)
create procedure proc()					
#创建存储过程,过程名为proc,不带参数
-> begin								
#过程体以关键字 begin 开始
-> select * from store_info;			
#过程体语句
-> end $$								
#过程体以关键字 end 结束
delimiter ;								
#将语句的结束符号恢复为分号

delimiter $$							
create procedure proc()					
-> begin
->.....(要执行的命令)
-> select * from store_info;			
-> end $$								
delimiter ;								
#举个例子

delimiter $$ 
use byyb
create procedure proc1()
begin
create table xxxx (id int,name varchar(10),pid int,,age int);
insert into xxxx values (1,'xx',11,111);
insert into yyyy values (2,'yy',22,222);
insert into zzzz values (3,'zz',33,333);
select * from xxxx;
end $$
delimiter ;

在这里插入图片描述

在这里插入图片描述

5.4.2 调用

call 存储过程名;

在这里插入图片描述

5.4.3 查看

show create procedure [数据库.]存储过程名;		
#查看某个存储过程的具体信息

show create procedure 存储过程名\G;

show procedure status [like '%存储过程名%'] \G;

在这里插入图片描述

在这里插入图片描述

5.4.4 删除

存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。

如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。

基本语法
drop procedure if exists 存储过程名;		
#仅当存在时删除
#不添加 if exists 时,如果指定的过程不存在,则报错

在这里插入图片描述

5.5 存储过程的参数

参数功能
in 输入参数表示调用者向过程传入值(传入值可以是字面量或变量)
out 输出参数表示过程向调用者传出值(可以返回多个值)(传出值只能是变量
inout 输入输出参数既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量,传入传出值必须是同一数据类型)

in

delimiter $$				
create procedure proc1(in inname char(16))		
-> begin					
-> select * from store_info where store_name = inname;
-> end $$					
delimiter ;					

call proc1('boston');

#inname为自定义变量名

在这里插入图片描述

out

基本格式

delimiter $$
create procedure 存储过程名(in 传入参数名 传入参数数据类型,out 传出参数名 传出参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=传入参数名;
end $$
delimiter ;

call 存储过程名(参数值,@变量名)
#传出参数的值只能用变量获取
#举个例子

delimiter $$
mysql> create procedure proc1(in myname char(10), out outname int)
    -> begin
    -> select sales into outname from store_info where store_name = myname
    -> end $$
delimiter ;
#建一个名为 proc1 的存储过程
#存储过程接收一个字符参数 myname,并将与其匹配的 store_info 表中的 sales 值存储到一个整数参数 outname 中

call proc1('Houston', @xxx);
select @xxx;

在这里插入图片描述

inout

基本格式

delimiter $$
create procedure 存储过程名(into 参数名 参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=参数名;
end $$
delimiter ;

set @变量名 传入值
#变量赋值,传入值
call 存储过程名(@变量名)
#传入传出参数的值只能用变量
select @变量名
#此时变量内容应该为传出值
delimiter $$
create procedure proc4(inout insales int)
-> begin
-> select count(sales) into insales from store_info where sales < insales;
-> end $$
delimiter ;
set @inout_sales=1000;
call proc4(@inout_sales);
select @inout_sales;

#创建了一个名为 proc4 的存储过程
#存储过程接受一个输入输出参数 insales,并通过查询 store_info 表获取 sales 值小于 insales 的记录数量,并将结果存储到参数 insales 中。
#通过 call 语句调用该存储过程,并使用 select 语句查看存储在变量 @inout_sales 中的值。

在这里插入图片描述

5.6 存储过程的控制语句

create table t (id int(10));
insert into t values(10);

5.6.1 条件语句if-then-else ···· end if

if 条件表达式 then
  SQL语句序列1
else
  SQL语句序列2
end if;
delimiter $$  
create procedure proc3(in pro int)  
-> begin 
-> declare var int;  
-> set var=pro*2;   
-> if var>=10 then 
-> update t set id=id+1;  
-> else 
-> update t set id=id-1;  
-> end if;  
-> end $$

delimiter ;

call proc3(6);
#pro=6

在这里插入图片描述

5.6.2 循环语句while ···· end while

while 条件表达式
do
  SQL语句序列
  set 条件迭代表达式;
end while;
delimiter $$  
create procedure proc3()
-> begin 
-> declare var int(10);  
-> set var=0;  
-> while var<6 do  
-> insert into t values(var);  
-> set var=var+1;  
-> end while;  
-> end $$  

delimiter ;

call proc3;

举个例子

创建一张表

id name

1 student1

一万行数据

delimiter $$  
create procedure proc4()
begin 
declare i int;
set i=1;
create table xx(id int ,name varchar(20))
while i<=10000 do  
insert into xx values(i,concat('student',i));  
set i=i+1;  
end while;  
end $$  

delimiter ;

call proc4;

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1033115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pcl--第十二节 2D和3D融合和手眼标定

2D&3D融合 概述 截止目前为止&#xff0c;我们学习了机器人学&#xff0c;学习了2D和3D视觉算法。我们也学习了2D相机(图像数据的来源)和3D相机(点云数据的来源)工作原理。 实际上&#xff0c;我们最终要做的&#xff0c;是一个手眼机器人系统。在这个系统里&#xff0c…

数据仓库整理

数仓 olap vs oltp OLTP主要用于支持日常的业务操作&#xff0c;如银行交易、电子商务等&#xff0c;强调数据的准确性、实时性和并发性。OLAP主要用于支持复杂的数据分析&#xff0c;如数据仓库、决策支持等&#xff0c;强调数据的维度、聚合和可视化。 将OLTP数据库的数据…

接入国家能源平台MQTT应用案例

一、项目介绍 随着国家对节能环保措施的力度不断加大&#xff0c;基于物联网技术搭建的国家能源平台在国家相关部门的建设下逐渐成熟。致力于利用实际能耗数据建立能效仿真模型&#xff0c;通过实时寻优运算&#xff0c;获得当前的最优化运行策略&#xff0c;并将控制指令下发…

从Langchain到ReAct,在大模型时代下全新的应用开发核心

简介&#xff1a; 什么是ReAct框架关于什么是langchain&#xff0c;可以参考&#xff1a;https://ata.alibaba-inc.com/articles/266839?spmata.23639420.0.0.1dea7536uD7yhh在使用langchain的过程中&#xff0c;大模型给人留下最深刻的印象无疑是Agent功能。大模型会自己分析…

@Cacheable 注解(指定缓存位置)

一、Cacheable的作用 1、缓存使用步骤&#xff1a;Cacheable这个注解&#xff0c;用它就是为了使用缓存的。所以我们可以先说一下缓存的使用步骤&#xff1a; 1、开启基于注解的缓存&#xff0c;使用 EnableCaching 标识在 SpringBoot 的主启动类上。 2、标注缓存注解即可 使用…

【Less-CSS】初识Less,使编写 CSS 变得简洁

初识Less&#xff0c;使编写 CSS 变得简洁 1.Less简述2.LESS 原理及使用方式3.示例4.less语法5.Easy Less插件 作为一门标记性语言&#xff0c;CSS 的语法相对简单&#xff0c;对使用者的要求较低&#xff0c;但同时也带来一些问题&#xff1a;CSS 需要书写大量看似没有逻辑的代…

【初阶数据结构】二叉树链式结构的实现和遍历

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 目录 前言 二叉树链式结构的实现 二叉树的遍历 前序、中序和后序遍历 前序遍历 中序遍历 后序遍历 求结点个数 求总的结点个数 创建变量求结点 创建静态修饰变量 拆分左右子树加根 求叶子节点的个…

LeetCode【65. 有效数字】

没有完美的傀儡,没有完美的人类,却有绝美的离逝。 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 一个 小数 或者 整数&#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#xff09;可以分成以下几…

2023华为杯研究生数学建模竞赛CDEF题思路+模型代码

全程更新华为杯研赛CDEF题思路模型及代码&#xff0c;大家查看文末名片获取 华为杯C题思路分析 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性&#xff0c;不同专家评审的作…

【Java毕设项目】基于SpringBoot+Vue校园便利平台的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

3.6+铁死亡+WGCNA+机器学习

今天给同学们分享一篇3.6铁死亡WGCNA机器学习的生信文章“Identification of ferroptosis related biomarkers and immune infiltration in Parkinsons disease by integrated bioinformatic analysis”&#xff0c;这篇文章于2023年3月14日发表在BMC Med Genomics期刊上&#…

【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本

环境 ubuntu 20.04mongodb 4.4.14还没实际使用&#xff08;20230922&#xff09;后续到10月底如果有问题会修改 原理 只会在有新增数据时生成新的备份日期目录备份恢复时&#xff0c;如果恢复的数据库未删除&#xff0c;则会覆盖数据 准备 准备一个文件夹&#xff0c;用于…

2023华为杯数学建模竞赛E题

一、前言 颅内出血&#xff08;ICH&#xff09;是由多种原因引起的颅腔内出血性疾病&#xff0c;既包括自发性出血&#xff0c;又包括创伤导致的继发性出血&#xff0c;诊断与治疗涉及神经外科、神经内科、重症医学科、康复科等多个学科&#xff0c;是临床医师面临的重要挑战。…

Springboot2 Pandas Pyecharts 量子科技专利课程设计大作业

数据集介绍 1.背景 根据《中国科学&#xff1a;信息科学》期刊上的一篇文章&#xff0c;量子通信包括多种协议与应用类型&#xff1a; 基于量子隐形传态与量子存储中继等技术&#xff0c;可实现量子态信息传输&#xff0c;进而构建量子信息网络&#xff0c;已成为当前科研热点&…

成为威胁:网络安全中的动手威胁模拟案例

不断变化的网络威胁形势要求组织为其网络安全团队配备必要的技能来检测、响应和防御恶意攻击。然而&#xff0c;在研究中发现并继续探索的最令人惊讶的事情是&#xff0c;欺骗当前的网络安全防御是多么容易。 防病毒程序建立在庞大的签名数据库之上&#xff0c;只需更改程序内…

聊聊自动化测试路上会遇到的挑战~

一、测试范围 无论是功能测试&#xff0c;还是自动化或者性能测试&#xff0c;第一步要做的&#xff0c;是明确测试范围和需求指标。对于自动化测试来说&#xff0c;特别是UI自动化&#xff0c;并不是所有的功能点都适合做UI自动化。 根据具体的业务情况和项目稳定程度&#…

Unity之Hololens2开发 如何接入的MRTK OpenXR Plugin

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…

conda的安装和使用

参考资料&#xff1a; https://www.bilibili.com/read/cv8956636/?spm_id_from333.999.0.0 https://www.bilibili.com/video/BV1Mv411x775/?spm_id_from333.999.0.0&vd_source98d31d5c9db8c0021988f2c2c25a9620 目录 conda是啥以及作用conda的安装conda的启动conda的配置…

一招解除csdn复制限制

先看这个代码 python读取英文pdf翻译成中文pdf文件导出代码 想要复制代码&#xff0c;csdn有限制怎么办&#xff08;csdn流氓&#xff0c;无耻&#xff09; 解除方法 ctrlu 看效果

PIL或Pillow学习1

PIL&#xff08; Python Imaging Library&#xff09;是 Python 的第三方图像处理库&#xff0c;由于其功能丰富&#xff0c;API 简洁易用&#xff0c;因此深受好评。 自 2011 年以来&#xff0c;由于 PIL 库更新缓慢&#xff0c;目前仅支持 Python 2.7 版本&#xff0c;这明显…