【数据库学习】聚合函数的使用-阿里云开发者社区

开发者社区> stagebo> 正文

【数据库学习】聚合函数的使用

简介: 结项总结     最近项目完结,有点闲暇时间,来总结总结项目中用到的之前没用过的sql语句和数据库知识。下面用自己的理解来记录一下~ 范式   第一范式:要求我们字段要划分到最小单元,即表头不能有合并单元格项   第二范式:要求数据库设计有主键   第三范式:要求外键字段不能有除了引用表主键以外的字段 聚合函数   sum、count、ave等等。
+关注继续查看

结项总结

    最近项目完结,有点闲暇时间,来总结总结项目中用到的之前没用过的sql语句和数据库知识。下面用自己的理解来记录一下~

  • 范式

  第一范式:要求我们字段要划分到最小单元,即表头不能有合并单元格项

  第二范式:要求数据库设计有主键

  第三范式:要求外键字段不能有除了引用表主键以外的字段

  • 聚合函数

  sum、count、ave等等。比如学成成绩表中,我们要计算成绩在60-80分之间的总分和人数,可以这样写

  

select 
count(case when score >= 60 and score <= 80 then 1 else null end) as stuNum
,sum(case when score >= 60 and score <=80 then score else 0 end) as sumScore
from 学生成绩表

  由于项目数据处理部分数据比较多,这样的sql在代码中成群结队,之前没想到这么多使用innerjoin来写的,后来一一改成了这种聚合函数的方式,虽说不见得效率提高了,但是代码确实比较好看了。

  上面的sql是求总表的,如果需求是求各个班级的分数分布情况,比如统计每个班的及格人数,所有的班级成绩存在一张表里。那么可以这样写

select 
class as 班级
,count(case when score >= 60 and score <= 80 then 1 else null end) as stuNum
,sum(case when score >= 60 and score <=80 then score else 0 end) as sumScore
from 学生成绩表
group by class -- 班级

  之前做过一个验证码的生成接口,需求是这样的:每一场考试对应一张考试表,考试表中有一个叫验证码的字段,用户添加考试的时候后台自动生成一个考试验证码,并存入数据库。

  要求:1、验证码由数字和小写字母组成,长度为6;2、生成的验证码为数据库中不存在的。

  就这两个要求,第一次实现的时候使用一个死循环,生成一个验证码然后去后台查询是否有存在的,若有,则丢弃然后重新生成。如果没有就break然后返回。

  这个解决方案被老大看到了一顿教育,说咱们系统里面一定不能再循环里面写查询,更何况你这个还是死循环,回去改。

  于是回去换了一个思路,将数据库里面考试表中所有的验证码查询出来,然后存到一个list里面,然后开始死循环,生成一个验证码,然后用contain函数判断列表里面是否存在,若存在则丢弃,若不存在则break并且返回。

  后来数据达到两千多的时候感觉就有点卡,不知道2000就卡是不是数据库的原因,那时候用的是sqlserver,于是考虑换思路。换思路的方向改成在数据库内部吧所有验证码拼接成一个字符串,用逗号分隔,然后返回一个超长字符串,然后生成验证码去这个String中判断是否存在。好了,顺利完成,恩,那个sql这样写的:

  目标数据库是SQL Server,别的数据库不知道是否支持OUTER APPLY关键字。

  原理就是最内层的那个select ... for xml auto,这会生成一个字段名=值这种类型的xml格式字符串,然后把其中的数据库名、字段名和多余的负号去掉就只剩下值了,然后替换的时候保留逗号,一个逗号分隔的超长字符串就出来了。

  有一个问题是没测试这个字符串会不会因为太长而出问题~不过我已经离开那家公司了,回头有兴趣再测一测吧。

 

黑夜给了我黑色的眼睛,我却用它寻找光明

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SQL数据库学习之路(七)
在SQL server managerment中可以点击帮助,会有帮助文档。 一、联合查询 将多个查询结果集合并成一个。
715 0
SQL数据库学习之路(四)
要求:通过SQL语句创建以下基本表:    教师关系 T(T#, TNAME,TITLE)    课程关系 C(C#,CNAME,T#)    学生关系 S(S#,SNAME,AGE,SEX)    选课关系SC(S#,C#,SCORE)    班级关系CLASS(CLASSID,CLASSNAME)    其中红色粗体为主键,带下划线的属性为外键。
705 0
SQL数据库学习之路(八)
数据库介绍: 在网页上的主程序中进行注册操作,然后把数据发送给人,人传递这些数据到数据库当中。   为什么学ADO.NET:之前我们所学的只能在查询分析器中查看数据,操作数据。
775 0
SQL数据库学习之路(六)
一、连接查询:当需要的结果需要从多张表中取时 关键问题:哪些表、关系(学生表的Id联系到班级表的Id) 内连接:inner join,两表中完全匹配的数据。
788 0
SQL数据库学习之路(一)
1.数据库简介(一个放数据的仓库)  解决的问题:持久化存储,优化读写,保证数据的有效性 关系型数据库:    基于E-R模型(实体-联系图Entity Relationship)    使用sq|语言进行操作(SQL...
931 0
PHP连接数据库学习手册
范例 1: Select 指令 任务:连结到 Access 的 Northwind DSN,然后在每一列显示头2个字段。(Northwind 北风数据库,在ODBC设定的DSN,是Access的标准范例数据库) 在这个范例中,我们建立一个 ADOConnection 对象,它代表了和数据库的连结。连结是以 PConnect 函数来初始化的,然后会持续的连结着。任何时候我们要
1007 0
学习MongoDB数据库
关于MongoDB的学习过程由下列的标题号顺序。 一、什么是NoSQL? NoSQL(NoSQL = Not Only SQL ),意即&quot;不仅仅是SQL&quot;。 在现代的计算系统上每天网络上都会产生庞大的数据量。 这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。 1970年 E.F.Codd&#39;s提出的关系模型的论文 &quot;A relational model of data for large shared data banks&quot;,这使得数据建模和应用程序编程更加简单。 通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和
17 0
数据库设计---合适的就是最好的
        数据库设计是根据用户需求设计数据库结构的过程,具体来说,数据库设计是对于给定的应用环境,在厝数据库理论的指导下,构造最优的数据库模式,在数据库管理系统上建立数据库及其应用系统,使之能有效地存储数据,满足用户的各种需求的过程。
1066 0
Django学习笔记----数据库操作实例
上上篇>Django学习笔记----环境搭建基于Windows 上一篇>Django学习笔记----快速入门 修改settings.py配置 在环境搭建篇, 我们已经安装了mysql-client包 安装好后, 在settings.
1164 0
+关注
stagebo
生命在于折腾,不断折腾,直到折腾不动为止
23
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载