Èí¼þ¿ª·¢Åàѵ°à >> ±à³̿ª·¢ >> MySQL
·dz£ʵÓõÄMySQLº¯ÊýȫÃæ×ܽáÏê½âʾÀý·ÖÎö½̳Ì |
1.MySQL中关于函数的说明"概念":类似java、python中的方法,将一组逻辑语句封装在方法体中,对外暴露方法名; "好处":Ⅰ隐藏了实现细节;Ⅱ提高代码的重用性; "调用":select 函数å�?实参列表) [from 表]ï¼?/p> "特点":Ⅰ叫什ä¹?函数å�?;Ⅱ干什ä¹?函数功能)ï¼?/p> "分类":Ⅰ单行函数;Ⅱ分组函数ï¼?/p> "什么是单行函数ï¼?:作用于表中的每一行记录,一条记录出来一个结果; "什么是聚合函数ï¼?:作用于一行或者多行,最终返回一个结果; 2.单行函数分类字符函数ï¼?/p> 数学函数ï¼?/p> 日期函数ï¼?/p> 其他函数ï¼?/p> 流程控制函数ï¼?/p> 3.字符函数1ï¼?code>length(str):获取参数值的字节个数ï¼?/p> 对于 对于 操作如下 ï¼?/p> 2ï¼? 操作如下ï¼?/p> 3ï¼?code>upper(str):将字符中的所有字母变为大写; 操作如下ï¼?/p> 4ï¼?code>lower(str) :将字符中所有字母变为小写; 操作如下ï¼?/p> 5ï¼?code>substr(str,start,len):从start位置开始截取字符串,len表示要截取的长度ï¼?没有指定len长度:表示从start开始起,截取到字符串末尾。指定了len长度:表示从start开始起,截取len个长度ã€?/p> 操作如下ï¼?/p> 6ï¼?code>instr(str,要查找的子串) :返回子串第一次出现的索引,如果找不到,返å›?ï¼?当查找的子串存在于字符串中:返回该子串在字符串中【第一次】出现的索引。当查找的子串不在字符串中:返回0ã€?/p> 操作如下ï¼?/p> 7ï¼?code>trim(str):去掉字符串前后的空格; 该函数只能去掉字符串前后的空格,不能去掉字符串中间的空格ã€?/p> 操作如下ï¼?/p> 8ï¼?code>lpad(str,len,填充字符):用指定的字符,实现对字符串左填充指定长度; 操作如下ï¼?/p> 9ï¼?code>rpad(str,len,填充字符):用指定的字符,实现对字符串右填充指定长度; 操作如下ï¼?/p> 10ï¼? 操作如下ï¼?/p> 4.数学函数1ï¼?code>round(x,[保留的位数]) :四舍五入; 当对正数进行四舍五入:按照正常的计算方式,四舍五入即可。当对负数进行四舍五入:先把符号丢到一边,对去掉负号后的正数进行四舍五入,完成以后,再把这个负号,补上即可ã€?/p> 操作如下ï¼?/p> 2ï¼?code>ceil(x):向上取整,返回>=该参数的最小整数ã€?天花板函æ•? 天花板函数,在excel,python中均存在这个函数。你就想象一下你家的天花板,把这个数字丢到天花板上,求的是大于等于这个数字的最小整数ã€?/p> 操作如下ï¼?/p> 3ï¼?code>floor(x):向下取整,返回<=该参数的最大整数。(地板函数ï¼?地板函数:在excel,python中均存在这个函数。你就想象一下你家的地板,把这个数字丢到地板上,求的是小于等于这个数字的最大整数ã€?/p> 操作如下ï¼?/p> 4ï¼?code>truncate(x,D) :截断; 理解如下ï¼?/p> "参考下面的示例图,体会如下文字" 2)Dæ˜?,直接去掉小数部分ã€?/p> 3)D是负数,操作的是小数点左侧的整数部分ã€?br /> D=-1,直接从-1位置处,先砍掉后面的小数部分ï¼?br /> 并且"从当前位置起(包括当前位置),后面整数部分替换为0"ã€?br /> D=-2,直接从-2位置处,先砍掉后面的小数部分ï¼?br /> 并且"从当前位置起(包括当前位置),后面整数部分替换为0"ã€?/p> 示例图: 操作如下ï¼?/p> 5ï¼?code>mod(被除æ•?除数) :取余; 当被除数为正数,结果就是正数。当被除数为负数,结果就是负数ã€?/p> 操作如下ï¼?/p> 5.日期时间函数日期的含义:指的是我们常说的年、月、日ã€?/p> 时间的含义:指的是我们常说的时、分、秒ã€?/p> 在讲述下面函数之前,我们先补充一个知识,不同时间格式符表示什么含义呢ï¼?/p> 1ï¼?code>now() :返回系统当前的日期和时间; 操作如下ï¼?/p> 2ï¼?code>curdate() :只返回系统当前的日期,不包含时间; 操作如下ï¼?/p> 3ï¼?code>curtime() :只返回系统当前的时间,不包含日期; 操作如下ï¼?/p> 4)获取日期和时间中年、月、日、时、分、秒ï¼?nbsp; 获取年份:year()ï¼?/p> 获取月份:month()ï¼?/p> 获取日:day()ï¼?/p> 获取小时:hour()ï¼?/p> 获取分钟:minute()ï¼?/p> 获取秒数:second()ï¼?/p> 5ï¼?code>weekofyear() :获取当前时刻所属的周数ï¼?/p> 操作如下ï¼?/p> 6ï¼?code>quarter() :获取当前时刻所属的季度ï¼?/p> 操作如下ï¼?/p> 7ï¼?code>str_to_date() :将日期格式的字符串,转换成指定格式的日期; 操作如下ï¼?/p> 8ï¼?code>date_format() :将日期转换成日期字符串ï¼? 操作如下ï¼?/p> 9ï¼?code>date_add() + 操作如下ï¼?/p> 10ï¼?code>last_day() :提取某个月最后一天的日期ï¼?/p> 操作如下ï¼?/p> 11ï¼?code>datediff(end_date,start_date) :计算两个时间相差的天数ï¼?/p> 操作如下ï¼?/p> 12ï¼?code>timestampdiff(unit,start_date,end_date) :计算两个时间返回的å¹?æœ?天数ï¼?/p> unit参数是确å®?start_date,end_date)结果的单位,表示为整数,以下是有效单位: year:年ä»?/p> month:月ä»?/p> day:天 hour:小æ—?/p> minute 分钟 second:秒 microsecond:微ç§?/p> week:周æ•?/p> quarter:季åº?/p> YEAR:年ä»?/p> 操作如下ï¼?/p> 6.其它常用系统函数7.流程控制函数1ï¼?code>if函数:实现if-else的效果; 2ï¼?code>ifnull函数:判断值是否为null,是null用指定值填充; 3ï¼?code>case…when函数的三种用法; case â€?when共有三种用法,我相信自己的总结会相当全面。希望大家一定要好好研究这几种用法,都是很有用的ã€?/p> 等值判断:类似于java中switch case的效果; 区间判断:类似于python中if-elif-else的效果; case â€?when和聚合函数联用; â‘?case â€?when用作等值判断的语法格式ï¼?/p>
操作如下ï¼?/p> â‘?case â€?when用作区间判断的语法格式;
操作如下ï¼?/p> â‘?case…when与聚合函数的联用 利用上述原始表,完成如下问题ï¼?/p> -- 18、查询各科成绩最高分、最低分和平均分,以如下形式显示ï¼?br /> -- 课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀çŽ?br /> -- 及格为:>=60,中等为ï¼?0-80,优良为ï¼?0-90,优秀为:>=90 操作如下ï¼?/p> select sc.c,cname, max(score) 最高分,min(score) 最低分,avg(score) 平均åˆ? sum(case when score>60 then 1 else 0 end)/count(*) 及格çŽ? sum(case when score>=70 and score<80 then 1 else 0 end)/count(*) 中等çŽ? sum(case when score>=80 and score<90 then 1 else 0 end)/count(*) 优良çŽ? sum(case when score>=90 then 1 else 0 end)/count(*) 优秀çŽ? from sc left join course on sc.c = course.c group by sc.c; 结果如下ï¼?/p> 8.聚合函数1)聚合函数的功能和分类;â‘?聚合函数的功能; 用作统计使用,又称为聚合函数或统计函数或组函数ã€?/p> â‘?聚合函数的分类; sum 求和avg 平均值max 最大值min 最小值count 计算个数 2)聚合函数的简单使ç”?/h3>3)五个聚合函数中传入的参数,所支持的数据类型有哪些ï¼?/h3>mysql不是强类型的编程语言。也就是说,有些语句执行结果可能不报错,但是执行结果无实际意义,因此,我们也认为是不正确的ã€?/p> â‘?测试数据ï¼?/p>
"建表语句"
create table test(
id int primary key auto_increment,
name varchar(20) not null,
sal int,
birth date)charset=utf8;
"插入数据"
insert into test(name,sal,birth) values
("Zoo",6500,'1993.3.20'),
("Hobby",4000,'1997.6.10'),
("Aline",5500,'2000.5.1'),
("Bob",10000,'2008.10.1');
â‘?sum()函数和avg()函数:传入整åž?小数类型才有意义ï¼?/p> 结论如下ï¼?/p> sum()函数和avg()函数对于字符串类型、日æœ?时间类型的计算都没有太大意义。因此,sum()函数和avg()函数,我们只用来对小数类型和整型进行求和ã€?/p> â‘?max()函数和min()函数:传入整åž?小数类型、日æœ?时间类型意义较大ï¼?/p> 结论如下ï¼?/p> max()和min()中传入的æ˜?整型/小数类型",计算的是数值的 â‘?count()函数:可以传入任何数据类型,但是碰到null要注意; 结论如下ï¼?/p> count()函数可以传入任何数据类型,表示对行计数ã€?br />
"但是下面的知识点需要特别注意的" 总结:
其实所有的分组函数都忽略null值的,但上面那个count()函数碰到null值要特别注意ã€?/p> â‘?count()函数碰到null值需要特别注意; 结论如下ï¼?/p> 对于avg(sal)求平均值来说,(6500+4000+5500+10000)/4=6500ã€?/p> 对于后面这个sum()/count(*)求平均值来说,(6500+4000+5500+10000)/5=5200ã€?/p> 好好体会上述例子,有时候某人成绩虽然记录的是null,但是你仍然æœ?个人存在,所以你要考虑一下怎么使用合适的函数,达到你想要的结果ã€?/p> â‘?count(1),count(0)表示的是啥意思呢ï¼?/p> 无论是sum(1),sum(0),count(1),count(0),avg(1),avg(0),原理都是一样的,相当于在原表中新增一列ã€?/p> 其次,我们知道where后面接的是【逻辑值】,当使用where 1和where 0原理也还是一样,也相当于在原表中新增一列ã€?/p> 我们只需要记住在mysql中:"é�?即为trueï¼?为false"。也就是说,下面的所有是1的地方,你可以换成任何非0数字,都是可以的ã€?/p> 原理图如下: 测试一下: â‘?count(*)计数的效率问题; MYISAM存储引擎下,count(*)的效率高。INNODB存储引擎下,count(*)和count(1)的效率差不多,比count(字段)效率要高一些。综上所述:优先使用count(*)ã€?/p> 4)聚合函数和group by的使用“最重要”;关于这个知识点,我们将会在后面的知识点中进行讲述。在这里我们只需要记住一句话:当SQL语句中使用了group by分组函数后,select后面的字段必须是group by后面的字æ®?+ 聚合函数的使用ã€?/p> 以上就是非常实用的MySQL函数全面总结详解示例分析的详细内容,更多关于MySQL函数的资料请关注脚本之家其它相关文章ï¼?/p> |