Mysql高级语句(视图表 、存储过程、条件语句、循环语句)

news2024/11/22 16:47:48

Mysql高级语句(视图表 、存储过程、条件语句、循环语句)

  • 一、 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 laozi;

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

在这里插入图片描述

create view v_sales as select store_name,sum(sales) from laozi 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) 和 无值(’ ') 的区别

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

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

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

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

四、正则表达式

4.1、基本语法和匹配模式

匹配模式不区分大小写

匹配模式描述实例
^匹配文本的开始字符‘^bd’ 匹配以 bd 开头的字符
$匹配文本的结束字符‘qn$’ 匹配以 qn 结尾的字符串
.匹配任何单个字符‘s.t’ 匹配任何 s 和 t 之间有一个字符的字符串
*匹配零个或多个在它前面的字符‘fo*t’ 匹配 t 前面有任意个 o
+匹配前面的字符 1 次或多次‘hom+’ 匹配以 ho 开头,后面至少一个m 的字符串
字符串匹配包含指定的字符串‘clo’ 匹配含有 clo 的字符串
p1p2匹配 p1 或 p2 ‘bgfg’ 匹配 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 nba
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

5.6.1 条件语句if-then-else ···· 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/1045406.html

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

相关文章

基于微信小程序的场地预约系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

react create-react-app v5 从零搭建项目

前言&#xff1a; 好久没用 create-react-app做项目了&#xff0c;这次为了个h5项目&#xff0c;就几个页面&#xff0c;决定自己搭建一个&#xff08;ps:mmp 好久没用&#xff0c;搭建的时候遇到一堆问题&#xff09;。 我之前都是使用 umi 。后台管理系统的项目 使用 antd-…

你听说过推挽电路吗?避免交越失真

推挽电路就是用两个三级管或者场效应管构成的放大电路&#xff0c;这个电路的特点就是输出电阻小&#xff0c;能够驱动大的负载&#xff0c;从而能够使得单片机管脚直接驱动发光二极管、蜂鸣器。上面的三极管是N型三极管&#xff0c;下面的三极管是P型三极管&#xff0c; 当输入…

【深度学习实验】卷积神经网络(五):深度卷积神经网络经典模型——VGG网络(卷积层、池化层、全连接层)

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. conv_layer&#xff08;创建卷积块&#xff09; 2. vgg_conv_block&#xff08;卷积模块&#xff1a;卷积层*n、池化层&#xff09; 3. vgg_fc_layer&#xff08;…

华为云云耀云服务器L实例评测|华为云云耀云服务器docker部署srs,可使用HLS协议

华为云云耀云服务器L实例评测&#xff5c;华为云云耀云服务器docker部署srs&#xff0c;可使用HLS协议 什么是华为云云耀云L实例 云耀云服务器L实例&#xff0c;面向初创企业和开发者打造的全新轻量应用云服务器。提供丰富严选的应用镜像&#xff0c;实现应用一键部署&#x…

信创办公–基于WPS的EXCEL最佳实践系列 (获取外部数据)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;获取外部数据&#xff09; 目录 应用背景操作步骤1、导入数据2、刷新数据 应用背景 通常企业的数据会存储在数据库或不同的系统中&#xff0c;而我们想要在自己用的工作WPS的excel表格里使用这些数据&#xff0c;我们可以使…

QT入门10个小demo——MP4视频播放器

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 一、前…

美摄AIGC创新引擎,助力企业快速搭建AIGC能力(一)

AIGC作为当下最热的重要赛道&#xff0c;迅速在视频、图像、文案、绘画等生产创作领域出圈&#xff0c;吸引了百度、阿里、腾讯、谷歌等众多互联网大厂&#xff0c;纷纷布局和计划推出AIGC类的产品。 全新的视频内容生产方式&#xff0c;AIGC利用人工智能技术实现视频内容的自…

DEV gridview多表头设计

先上图&#xff1a; 第一步转化gridview变成bandedGridview类型 一步步按照自己想要的格式添加&#xff0c;先把表头格式全部弄好&#xff0c;然后在拖拉对应的列。 注意&#xff1a;全部弄完后把列表头设置不可见

踩坑 | vue项目运行后使用require()图片也不显示

文章目录 踩坑 | vue项目运行后使用require()图片也不显示问题描述解决办法1&#xff1a;src属性直接传入地址解决办法2 踩坑 | vue项目运行后使用require()图片也不显示 问题描述 在网上查阅之后&#xff0c;发现结论是在使用vue动态加载图片时&#xff0c;必须使用require。…

一篇爆款产品软文怎么写?媒介盒子告诉你三步

随着数字技术的加速发展&#xff0c;企业推广产品的方式已经逐渐从线下过度到线上&#xff0c;而线上推广中比较常见的方式就是软文推广&#xff0c;软文推广成本较低&#xff0c;用户接受度也更高&#xff0c;但是一篇爆款产品软文应该怎么写呢&#xff1f;下面就让媒介盒子告…

nvm安装后node或npm不是内部或外部命令

nvm安装后出现node或npm不是内部或外部命令 进行以下步骤解决 找到nvm安装所在位置&#xff0c;新建一个空的nodejs文件夹 打开 windowr —> sysdm.cpl —> 高级 —>环境变量 将下图中两个位置的地址改成刚刚新建的nodejs空文件夹所在的位置 nvm安装后都是会自动添加…

Qwen-VL:多功能视觉语言模型,能理解、能定位、能阅读等

Overview 总览摘要1 引言2 方法2.1 模型结构2.2 输入输出 3 训练3.1 预训练3.2 多任务预训练3.3 监督finetune 4 评测4.1 图像文本描述和视觉问答4.2 面向文本的视觉问答4.3 指代表达理解4.4 视觉语言任务中的小样本学习4.4 现实用户行为下的指令遵循 5 相关工作6 总结与展望附…

如何运用yolov5训练自己的数据(手把手教你学yolo)

在这篇博文中&#xff0c;我们对YOLOv5模型进行微调&#xff0c;用于自定义目标检测的训练和推理。 目录 引言&#xff1a; YOLOv5是什么&#xff1f; YOLOv5提供的模型 YOLOv5提供的功能 使用YOLOv5进行自定义目标检测训练 自定义训练的方法 自定义训练代码 准备数据集 …

logback日志框架学习(2)logback的构造

官网 https://logback.qos.ch/manual/architecture.html Logback构造 Logback’s basic architecture is sufficiently generic so as to apply under different circumstances. At the present time, logback is divided into three modules, logback-core, logback-classic…

vue3 +elementplus | vue2+elementui 动态地通过验证规则子新增或删除单个表单字段

效果图 点击 ‘’ 新增一行&#xff0c;点击‘-’ 删除一行 vue3elementplus写法 template <el-dialog v-model"dialogFormVisible" :title"title"><el-form ref"ruleFormRef" :model"form" :inline"true" lab…

强势得分套路之一:单基因泛癌+实验验证

今天给同学们分享一篇单基因泛癌实验验证的生信文章“A human pan-cancer system analysis of heat shock protein family A member 5”&#xff0c;这篇文章于2023年5月15日发表在Am J Cancer Res期刊上&#xff0c;影响因子为5.2。 热休克蛋白家族A成员5&#xff08;HSPA5&am…

2024年湖北中级工程师职称申报需要准备什么资料呢?

湖北中级职称申报每个地方需要的资料和要求都不一样&#xff0c;但是大部分申报材料、条件和要求基本是一致的&#xff0c;有的只是细微差别。那么湖北中级工程师职称申报需要准备什么资料呢&#xff1f;今天甘建二先告诉你&#xff0c;职称资料需要提早准备哟&#xff0c;有的…

command not found

一 问题 连着几次登录&#xff0c;输入ls&#xff0c;都not found 二 解决方案 1. 临时生效&#xff0c;下次登录还是not found export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 2. 永久生效&#xff0c;将上面的配置&#xff0c;添加…

iTunes怎么用?iTunes如何恢复备份?(果粉必备教程)

iTunes是由苹果公司推出的一款免费数字媒体播放应用软件。通过使用iTunes软件&#xff0c;用户可以在软件上管理和播放数字音乐、视频、电影&#xff0c;以及电视节目等等。此外&#xff0c;iTunes还是管理数据的好帮手&#xff0c;用户可以通过iTunes备份管理自己手机上的数据…