SQL学习笔记5——SQL中的常见函数
一、概述
功能:类似于java中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:提高代码重用性和隐藏实现细节
调用:select 函数名(实参列表) [from 表名];
特点:1.叫什么(函数名)2.干什么(函数功能)
分类:1.单行函数 2.分组函数(传递一组值,一般做统计使用,又称为统计函数、聚合函数、组函数)
单行函数
字符函数
- concat:连接
- substr/substring:截取子串
#截取从指定索引处后面所有字符 SELECT SUBSTR('李莫愁爱上了陆展元',7); #返回'陆湛远' #注意:索引从1开始 #截取从指定索引处指定字符长度的字符(注意:不是字节长度) SELECT SUBSTR('李莫愁爱上了陆展元',1,3); #返回'李莫愁' SELECT SUBSTR('haha',2,3); #返回'aha'
- upper:变大写
- lower:变小写
- replace:替换
SELECT REPLACE('周芷若张无忌爱上了周芷若','周芷若','赵敏') AS out_put; #返回'赵敏张无忌爱上了赵敏'
- length:获取字节长度(注意:不是字符长度)
SELECT LENGTH('john'); SELECT LENGTH('张三丰hahaha'); SHOW VARIABLES LIKE '%char%'; /* utf8或者utf8mb4编码下1个汉字3个字节 gbk编码下1个汉字2个字节 */
- trim:去前后空格
SELECT TRIM(' 张翠山 ') AS out_put; SELECT TRIM('a' FROM 'aaaaaaaaa张翠山aaaaaaaa') AS out_put;
- lpad:用指定的字符实现左填充指定字符长度
SELECT LPAD('殷素素',10,'*') AS out_put; #返回'*******殷素素' SELECT LPAD('殷素素',2,'*') AS out_put; #返回'殷素',说明超过了指定长度会被截断
- rpad:右填充(用法和lpad相同)
- instr:获取子串第一次出现的索引,如果找不到返回0
SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS out_put; #返回7
数学函数
- ceil:向上取整,返回>=该参数的最小整数
- round:四舍五入
SELECT ROUND(1.65); #返回2 SELECT ROUND(-1.65); #返回-2 SELECT ROUND(1.567,2); #返回1.57
- mod:取模,等价于a-a/b*b,所以结果的正负号和被除数a的正负号一致
- floor:向下取整,返回<=该参数的最大整数
- truncate:截断
SELECT TRUNCATE(1.699,1); #返回1.6 #第二个参数的数字代表截断保留几位小数
- rand:获取随机数,返回0-1之间的小数
日期函数
- now:返回当前日期+时间
- year:返回年
SELECT YEAR('1998-1-1'); #返回1998
- month:返回月
- day:返回日
- date_format:将日期转换成字符
SELECT DATE_FORMAT('1999-4-3','%Y年%m月%d日') AS out_put; #返回'1999年04月03日'
- curdate:返回当前日期
- str_to_date:将字符转换成日期
SELECT STR_TO_DATE('9-13-1999','%m-%d-%Y'); #返回'1999-09-13'
格式符 功能 %Y 4位的年份 %y 2位的年份 %m 月份(01,02,...,11,12) %c 月份(1,2,...,11,12) %d 日(01,02,...) %H 小时(24小时制) %h 小时(12小时制) %i 分钟(00,01,...,59) %s 秒(00,01,...,59) - curtime:返回当前时间
- hour:小时
- minute:分钟
- second:秒
- datediff:返回两个日期相差的天数
SELECT DATEDIFF('1999-4-5','1999-4-4') AS out_put; #返回1 SELECT DATEDIFF('1999-4-3','1999-4-4') AS out_put; #返回-1
- monthname:以英文形式返回月
其他函数
- version 当前数据库服务器的版本
- database 当前打开的数据库
- user当前用户
- md5('字符'):返回该字符的md5加密形式
流程控制函数
- if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
- switch-case
- case情况1
case 变量或表达式或字段 when 常量1 then 值1或语句1;/*值的话末尾不要加分号*/ when 常量2 then 值2或语句2; ... else 值n或语句n; end
- case情况2
case when 条件1 then 值1或语句1;/*值的话末尾不要加分号*/ when 条件2 then 值2或语句2; ... else 值n或语句n; end /* 这种方式可以判断位于某个区间这种条件,而case情况1不行 /*
- case情况1
分组函数
分类
- max 最大值
- min 最小值
- sum 和
- avg 平均值
- count 计算个数(非NULL值的个数总计)
- 例子
SELECT SUM(salary) FROM employees; SELECT AVG(salary) FROM employees; SELECT MIN(salary) FROM employees; SELECT MAX(salary) FROM employees; SELECT COUNT(salary) FROM employees;
特点
- sum、avg一般用于处理数值型,max、min、count可以处理任何类型
- 以上分组函数都忽略null值
- 可以和distinct搭配实现去重的运算
count(*)
:用于统计总行数count(1)
:相当于加入全1的一列,然后计数,所以还是用于统计总的行数- 效率上:MyISAM存储引擎,
count(*)
最高,因为内部寄存器直接存了count(*)
的值;InnoDB存储引擎,count(*)
和count(1)
效率差不多,但大于count(字段)
- 和分组函数一同查询的字段,要求是group by后出现的字段(后面会介绍)