目录
一、函数分类
二、内置函数
单行函数-字符函数
1.length函数
2.concat、substr、upper、lower函数
3.instr函数
4.trim
5.lpad和rpad
6.replace
7.stuff
单行函数-数字函数
1.round函数
2.floor和ceil函数
3.truncate函数
4.mod函数
5.ceiling函数
单行函数-日期函数
1.now、curdate、curtime函数
2.获取指定部分的年、月、日、分钟、秒
3.str_to_date、date_format函数
4.字符串类型转日期类型
5.对日期类型操作
单行函数-其他函数
1.version、datebase、user函数
单行函数-流程控制函数
1.if函数
2.case函数
分组(聚集、聚合)函数
1.sum函数
2.avg函数
3.min函数
4.max函数
5.count函数
三、用户自定义函数
1.分类:标量值函数、表格值函数
2.标量值函数
3.表格值函数
1)内联-表格值函数
2)多-表格值函数
4.执行
5.修改
6.查看自定义函数源代码
数据库函数分为:内置函数、用户自定义函数。
内置的函数分为:单行函数、分组函数(又称统计函数、聚集函数、聚合函数)。
【单行函数又分为:字符函数、数学函数、日期函数、其他函数、流程控制函数】
select length(name) from 表名; //查询名字的长度
2.1 substr表示截取索引(含索引)(索引从1开始数)和后面全部字符
例子1:select substr('你好呀小朋友',4); //返回 ‘小朋友‘
例子2:select substr('你好呀小朋友',1,2) // 返回’你好‘
2.2 upper变大写,lower变小写
2.3 concat、substr、upper、lower例子
select concat(upper(substr(name,1,1)),lower(substr(name,2))) as 姓名 from 表名; ——“StEVEN” //如果name是sTEVEN
concat( 'ste' , 'ven') ——“steven”
返回子串第一次出现的索引(索引从1开始数),如果找不到返回0
例子:select instr('你好呀小朋友',’小朋友‘);//返回4
(1)trim
去除左右两边的空格或指定字符
select trim(' 张三 '); //返回张三
select trim('a' from 'aaaa张三aaa'); //返回张三
select trim ('s' from name) from 表名; //将返回所有记录的name属性去掉's'后的结果
返回结果
trim('s' from name)
even
jack
mike
ally
(2)ltrim
ltrim()——去除左边的空格 ——“steven ”
(3)rtrim
rtrim()——去除右边的空格 ——“ steven”
lpad用指定字符实现左填充指定长度
例子:select lpad('小霸王',10,’*‘); //返回'********小霸王''(用'*'在左边填充至总共10个字符)
rpad右填充
例子:select lpad(name,10,’ab‘) as result from 表名; //返回所有记录的name属性右边填充ab至总共10个字符
返回结果
result
stevenabab
jackababab
用参数三替换参数一中的参数二
例子1:select replace('你好呀小朋友','小朋友','大人'); //返回'你好呀大人'
例子2:select repalce(name,'even','老爷爷')as 替换结果 from 表名;
返回结果
替换结果
st老爷爷 【替换前是steven】
jack
mike
stuff(“一二三四五”,3,2,“ABCDE”) //源字符串——“一二三四五”,待插入字符串——“ABCDE”
/** 3代表从“源字符串”第3个字符之前(也就是'二'到'三')插入“待插入字符串”,2代表(从第3个字符之后,也就是‘三’之后)删除2个字符*/
步骤:
1) 在‘三’之后删2个。删除'四'、'五'
2) 在'二'到'三'之间插入,插入“ABCDE”
结果:
“一二ABCDE三”
四舍五入
例子1:select round(1.8);//返回2
例子2:select round(1.568,2);//第二个参数2表示小数点后保留2位,返回1.57
floor向下取整
例子:select floor(1.94); //返回1
ceil向上取整
例子:select ceil(1.02); //返回2
截断
例子:select truncate(1.6999,1); //第二个参数1表示小数点后保留1位小数,返回1.6
取余
例子:select mod(10,3); //和select 10%3;是一样的结果
select ceiling(3.1); //返回大于该数的最小整数,该数是整数就返回它自己。返回4
select now(); //返回当前系统的日期+时间
select curdate(); //返回当前的系统日期
select curtime(); //返回当前系统的时间
select year(now()); //返回2021
select month(now()); //返回2
select day(now()); //返回10
select minute(now()); //返回当前分钟数
select second(now()); //返回当前秒数
3.1 str_to_date:将指定格式的日期字符串转换成日期
%Y:四位的年份
%y:2位的年份
%m:月份(01、02、03....)
%c:月份(1、2、3....)
%d:日(01、02、03....)
%w 一个星期中的天数(0=sunday ……6=saturday )
%H:小时(24小时制)
%h:小时(12小时制)
%i:分钟
%s:秒
例子1:select str_to_date(‘5-30 1995’,'%m-%d %Y'); //返回日期1995-05-30
例子2:select str_to_date('5-30 1995 14-05-21','%m-%d %Y %H-%i-%s'); //返回日期+时间1995-05-30 14:05:21
3.2 date_format:将日期转换成指定格式的字符串
例子1:select date_format(now(),'%Y年%m月%d日'); //返回2021年2月10日
数据库有这几种日期日期类型:
DATE --仅包含日期值(如:"2022-07-01")
TIME --仅包含时间值(如:"15:30:00")
DATETIME --同时包含日期和时间值(如:"2022-07-01 15:30:00")
TIMESTAMP --同时包含日期和时间值,但范围更广(支持1970年1月1日以后的任何日期时间)
date('2022-4-15 12:30:48') //将转为2022-04-15格式的DATE类型
获取year、month、day:year(日期类型)、month(日期类型)、day(日期类型)
加减时间:
ADDDATE(date,interval expr type)
DATE_ADD(date,interval expr type)
SUBDATE(date,interval expr type)
DATE_SUB(date,interval expr type)
adddate('2022-4-15 13:30:28',interval '3 1:2' day_minute);2022-04-18 14:32:28
adddate('2022-4-1',interval 5 day);2022-04-06
select version(); //查询数据库版本
select database(); //查询当前use的database
select user(); //查询当前使用数据库的用户
select now(); //查询当前时间(日期+时间)
语法:if( 判断语句返回boolean,输出1【true】,输出2【false】);
例子:select id,name,if( id<=2,'id小于等于2','id大于2') as 备注 from 表名;
返回结果:
id ——name——备注
1——steven——id小于等于2
2 ——Jack—— id小于等于2
3 ——mike—— id大于2
4 ——Sally—— id大于2
语法:
case 要判断的字段或表达式
when 常量1或条件1 then 要显示的值或语句1
when 常量2或条件2 then 要显示的值或语句2
.....
else 要显示的值n或语句n //如果没有else的情况就省略else
end
例子1:
题目要求:判断id,要求id为1时显示“我是”+学生姓名,id为3时显示“我的名字叫”+姓名,id为其他则显示"my name is"+姓名。
select id,
case id
when 1 then concat('我是',name)
when 3 then concat('我的名字叫',name)
else concat(''my name is",name)
end
as 个人介绍 from 表名;
返回结果
id ——个人介绍
1 ——我是steven
2 ——my name is jack
3 ——我的名字叫mike
4 ——my name is sally
例子2:
查询学生的id、姓名和分组。分组如下:如果1
select id,name
case
when id>=1 and id
when id=3 then 'B组'
else 'C组'
end
as 小组 from 表名;
返回结果
id——name——小组
1——steven ——A组
2 ——jack ———A组
3 ——mike ——--B组
4 ——sally ——--C组
sum、avg、min、max、count函数
1)共同点:都忽略null值;
2)可以和distinct搭配使用
例子1:select sum(distinct age) from 表名;
例子2:select count(distinct age) from 表名;
求和
例子:select sum(age) from 表名; //忽略null值,null不参与运算
求平均值
例子:select avg(age) from 表名; //忽略null值,如果有一个人age为null,则共四个人只除以3
求最小值
例子:select min(age) from 表名;
求最大值
例子:selectmax(age) from 表名;
统计个数
例子:select count(name) from 表名; //返回4,说明一共有4个人(需要说明的是如果name中有含 null的人,则不统计。比如说4个人中有一个name为null,则count(name)只返回3)
补充说明:
count函数还用count(*)来统计行数,即使个别字段含有null,都能统计上,只要存有一个字段不为null就行,如:select count(*) from 表名;
#注意:count(*)和count(1)是一样,都统计包含null在内的所有列;count(列名)统计不包含null值的列
1.作用
分析分组查询出的每一组数据
聚合函数用group by分组,每个分组返回一个统计值;
开窗函数采用partition by 分组,每个分组、每一行,都可以返回一个统计值
3,.语法
分析函数名() OVER(分析子句)
分析函数:
可以是:聚合函数、ROW_NUMBER、RANK、DENSE_RANK、LAG、LEAD、first_value、last_value
开窗函数:
OVER(分析子句)
分析子句:
分析子句则指定了分组的规则和排序的方式
内容是:【分组】partition by xxxxxxx 【排序】order by xxxxxx 【窗口】rows between 参数1 and 参数2
窗口子句不能单独出现,必须有order by 子句时才能出现。而出现order by 子句的时候,不一定要有窗口子句
关于【窗口】rows between后面跟的参数可以是:
current row:当前行
n preceding:往前统计n行
unbounded preceding:不限往前的范围
n following:往后统计n行
unbounded following:不限往后的范围
定义:RETURNS 子句返回一种标量数据类型
Create function 函数名(传入参数名1 参数类型1,传入参数名2 参数类型2)
Returns 返回值数据类型
As
begin
SQL语句 Return 返回的一个变量或值
End
分类:内联表格值函数(内嵌表值函数、行内函数)、多句表格值函数(多语句函数)
定义:
Create function 函数名(传入参数名1 参数类型1,传入参数名2 参数类型2)
Returns Table
As
Return (一条sql语句)/**查询出来是多条记录,即一张表,即table*/
修改:
alter function 函数名(参数)
returns table
as
return (修改后的一条SQL语句)
select * from 自定义函数名(参数值1,参数值2);
语法:alter function 属性;
属性有哪些?
NO SQL ——不含SQL
CONTAINS SQL ——含 SQL,不读、写数据
READS SQL DATA ——要读
MODIFIES SQL DATA ——要写
SQL SECURITY { DEFINER |INVOKER } ——指明谁有权限执行
- DEFINER——只有定义者能执行
- INVOKER——调用者都可以执行
COMMENT '注释内容'——添加注释信息
exec sp_helptext '函数名';