MySQL高级语句(第二部分)
- MySQL高级语句(第二部分)
- 一、视图表 create view
- 1、视图表概述
- 2、视图表能否修改?(面试题)
- 3、基本语法
- 3.1 创建
- 3.2 查看
- 3.3 删除
- 4、通过视图表求无交集值
- 二、case语句
- 三、空值(null) 和 无值(’ ') 的区别
- 四、正则表达式
- 五、存储过程
- 1、简介
- 2、存储过程的优点
- 3、创建存储过程的步骤
- 4、存储过程相关命令
- 4.1 创建存储过程
- 4.2 调用存储过程
- 4.3 查看存储过程
- 4.4 删除存储过程
- 5、存储过程的参数
- 5.1 in
- 5.2 out
- 5.3 inout
- 6、存储过程的控制语句
- 6.1 条件语句if-then-else...end if
- 6.2 循环语句while .... end while
MySQL高级语句(第二部分)
一、视图表 create view
1、视图表概述
视图,可以被当作是虚拟表或存储查询。
视图跟表格的不同是,表格中有实际储存数据记录,而视图是建立在表格之上的一个架构,它本身并不实际储存数据记录。
临时表在用户退出或同数据库的连接断开后就自动消失了,而视图不会消失。
视图不含有数据,只存储它的定义,它的用途一般可以简化复杂的查询。
比如你要对几个表进行连接查询,而且还要进行统计排序等操作,写sql语句会很麻烦的,用视图将几个表联结起来,然后对这个视图进行查询操作,就和对一个表查询一样,很方便。
2、视图表能否修改?(面试题)
视图表保存的是select语句的定义,视图表的表数据能否修改,视情况而定font>。
如果 select 语句查询的字段是没有被处理过的源表字段,则可以通过视图表修改源表数据;
如果select 语句查询的字段是被 group by语句或 函数 处理过的字段,则不可以直接修改视图表的数据。
create view v_store_info as select store_name,sales from store_info;
select * from v_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;
select * from v_sales;
update v_sales set store_name='xxxx' where store_name='Los Angeles';

3、基本语法
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;
#创建视图表
show tables;

3.2 查看
语法:select * from 视图表名;
select * from v_region_sales;

3.3 删除
语法:drop view 视图表名;
drop view v_region_sales;

4、通过视图表求无交集值
create view 视图表名 as select distinct 字段 from 左表 union all select distinct 字段 from 右表;select 字段 from 视图表名 group by 字段 having count(字段)=1;
#先建立视图表
create view v_union as select distinct store_name from location union all select distinct store_name from store_info;
#合并两个表的store_name字段
select * from v_union;

#再通过视图表求无交集
select store_name from v_union group by store_name having count(*)=1;
#直接从v_union中调用select语句,优化SQL语句

二、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 2000else 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 值会自动忽略掉,遇到无值会加入到记录中进行计算。
create table city (id int,name varchar(20));
insert into city values (1,'beijing'),(2,'nanjing'),(3,'tianjing');
insert into city values (4,'');
insert into city values (5,'wuhan');
insert into city (id) values (6);
insert into city values (7,'shanghai');
insert into city (id) values (8);
insert into city values (9,'jiuquan');
select * from city;

select * from city where name is null;
select * from city where name is not null;
#判断字段是不是为 null 或者不是 null

select * from city where name = '';
select * from city where name != '';
#判断无值

select * from city where name <> '' or name is null;
#显示空值

select count(name) from city;
# NULL值会自动忽略掉,无值会加入到记录中
select count(*) from city;
#null值和无值都会加入到记录中

四、正则表达式
语法: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 | ‘clo’ 匹配含有 clo 的字符串 |
| […] | 匹配字符集合中的任意一个字符 | ‘[abc]’ 匹配 a 或者 b 或者 c |
| [^…] | 匹配不在括号中的任何字符 | [^ a b] 匹配不包含 a 或者 b 的字符串 |
| {n} | 匹配前面的字符串 n 次 | ‘g{2}’ 匹配含有 2 个 g 的字符串 |
| {n,m} | 匹配前面的字符串至少 n 次,至多m 次 | ‘f{1,3}’ 匹配 f 最少 1 次,最多 3 次 |
举例
select * from store_info where store_name regexp '^[a-g]';
#匹配以字母a-g开头的数据记录

select * from store_info where store_name regexp 'Hou+';
#至少出现一次Hou

select * from store_info where store_name regexp 'os';
#匹配包含字符串os的数据记录

select * from store_info where store_name regexp 'ho|bo';
select * from store_info where store_name regexp 'Ho|Bo';
#匹配store_info表中包含ho或者bo的数据记录

select * from store_info where store_name regexp 'b{1}';
#匹配出现一次字母b的

五、存储过程
存储过程也叫做数据库脚本(MySQL脚本,SQL脚本)
1、简介
存储过程是一组为了完成特定功能的sql语句集合。
存储过程在使用过程中是将常用或者复杂的工作预先使用sql语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。存储过程在执行上比传统sql速度更快、执行效率更高。
2、存储过程的优点
(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
(2)sql语句加上控制语句的集合,灵活性高
(3)在服务器端存储,客户端调用时,降低网络负载
(4)可多次重复被调用,可随时修改,不影响客户端调用
(5)可完成所有的数据库操作,也可控制数据库的信息访问权限
3、创建存储过程的步骤
1)先修改SQL语句结束符
delimiter $$
2)创建存储过程
3)把结束符改回分号
delimiter ;
4)调用存储过程
call 存储过程名;
4、存储过程相关命令
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 $$
create procedure proc1()
begin
create table kkk2 (id int,name varchar(10),age int,sex char(2),primary key (id));
insert into kkk2 values (1,'xx',11,'男');
insert into kkk2 values (2,'yy',22,'女');
insert into kkk2 values (3,'zz',33,'男');
insert into kkk2 values (4,'ww',44,'男');
select * from kkk2;
end $$delimiter ;
show tables;

