MySQL 函数
1.函数
概念 类似于Java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名。 好处 1、隐藏了实现细节。 2、提高了代码的重用性。 调用 select 函数名(实参列表)【from 表】。from 表 根据需要可加可不加,如果函数的参数列表中用到表中的字段,那么就需要加上。 特点 ①叫什么(函数名)②干什么(函数功能) 分类 ①单行函数 如concat、length、ifnull等等。②分组函数 功能:做统计使用,又称为统计函数、聚合函数、组函数。
2.单行函数
2.1字符函数
2.1.1 LENGTH
length 获取参数值的字节 个数。 SELECT LENGTH(“mysql”); 结果为5。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c74579be2dec4ef89660d78bebdb7074.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) SELECT LENGTH(“mysql最牛”); 结果为11。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f1b33097d64346dca62c9b87bcb1edff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 补充,SHOW VARIABLES LIKE '%char%' 查看当前客户端的字符集。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/ca62521138984820a1377629f549cd71.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 在UTF8字符集中一个字母占用1个字节空间,一个汉字占用3个字节空间。所以mysql占5个字节空间大小,mysql最牛占用11个字节空间大小。
2.1.2 CONCAT
拼接 字符串。 例一,拼接employees表中的姓和名,姓和名之间用_连接; ![在这里插入图片描述](https://img-blog.csdnimg.cn/273e39503e1b4b249af81c09abc39ac7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.1.3 UPPER && LOWER
UPPER将小写转大写。 LOWER将大写转小写。 例一:将mysql转大写; ![在这里插入图片描述](https://img-blog.csdnimg.cn/2774320542744da092bda655c56c9cfa.png) 例二:将MYSQL转小写; ![在这里插入图片描述](https://img-blog.csdnimg.cn/f424db6b4a494117b9a6961744416b6a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例三:拼接employees表中的姓和名,姓大写,名小写。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/0a9e36e3764646898901d989ed58330e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 在例三中我们发现,函数中可以嵌套函数,也就说一个函数的返回值可以作为另一个函数的参数。
2.1.4 SUBSTR / SUBSTRING
注意: 在MySQL字符串中索引是从1开始的。 1)SUBSTR(str,pos); 截取从指定索引处后面的字符,从字符串中第pos个字符开始往后分割作为结果返回。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e5f9898ceb1346f3a9802e7e94ff8041.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 2)SUBSTR(str,pos,len); 截取从指定索引处指定字符长度的字符。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2ff78a6028fa4567931b4c87a1abc435.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例题:姓名中首字符大写,其他字符小写然后用_拼接,显示出来。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/e8401afe053943aa91c9b1f4a3997e54.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.1.5 INSTR
INSTR 返回字符串中第一次出现的索引位置的下标,如果没有则返回0; ![在这里插入图片描述](https://img-blog.csdnimg.cn/53f8ccf4b807422da90fd92c1577e8d9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.1.6 TRIM
TRIM(str); 去掉str字串左右的空格。 TRIM(str1 FROM str2); 去掉str2字串左右的所有的str1字串,只去左右,如果str中包含str1,str2不做改变。 TRIM(str); ![在这里插入图片描述](https://img-blog.csdnimg.cn/e36af84b33544badb33b1a45d212e2a6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) TRIM(str1 FROM str2); ![在这里插入图片描述](https://img-blog.csdnimg.cn/5f7422c5766048079b60d4789786b4f9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.1.7 LPAD && RPAD
LPAD 用指定的字符实现左填充指定长度,如果指定长度比给字符串长度小,那么从左开始截断。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c4f2947a3226412d81cec51f7d0c5523.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/45259b3391c146bbaf185ca1a222bfd9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
RPAD 用指定的字符实现右填充指定长度,如果指定长度比给字符串长度小,那么也从左开始截断。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/9b405d7b6c2d4c4199b97628c5716052.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/aa9c2e23867d44c8afd9e5907334f307.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.1.8 REPLACE
REPLACE(str,from_str,to_str) 用to_str替换str中的所有from_str; ![在这里插入图片描述](https://img-blog.csdnimg.cn/09d2cd934fcc4500907a6691aa1069c7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.2 数学函数
2.2.1 ROUND
ROUND 四舍五入 ROUND(X) ,对X四舍五入(取整)。 ROUND(X,D) ,X小数点后保留D位,同时四舍五入。 ROUND(X) ![在这里插入图片描述](https://img-blog.csdnimg.cn/a63b37a025604f09962784b8454cf199.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) ROUND(X,D) ![在这里插入图片描述](https://img-blog.csdnimg.cn/2cb0b0d704a4432cbb45bd96bbfd3ae3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.2.2 CEIL
CEIL(X) 返回>=该参数X的最小整数。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/969ff42c9ed64c5e9cab1ea79bda73b6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.2.3 FLOOR
FLOOR(X) 返回<=该参数X的最大整数。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c5924152d30f49acb8216306c564aff2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.2.4 TRUNCATE
TRUNCATE(X,D) ,对X保留小数点后D位。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c26658e4dc2a41e9994cc9c685451185.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.2.5 MOD
MOD(n,m) ,取余操作,相当于 n % m; ![在这里插入图片描述](https://img-blog.csdnimg.cn/5b02d91a3eaf4e57aa72317a050a9588.png)
2.3 日期函数
2.3.1 NOW
NOW() ,返回当前系统日期 + 时间 ![在这里插入图片描述](https://img-blog.csdnimg.cn/de6add937ada4f4093854f3986d80f4f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_19,color_FFFFFF,t_70,g_se,x_16)
2.3.2 CURDATE
CURDATE ,返回当前系统日期,不包含时间。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/47a078eca0944e01b6e84812823ccaab.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_18,color_FFFFFF,t_70,g_se,x_16)
2.3.3 CURTIME
CURTIME ,返回当前系统时间,不包含日期。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/32a2cb513cfc44b39b3336e8ea26ca9e.png)
2.3.4 获取指定的部分,年、月、日、小时、分钟、秒
以获取年为例 YEAR(date); ![在这里插入图片描述](https://img-blog.csdnimg.cn/78a11ba0f9f046bf9425fad2033a50a8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 获取月:MONTH();MONTHNAME()可使获取的月份用英文显示。 获取日:DAY(); 获取小时():HOUR(); 获取分钟:MINUTE(); 获取秒:SECONDE();
2.3.5 STR_TO_DATE
STR_TO_DATE(str,format) ,将日期格式的字符转换成指定格式的日期。 格式符如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/61ffa0f35be043e180cbdbeb56687a1f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例一:将’1-1-2022’ 转换为日期。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b60b666971be4b33a0e7541ee86cb7c1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例二:查询入职日期为1992-4-3的员工信息。 我们可以用 SELECT * FROM employees WHERE hiredate = ‘1992-4-3’;语句查询,但是在用户使用中往往并不是按正确日期格式输入的,如’4-3 1992’,那么我们查询的时候就要将其转换为标准日期格式了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/464fd868b58242de8de43d95d2b015b3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.3.6 date_format
date_format(date,format) 将日期转换成字符。 格式符如下: ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c446f173b1b474f87c96df273bf8bac.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例一:将当前系统日期转换为 xxxx年x月xx日。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/8af7eb004d5f4b0eb56aa9e16819d030.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例二:查询有奖金的员工名和入职日期,入职日期按xx月/xx日/xx年格式输出。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/4b2291878e224ae68b8d12731d448c0e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.4 流程控制函数
2.4.1 IF
IF(expr1,expr2,expr3) ,如果expr1为真,则返回expr2,否则返回expr3; 例一:判断2 > 1吗?如果大则返回大,否则返回小。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/70284ab1c3ed458fadbc342870e3deb7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 例二:查询员工表中的员工姓名和奖金,如果员工有奖金备注恭喜恭喜!!,没有没有奖金备注你好惨!。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/056ee4f697bb470bae78174e31b193a5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
2.4.2 CASE
使用一 (和Java中的switch case 语句很像) case 要判断的字段或表达式 when 常量1then 要显示的值1或语句1; when 常量2 then 要显示的值2或语句2; ... else 要显示的值n或语句n; end
注意:如果then和else后面跟的是值后面不要加; 如果跟的是语句要加; 案例: 查询员工的工资,要求 部门号 = 30,显示的工资为1.1倍 部门号 = 40,显示的工资为1.2倍 部门号 = 50,显示的工资为1.3倍 其他部门,显示的工资为原工资 ![在这里插入图片描述](https://img-blog.csdnimg.cn/dcefdc2031704febbdab297febe79e99.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16) 使用二 (和Java中的多重if很像) case when 条件1 then 要显示的值1或语句1 when 条件2 then 要显示的值2或语句2 when 条件3 then 要显示的值3或语句3 ... else 要显示的值n或语句n end 注意:同样,如果then和else后面跟的是值后面不要加; 如果跟的是语句要加; 案例: 查询员工的工资情的情况 如果工资>20000,显示A级别 如果工资>15000,显示B级别 如果工资>10000,显示C级别 否则,显示D级别 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c8c7f89b518c4838907dab3bf064a29a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAV1lTQ09ERVI=,size_20,color_FFFFFF,t_70,g_se,x_16)
|