我们查询数据的时候,有时单纯的查询并不能得到我们想要的数据形式,此时需要我们对数据进行处理,在这个时候函数就登场,SQL中有一些内置的函数,如果能都记住,那是最好的。如果记不住的话,也尽可能地把所有的函数都看一遍,保证有印象,在遇到问题的时候,知道有函数可以解决这个问题,然后是上网去搜索,下次你在遇到类似的问题,就知道用那个函数了。学习过程中,遇到问题首先一定要先自己上网搜、上网搜索、上网搜索(这个很重要,不要直接去问别人)。sql 的函数和excel 的函数有很多类似的,如果你非常熟悉excel 函数,那么sql的函数学起来会很轻松,反之亦然。
我将函数大致分了三类:
1.文本处理函数
2.日期和时间处理函数
3.数值处理函数
1.文本处理函数
在提取文本数据时,我们有时会需要先对文本就行处理,比如提取某些特定的字符,删除多余的空格等等,这个时候我们可以使用文本处理相关的函数。
我这里举一个简单的例子,分享一下我的思路,方法不唯一,希望能起个抛砖引玉的作用。
英文单词在录入数据库时可能格式不统一 ,因此我在提取数据的时候,需要对其进行处理, 例如('apple','bananA ',' MELON ')变为('Apple','Banana','Melon')这样首字母大写的格式。
原始数据:('apple','bananA ',' MELON ') ,目标数据:('Apple','Banana','Melon') ,首先比较一下原始数据与目标数据的区别,如果消除这个区别就会得到目标数据,因此消除区别是解决问题的关键,在这个例子中,主要有两个区别:1.首字母大写,其他字母小写;2.前后无空格。
找到区别后,需要寻找解决方法(即相关函数),首先考虑是否有可以直接解决问题的函数,如果有则列出函数;如果没有,则分解问题,寻找可以直接用的函数,循环这个过程,直到所有分解的问题都找到对应的函数。
下面是我分析问题的一个思路流程
找到所有函数后,将函数组合起来,变成一个复合函数,利用这个复合函数,就可实现目标了。
假设对name字段进行处理,首先使用trim(name)删除多余空格;然后用left(trim(name),1) 提取首字母,之后使用upper(left(trim(name),1) )将首字母大写;我可以用 lower (trim(name))将所有字母变成小写,之后用substring( lower (trim(name)) ,2) 提取首字母之外的字母;最后再用concat(upper(left(trim(name),1) ) ,substring( lower (trim(name)) ,2) )将其拼接起来,就得到了将首字母大写的函数了。以上是我想到的一个思路,方法不唯一,比如说我可以用right()/mid()和length()函数代替substring()函数提取剩余字母。这里就不扩展了,有兴趣的同学可以自己想一下。
以上是我解决这个问题的一个思路,逐步拆解问题,寻找解决方法,最终汇总在一起。这个方法帮我们将一个复杂的问题,拆解成多个可以入手解决的小问题,让我们快速地找到解决问题的思路。
以下是常用到的一些处理文本相关的函数(不限这些)
常用的文本处理函数2.日期和时间处理函数
在创建数据表的时候,需要定义字段的数据类型,不同的数据类型决定了数据储存格式。
时间日期类型(来源菜鸟教程)以上的这些数据类型是数据表中常见的时间日期储存格式,但是这些格式有时并不能满足我们的需求,例如我需要:年-月,或者月-日-星期等格式,计算时间差,日期差等,这种情况下需要使用时间和日期相关的函数。
常用日期与时间处理的函数规定日期格式时可以用 DATE_FORMAT( )函数,例如年-月:YYYY-MM这种格式: DATE_FORMAT(NOW(),'%Y-%m') 其中:%Y:年,4 位 %m:月,数值(00-12),可以在网上查询格式类型 ,例如菜鸟教程。
mysql 时间与日期的加减,不能直接用+、-符号直接计算,需要使用相应的函数。
为日期增加一个时间间隔:date_add(),date_add(now(), interval 1 day) 增加一天,如果需要增加1小时可以用hour 替换 day即可,年、月、分、秒的类似。
这里就不做详细的扩展了,有一点我要强调的是注意时区,虽然我们生活在中国,但是不代表数据库中的时间是以北京时间录入的。
3.数值处理函数
在提取数据的时候,有时需要对数值型的数据进行计算,简单的+、- 、*、/等运算符无法满足我们运算时,我们可以使用数值处理的相关函数来进行计算。其中许多函数需要和group by结合使用。
我以这个表格为例子
成绩表 stu_core在对成绩进行求和,首先想到是加法,其次是函数。如果不使用函数只用+是可以实现的,但是很麻烦。以下是我想到的一个方法(不唯一)。
非函数运算以A、B的 成绩相加为例子
select distinct 'A+B' as '求和项', (select score from stu_core where name = 'A' ) + (select score from stu_core where name = 'B' ) as '求和结果' from stu_core;
函数运算可以看出直接用+ 号运算起来很麻烦,如果使用sum(),可以得到一样的结果,而且代码很简洁。
select 'A+B' as '求和项', sum(score) as '求和结果' from stu_core where name in ('A','B');
因此在对数值型数据处理时,优先考虑是否有相关的函数。其中group by 经常会与数值型数据函数结合使用,group by可以理解为分组计算,例如我需要知道每个年龄段的平均成绩。不用group by的话,可能会分别去计算每个年龄段的成绩,然后用 union 进行汇总查询,这里简单的说一下这个方法的思路,有兴趣的同学可以回去试一下。我主要想说一下group by,可以看一下面的分组结构图。
分组结构group by会将具有相同年龄的数据分到一组,让后执行计算,我需要的是平均值,所以选用avg()函数。
分组平均值的结果select age,avg(score) from stu_core group by age;
group by分组计算一步到位,其中我认为分组计算时,最重要的是:要非常清楚按照什么分组,以什么分组,如果想明白了这点,分组计算将变得非常简单。
以上只是我的一些思路,函数有很多,大家可以多去了解一下,下面是一些常用的数值型函数。
常用数值处理函数虽然标题取名为数据处理相关函数,但是全文下来并没有介绍太多的函数,我只分享了一下我的思路,我认为与其介绍很多函数的含义,不如分享一下我看到问题后寻找相关函数的思路,函数太多了,不太可能记住所有的函数的用法,主要会分解问题,然后在网上搜索即可找到相关的函数。(授之以鱼不如授之以渔)
如果文中哪里介绍的不对,烦请及时指出,让我学习学习。
网友评论