4.2 调用存储过程
call 存储过程名;
call proc1;
#调用存储过程,才能看到创建的表和表数据
show tables;

4.3 查看存储过程
show create procedure [数据库.]存储过程名;
#查看某个存储过程的具体信息show create procedure 存储过程名\G;show procedure status [like '%存储过程名%'] \G;
#模糊匹配查看

4.4 删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。
语法
drop procedure if exists 存储过程名;
#仅当存在时删除
#不添加 if exists 时,如果指定的过程不存在,则报错

5、存储过程的参数
| 参数 | 功能 |
|---|---|
| in 输入参数 | 表示调用者向过程传入值(传入值可以是字面量或变量) |
| out 输出参数 | 表示过程向调用者传出值(可以返回多个值)(传出值只能是变量) |
| inout 输入输出参数 | 既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量,传入传出值必须是同一数据类型) |
5.1 in
delimiter $$
create procedure proc1(in in_name char(16)) begin select * from store_info where store_name = in_name;end $$
delimiter ; call proc1('boston');
call proc1('huston');
call proc1('Los Angeles');
#调用存储过程proc1,会根据变量的值,返回目标在表数据中对应的数据
#in_name为自定义变量名

5.2 out
基本格式delimiter $$
create procedure 存储过程名(in 传入参数名 传入参数数据类型,out 传出参数名 传出参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=传入参数名;
end $$
delimiter ;call 存储过程名(参数值,@变量名)
#传出参数的值只能用变量获取
#举个例子delimiter $$
create procedure proc2(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 proc2('Houston', @out_sales);
select @out_sales;

5.3 inout
基本格式delimiter $$
create procedure 存储过程名(into 参数名 参数数据类型)
begin
select 字段 into 传出参数名 from 表名 where 字段=参数名;
end $$
delimiter ;set @变量名 传入值
#变量赋值,传入值
call 存储过程名(@变量名)
#传入传出参数的值只能用变量
select @变量名
#此时变量内容应该为传出值
delimiter $$
create procedure proc3(inout insales int)
begin
select count(sales) into insales from store_info where sales < insales;
end $$
delimiter ;
set @inout_sales=1000;
call proc3(@inout_sales);
select @inout_sales;#创建了一个名为 proc4 的存储过程
#存储过程接受一个输入输出参数 insales,并通过查询 store_info 表获取 sales 值小于 insales 的记录数量,并将结果存储到参数 insales 中。
#通过 call 语句调用该存储过程,并使用 select 语句查看存储在变量 @inout_sales 中的值。

6、存储过程的控制语句
create table t (id int(10));
insert into t values(10);
6.1 条件语句if-then-else…end if
if 条件表达式 thenSQL语句序列1
elseSQL语句序列2
end if;
delimiter $$
create procedure proc4(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 proc4(6);
#pro=6

#举例
delimiter $$
create procedure proc5(in input_age int)
begin
if input_age > 30 then
update kkk2 set sex = '女' where age > 30;
else
update kkk2 set sex = '男' where age <= 30;
end if;
end $$delimiter ;
select * from kkk2;
call proc5(33);
select * from kkk2;
call proc5(22);
select * from kkk2;

6.2 循环语句while … end while
while 条件表达式
doSQL语句序列set 条件迭代表达式;
end while;
create table t1 (id int);delimiter $$
create procedure proc6()
begin
declare i int(10);
set i=0;
while i<6 do
insert into t1 values(i);
set i=i+1;
end while;
end $$ delimiter ;call proc6;
select * from t1;

举例:
#创建一张表,有一万条数据
#id name
#1 student1
#2 student2
delimiter $$
create procedure proc7()
begin
declare i int;
set i=1;
create table t2 (id int ,name varchar(20));
while i<=10000 do
insert into t2 values(i,concat('student',i));
set i=i+1;
end while;
end $$ #student+学号做拼接
delimiter ;call proc7;
select * from t2;

相关文章:
MySQL高级语句(第二部分)
MySQL高级语句(第二部分)一、视图表 create view1、视图表概述2、视图表能否修改?(面试题)3、基本语法3.1 创建3.2 查看3.3 删除 4、通过视图表求无交集值 二、case语句三、空值(null) 和 无值(’ ) 的区别四、正则表达式五、存储过程1、简介…...
HTML计时事件(JavaScript)网页电子钟+网页计时器
setTimeout("函数","未来指定毫秒后调用函数"); clearTimeout(setTimeout("函数","未来指定毫秒后调用函数")); <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title>…...
使用群晖实现Videostation电影的大容量存储及分享教程
文章目录 1.使用环境要求2.制作视频分享链接3.制作永久固定视频分享链接 李哥和他的女朋友是一对甜蜜的情侣,但不幸的是,由于工作原因,他们目前分隔两地,无法常常亲密相伴。 这个距离让李哥特别怀念和女朋友一起在电影院观看电影的…...
后端大厂面试-15道题
1. 说说计算机存储结构 计算机存储结构通常包括这几个层次: 主存储器(Main Memory):也称为内存(RAM,Random Access Memory),主要用于存储当前正在执行的程序和数据。它是计算机中最…...
C++: 冒泡排序(Bubble Sort)
假设你有一列由数字组成的玻璃珠,这些珠子的重量不同,你希望将它们按照重量从轻到重排列。你会这样做: 从左到右,比较相邻的两颗珠子的重量。如果左边的珠子比右边的珠子重,就交换它们的位置。然后,继续向…...
跨域的解决方案
文章目录 概念一、什么是跨域问题二、为什么会发生跨域问题三、跨域解决方案1、JSONP2、添加响应头3、Spring注解CrossOrigin4、配置文件(常用)5、nginx跨域 概念 一、什么是跨域问题 前端调用的后端接口不属于同一个域(域名或端口不同&…...
如何使用Java语言判断出geek是字符串参数类型,888是整数参数类型,[hello,world]是数组参数类型,2.5是双精度浮点数类型?
如何使用Java语言判断出geek是字符串参数类型,888是整数参数类型,[hello,world]是数组参数类型,2.5是双精度浮点数类型? Java是一种静态类型的编程语言,这意味着我们需要在编译时为变量指定具体的类型。但是ÿ…...
9.20华为机试-后端
1、丢失报文的位置 某通信系统持续向外发送报文,使用数组 nums 保存 n个最近发送的报文,用于在报文未达到对端的情况下重发。报文使用序号 sn 表示,序号 sn 按照报文发送顺序从小到大排序,相邻报文 sn 不完全连续且有可能相同。报…...
LC926. 将字符串翻转到单调递增(JAVA - 动态规划)
将字符串翻转到单调递增 题目描述动态规划 题目描述 难度 - 中等 LC926. 将字符串翻转到单调递增(JAVA - 动态规划) 如果一个二进制字符串,是以一些 0(可能没有 0)后面跟着一些 1(也可能没有 1)的形式组成的࿰…...
【高阶数据结构】哈希的应用 {位图;std::bitset;位图的应用;布隆过滤器;布隆过滤器的应用}
一、位图 1.1 位图概念 面试题 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。【腾讯】 遍历查找:内存中无法存放40亿个整数(约占内存15-16G);时间复杂…...
金融生产存储亚健康治理:升级亚健康 3.0 ,应对万盘规模的挑战
随着集群规模的不断扩大,硬盘数量指数级上升,信创 CPU 和操作系统、硬盘多年老化、物理搬迁等多种复杂因素叠加,为企业的存储亚健康管理增加了新的挑战。 在亚健康 2.0 的基础上,星辰天合在 XSKY SDS V6.2 实现了亚健康 3.0&#…...
C语言自定义类型讲解:结构体,枚举,联合(2)
🐵本篇文章将会对位段、枚举和联合的相关知识进行讲解 1. 位段📚 1.1 什么是位段 位段的声明和结构体类似,但是有两点不同: 1.位段的成员必须是int,unsigned int,signed int (C99之后也可以是其他成员&am…...
AI编程助手 Amazon CodeWhisperer 全面解析与实践
目录 引言Amazon CodeWhisperer简介智能编程助手智能代码建议代码自动补全 提升代码质量代码质量提升安全性检测 支持多平台多语言 用户体验和系统兼容性用户体验文档和学习资源个性化体验系统兼容性 功能全面性和代码质量功能全面性代码生成质量和代码安全性 CodeWhisperer的代…...
利用EXCEL进行XXE攻击
利用EXCEL进行XXE攻击 原因 原因 Microsoft Office从2007版本引入了新的开放的XML文件格式,新的XML文件格式基于压缩的ZIP文件格式规范,由许多部分组成。 我们可以将其解压缩到特定的文件夹中来查看其包含的文件夹和文件,可以发现其中多数是…...
芯片验证就是一次旅行
如果你国庆希望去一个你不曾去过的城市旅行,比如“中国苏州”。对游客来说,它是个蛮大的城市,有许多景点可以游玩,还有许多事情可以做。但实际上,即使最豪也最清闲的游客也很难看苏州的所有方方面面。同样的道理也适用…...
Java深入理解线程的三大特性
目录 1 CPU缓存导致可见性问题2 线程切换导致原子性问题3 性能优化导致有序性问题4 JMM(Java Memory Model)5 volatile6 synchronized 1 CPU缓存导致可见性问题 线程的三大特性: 可见性:Visibility有序性:Ordering原子性:Atomic…...
2025快手校招面试真题汇总及其解答(二)
6. hashmap数据结构 HashMap 是一种散列表,它是一种根据键值对来存储数据的数据结构。HashMap 的特点是插入、查找和删除操作的时间复杂度都是 O(1),因此它是一种非常高效的数据结构。 HashMap 的工作原理是将键值对存储在一个数组中,每个键值对都由一个哈希函数来映射到数…...
PHP生成带中文的图片
imagettftext() 函数是 PHP 中的一个内置函数,用于使用 TrueType 字体将文本写入图像。 句法: 数组imagettftext(资源$image,float $size,float $angle, int $x,int $y,…...
java框架-Dubbo
Dubbo整合Springboot BIO NIO Netty Dubbo 原理 在这里插入图片描述...
Vue+iview 组件中通过v-for循环动态生成form表单进行表单校验
在做项目时,需要根据需要动态添加或新增表单,同时还需要对表单做校验。详情如下图: 刚开始做表单验证的时候,对于这个动态的表单验证有点难搞,试了好几种方法都没有搞定。最后按照下面这种方法实现了,以此…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
