一,变量
Sql本质是一种编程语言,需要很多的变量来保存数据,mysql中很多的属性控制都是通过mysql中固有的变量来实现的。
1.系统变量
系统内部定义的变量,系统变量针对所有的用户有效。(全局变量)
查看系统变量:
show variables like ‘XXX’
Mysql中允许用于使用select 查询变量数据值(系统变量)
基本语法: select @变量名;
修改系统变量:分为两种方式
- 局部修改:(会话级别)只针对当前自己客户端当次连接有效
Set 变量名 = 新值;
2.全局修改:针对所有客户端,所有时刻都有效
Set global 变量名 = 新值;
全局修改之后,所有连接的客户端并没有发生变化,全局修改只针对新客户生效。
如果想要本次连接对应的变量有效,不能使用全局修改,只能使用会话级别修改。
2.会话变量
会话变量也称之为用户变量,会话变量跟mysql客户端是绑定的,设置的变量只针对当前用户使用的客户端生效。
定义会话变量 set @变量名=值;
在mysql中因为没有比较符号 ==,所以是用=代替比较符号,有的时候在赋值的时候就会报错,mysql为了避免系统分不清是赋值还是比较,所以特定增加了一个变量的赋值符号:=
Set @变量名:=值;
Mysql是专门存储数据的,允许将数据从表中取出存储到变量中,查询得到的数据必须只能是一行数据,一个变量对应一个字段,mysql没有数组概念。
- 赋值且查赋值过程 :select @变量1=字段1,@变量2= 字段2….from 数据表 where.....
- 只赋值不看过程:select字段1,字段2….from 数据源 where …into @变量1,@变量2….
select @name=stu_name,@age=age from my_student limit 1;
我们发现结果都为null,肯定不符合,是因为使用了=号,系统会当作比较符号处理,需要使用:=
select @name:=stu_name,@age:=age from my_student limit 1;
select stu_name,age from my_student ORDER BY heigh DESC LIMIT 1 into @name,@age;
select @name,@age;
二,内置函数
函数
在mysql中,函数分为两类,系统函数(内置函数)和自定义函数。
不管是内置函数还是用户自己定义的函数,都是使用select 函数名(参数列表)调用
1.字符串函数
Char_length(); 判断字符串的字符数
Length(); 判断字符串的字节数
Concat(); 字符串拼接
Instr(); 判断字符串在目标字符串中是否存在,如果存在返回其位置,如果不存在返回0
Lcase(); 全部小写
Left(); 从左侧指定位置开始截取字符串,截取的长度由第二个参数规定
LTrim(); 去掉左侧空格
Mid(); 从中间截取,如果不指定长度,直接截取到最后 共有3个参数 1.指定的字符串 2.从哪里开始截取 3.截取长度
select CHAR_LENGTH('你好中国'),LENGTH('你好中国');
select CONCAT('你好','中国');
select INSTR('你好中国','中');select INSTR('你好中国','嘿');
select LCASE('aBcD');
select LEFT('你好中国',2);
select MID('你好中国',1,1);
select LTRIM(' a bcd ');
2.时间函数
Now(); 返回当前时间日期
Curdate(); 返回当前日期
Curtime(); 返回当前时间
Datediff(); 判断两个日期时间的天数差距,参数日期必须使用字符串格式,越靠近现在的时间则表示越大,那么在计算日期天数的时候,有可能出现负数。
From_unixtime(); 根据时间毫秒数转换成时间
select NOW(),CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP;
select DATEDIFF('2022-08-01','2022-12-31');
select FROM_UNIXTIME('1999999999');
3.数学函数
Abs(); 绝对值
Ceiling(); 向上取整
Floor(); 向下取整
Pow(); 求指数 谁的多少次方
Rand(); 0-1求随机数
Round(); 四舍五入
select ABS(-1),CEILING(1.1),FLOOR(1.7),POW(2,4),RAND(),ROUND(1.5);
4.其他函数
Md5(); 对数据进行加密,MD5的加入与其他任何地方的md5加密出来的内容是一样的。
Version(); 获取版本号
Database(); 显示当前数据库
UUID(); 生成一个唯一标识符(类似于自增长)自增长是单表唯一,UUID是全库唯一,数据唯一同时空间唯一。
select MD5('123456');
select VERSION();
select database();
select UUID();
三,自定义函数
概念:用户自己定义的函数
函数:实现某种功能的语句块,可能由多条语句构成。
函数内部的每条指令都是一个独立的个体,需要符合语句定义规范,需要语句结束符,(分号),函数又是一个整体,而且函数是在调用的时候才会被执行,那么当设计函数的时候,意味着整体不能中断,与分号矛盾了,mysql中一旦见到语句结束符,那么就开始自动自行。
解决矛盾:在定义函数之前,尝试修改语句结束符,用临时的语句结束符
基本语法:delimiter
修改临时语句结束符: delimiter $$; 使用系统非内置即可 一般使用$$
中间是正常的sql指令,使用分号结束,系统不会执行,因为不认识分号
使用新的符号 进行数据操作
修改回来语句结束符 delimiter ;
1.创建函数
自定义函数包含几个要素:function 关键字 函数名 参数(形参、实参) 确认函数的返回值 函数体 返回值
基本语法:
修改语句结束符 $$
Create function 函数名(参数) returns 返回值类型
Begin
//函数体
End
语句结束符 $$
修改语句结束符 改回来
并不是所有的函数都需要begin和end,如果函数本身只有一条指令,return,那么可以省略begin和end
delimiter $$
create FUNCTION my_fun1() returns int
BEGIN
return 10;
end
$$
delimiter ;
create FUNCTION my_fun2() returns int return 100;
delimiter $$
create FUNCTION my_fun3(int_1 int,int_2 int) RETURNS int
begin
return int_1+int_2;
end
$$
delimiter ;
select my_fun3(1,1);
2.调用函数
自定义函数的调用方式与内置函数调用方式一致,select 函数名(实参列表);
3.查看函数
可以通过查看function状态,查看所有函数
show FUNCTION STATUS like 'my_%';
查看函数的创建语句
show create FUNCTION my_fun1;
4.删除函数
Drop function 函数名;