MySQL高级SQL语句补充

目录

[1.空值(NULL)和 无值(' ')的区别](#1.空值(NULL)和 无值(' ')的区别)

2.正则表达式

3.存储过程

存储过程的优点

创建存储过程

调用存储过程

查看存储过程

存储过程的参数

[IN 输入参数](#IN 输入参数)

[OUT 输出参数](#OUT 输出参数)

[INOUT 输入输出参数](#INOUT 输入输出参数)

删除存储过程

存储过程的控制语句

1.条件语句if-then-else

[2.循环语句while ···· end while](#2.循环语句while ···· end while)

脚本实现一次性创建10万个文件


1.空值(NULL)和 无值(' ')的区别

  1. 无值的长度为 0,不占用空间的;而 NULL 值的长度是 NULL,是占用空间的。
  2. IS NULL 或者 IS NOT NULL,是用来判断字段是不是为 NULL 或者不是 NULL,不能查出是不是无值的。
  3. 无值的判断使用=''或者<>''来处理。<> 代表不等于。
  4. 在通过 count()指定字段统计有多少行数时,如果遇到 NULL 值会自动忽略掉,遇到无值会加入到记录中进行计算。
bash 复制代码
select length(null), length(' '), length('1');
#显示字符串长度

select * from city where name is null;
#显示为null值的值

select * from city where name is not null;
#显示除了null以外的所有值

select * from city where name = '';
#显示为空值的值

select * from city where name <> '';
#显示不等于空值的值

select count(*) from city;
#显示所有数据的总和

select count(name) from city;
#显示所有数据总和除了不要null值

总结:

  • 空值null 的长度为 NULL ,占用空间;可以通过 字段 is null 或 字段 is not null 判断是否为null行;count(字段) 会忽略 null 行
  • 无值'' 的长度为 0 ,不占用空间;可以通过 字段 = '' 或 字段 <> '' 判断是否为无值的行;count(字段) 不会忽略 无值 的行

2.正则表达式

描述 匹配模式 实例
^ 匹配文本的开始字符 '^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
\^... 匹配不在括号中的任何字符 '\^ab' 匹配不包含 a 或者 b 的字符串
{n} 匹配前面的字符串 n 次 'g{2}' 匹配含有 2 个 g 的字符串
{n,m} 匹配前面的字符串至少 n 次,至多m 次 'f{1,3}' 匹配 f 最少 1 次,最多 3 次

语法:

bash 复制代码
select "字段" from "表名" where "字段" regexp {模式};

3.存储过程

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

存储过程的优点

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

创建存储过程

  1. 修改SQL语句结束符 delimiter $$
  2. 创建存储过程 use 库名 create procedure 存储过程名() begin SQL语句序列; end$$
  3. 把结束符改回分号 delimiter ;
  4. 调用存储过程 call 存储过程名;
bash 复制代码
DELIMITER $$                  #将语句的结束符号从分号;临时改为两个$$(可以是自定义)
CREATE PROCEDURE Proc()	      #创建存储过程,过程名为Proc,不带参数
-> BEGIN                      #过程体以关键字 BEGIN 开始
-> select * from Store_Info;  #过程体语句
-> END $$                     #过程体以关键字 END 结束
DELIMITER ;                   #将语句的结束符号恢复为分号

调用存储过程

bash 复制代码
call proc;

查看存储过程

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

show create procedure proc;
show procedure status like '%proc%' \G;

存储过程的参数

IN 输入参数

  • 表示调用者向过程传入值(传入值可以是字面量或变量)
bash 复制代码
delimiter $$
create procedure proc1(in inname char(16))
-> begin
-> select * from store_info where store_name = inname;
-> end $$
delimiter ;

call proc1('Boston');

OUT 输出参数

  • 表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)

INOUT 输入输出参数

  • 既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
bash 复制代码
create procedure 存储过程名(in 传入参数名 参数数据类型, out 传出参数名 参数数据类型)
begin
select 字段 into 传出参数 from 表 where 字段 = 传入参数;
end$$

call  存储过程名(参数值|@变量名; @变量名);
#传入参数指定的值可以是纯量值,也可以是变量名;传出参数指定的值只能是变量名

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

set @变量名 = 传入的值;      #设置传入的值
call 存储过程名(@变量名);    #传入传出参数指定的值只能是变量名
select @变量名;              #查看传出的值

删除存储过程

  • 存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。如果要修改存储过程的名称,可以先删除原存储过程,再以不同的命名创建新的存储过程。
bash 复制代码
DROP PROCEDURE IF EXISTS Proc;
#仅当存在时删除,不添加 IF EXISTS 时,如果指定的过程不存在,则产生一个错误

存储过程的控制语句

bash 复制代码
create table t (id int(10));
insert into t values(10);

1.条件语句if-then-else

bash 复制代码
DELIMITER $$  
CREATE PROCEDURE proc2(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 Proc2(6);

2.循环语句while ···· end while

bash 复制代码
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;

脚本实现一次性创建10万个文件

bash 复制代码
delimiter $$
create procedure proc7 ()
begin
declare i int;
set i = 1;
create table test03 (id int primary key auto_increment, name varchar(20));
while i <= 100000
do insert into test03 (name) values (concat ('student', i));
set i = i + 1;
end while;
end$$
delimiter ;
call proc7
相关推荐
aaajj1 小时前
【Android】获取设备音频
android
向夏威夷 梦断明暄2 小时前
基于Tez引擎的 Hive SQL 性能优化
hive·sql·性能优化
Mico182 小时前
MySQL 8.0.35 主从延迟模拟与解决
mysql
清泓y2 小时前
UE移动开发技术面试题
android·面试·ue5·ue4·游戏程序
DevRen2 小时前
Compose Snapshot 系统详解
android
不知疲倦的仄仄2 小时前
MySQL/Read View快照/MVCC/串行化
java·数据库·mysql
Mico183 小时前
MySQL 5.7.35 升级到 8.0.35 — 原地升级(主从架构方式)
mysql
万亿少女的梦1685 小时前
基于Spring Boot的乐助在线助农系统设计与实现
java·spring boot·mysql·敏感词过滤·助农系统
艾莉丝努力练剑5 小时前
【MYSQL】MYSQL学习的一大重点:基本查询(下)
android·数据库·学习·mysql·面试·八股文
三少爷的鞋5 小时前
Android 中coroutineScope 和 supervisorScope 到底怎么选?先搞清楚 Exception 和 Result
android