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
相关推荐
姑苏风2 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
C吴新科3 小时前
MySQL入门操作详解
mysql
数据猎手小k6 小时前
AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。
android·人工智能·机器学习·语言模型
Ai 编码助手6 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
白云如幻6 小时前
MySQL排序查询
数据库·mysql
你的小106 小时前
JavaWeb项目-----博客系统
android
苹果醋36 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
风和先行7 小时前
adb 命令查看设备存储占用情况
android·adb
Frank牛蛙7 小时前
1.每日SQL----2024/11/7
数据库·sql