4.Mysql:MySQL函数
官方文档 : https://dev.mysql.com/doc/refman/5.7/en/func-op-summary-ref.html
常用函数
分类: 数学函数 , 字符串函数 , 日期和时间函数 , 系统信息函数
# 数学函数 (这里只列出一些常用的)
SELECT ABS(-8); /*绝对值*/
-- absolute value
SELECT CEILING(9.4); /*向上取整*/
-- 天花板 上限 上升限度
SELECT FLOOR(9.4); /*向下取整*/
-- 地板 楼层 自由体操
SELECT RAND(); /*随机数,返回一个0-1之间的随机数*/
-- 产生均匀分布随机数
SELECT SIGN(0); /*符号函数: 负数返回-1,正数返回1,0返回0*/
-- 符号
SELECT SIGN(-4);
SELECT SIGN(8);
#字符串函数
SELECT CHAR_LENGTH('新思路团队都是大佬'); /*返回字符串包含的字符数*/
SELECT CONCAT('我','相信','自己'); /*合并字符串,参数可以有多个*/
SELECT INSERT('我想进新思路',2,1,'一定努力'); /*替换字符串,从某个位置开始替换某个长度*/
SELECT LOWER('WANWAN'); /*小写*/
SELECT UPPER('wanwan'); /*大写*/
SELECT LEFT('hello,world',5); /*从左边截取*/
SELECT RIGHT('hello,world',5); /*从右边截取*/
SELECT REPLACE('在新思路能学习到很多东西','很多东西','新知识'); /*替换字符串*/
SELECT SUBSTR('新思路是一个很棒的团队',4,8); /*截取字符串,开始和长度*/
SELECT REVERSE('Java EE'); /*反转,逆向*/
#日期和时间函数
SELECT CURRENT_DATE(); /*获取当前日期*/
SELECT CURDATE(); /*获取当前日期*/
SELECT NOW(); /*获取当前日期和时间*/
SELECT LOCALTIME(); /*获取当前日期和时间*/
SELECT SYSDATE(); /*获取当前日期和时间*/
/*获取年月日,时分秒*/
SELECT YEAR(NOW());
SELECT MONTH(NOW());
SELECT DAY(NOW());
SELECT HOUR(NOW());
SELECT MINUTE(NOW());
SELECT SECOND(NOW());
#系统信息函数
SELECT VERSION(); /*版本*/
SELECT USER(); /*用户*/
# 查询姓李的同学,改成立
SELECT REPLACE(studentname,'李','立') AS 新名字
FROM student WHERE studentname LIKE '李%';
聚合函数
函数名称 | 描述 |
---|---|
count() | 计数 |
sum() | 求和 |
vag() | 求平均值 |
max() | 求最大值 |
min() | 求最小值 |
#聚合函数
/*COUNT:非空的*/
SELECT COUNT(studentname) FROM student;
-- 返回记录的总数
SELECT COUNT(*) FROM student;
-- 效率低,不建议使用
SELECT COUNT(1) FROM student;
-- 推荐
SELECT SUM(StudentResult) AS 总和 FROM result;
-- 求一列的总和
SELECT AVG(StudentResult) AS 平均分 FROM result;
-- 求一列的平均分
SELECT MAX(StudentResult) AS 最高分 FROM result;
-- 求一列的最高分
SELECT MIN(StudentResult) AS 最低分 FROM result;
-- 求一列的最低分
# 查询不同课程的平均分,最高分,最低分
# 前提:根据不同的课程进行分组
SELECT subjectname,AVG(studentresult) AS 平均分,MAX(StudentResult) AS 最高分,MIN(StudentResult) AS 最低分
FROM result AS r
INNER JOIN `subject` AS s
ON r.subjectno = s.subjectno
GROUP BY r.subjectno
HAVING 平均分>80;
/*
where写在group by前面.
要是放在分组后面的筛选
要使用HAVING..
*/
count分析
执行效果:
1. count(1) and count(*)
当表的数据量大些时,对表作分析之后,使用count(1)还要比使用count(*)用时多了!
从执行计划来看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化的 因此:count(1)和count(*)基本没有差别!
2. count(1) and count(字段)
两者的主要区别是
(1) count(1) 会统计表中的所有的记录数,包含字段为null 的记录。
(2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。
count(*) 和 count(1)和count(列名)区别
执行效果上:
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计。
执行效率上:
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优。
MD5 加密
mysql之自定义函数
(注明:我未深入学习,感兴趣的同学自行了解学习)
什么是函数:
函数存储着一系列SQL语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复。
但注意的是函数注重返回值,不注重执行过程,所以一些语句无法执行。所以函数并不是单纯的SQL语句集合。
函数与存储过程的区别:函数只会返回一个值,不允许返回一个结果集。函数强调返回值,所以函数不允许返回多个值的情况,即使是查询语句。