您的位置:首页 > 数据库

关于数据库的学习

2010-07-16 10:20 323 查看
现在搞软件开发大部分都和数据库有关。首先说说建模,也就是数据库设计,如果要想独立做一个系统,建模是核心部分,如果你在一个大企业里,按照设计要求完成代码,建模是由高级人员完成的,你必须掌握好TSQL,能写出复杂的SQL,懂得建模只是可以帮助你理解设计。 我见过很多学生学习完数据库建的表,要求的报表是什么样,表就建成什么样,最典型的是成绩单,字段如下:学号,数学,英语,政治,物理,电工...,如果不同年级科目不一样,是不是都要建不同的表,不知道是老师教的,还是自学的,考试时ER图,范式,一对多,多对多等都答的不错,都及格了,可一动手就像没学过一样,可能是学的太多了,主次不分,其实建模方法也不像想象那么复杂,最基本,最有用的就是ER实体关系建模,首先是发现并确定实体,然后是根据需求在实体间建立各种联系,平常要多练习一些,多看一些,最好用个建模工具,我常用的是SYBASE的POWERDISIGNER,MS的visio也挺好用。最常用的几个概念:实体,关系,属性,主键,索引,一对多,多对多 ,一定要搞明白,范式和依赖理解起来挺困难,真正用的很少,实体建立的合理,关系符合实际需求,基本上就能符合范式和依赖关系。举个例子,是关于学籍管理的,刚才说的成绩表应该是其中一部分,单独一个成绩表用不着数据库的,EXCEL够用了,因为这个东西大家都比较熟悉,需求自己就可以搞明白,首先从招生开始,招生前应该有一些工作,首先确定专业,那么专业是一个实体,有编号,名称,建立时间等属性,然后还得有培养计划,培养计划是这个专业都上哪些课程,又出现了到一个实体,课程,培养计划就是专业和课程的一种关系,这种关系是什么关系呢,一个专业肯定要上多门课程,一门课程可以出现在多个专业里,多对多关系,需要单独建表,在这里培养计划可以看成是一个关系表,其实也可以看作是一张实体表,下来可以创建班级,班级是一个实体有编号,名称等属性。班级需要辅导员,辅导员就是教师,教师是一个实体有编号,姓名,生日等属性,班级和教师就有了一个辅导员的关系,一个班级有一个辅导员,一个辅导员带多个班级,一对多的关系,怎么处理,在班级里加个属性辅导员,并和教师表建立外键关系,这时我们都可以想象出来,增加班级的输入界面上,有一项是辅导员,一点下拉列出教师名单选择一位,除了辅导员关系,班级和教师还可以建立别的关系,如班主任,那么需要添加额外的属性,下来,新生要报道了,学生肯定是一个实体,有学号,姓名,生日,性别,省份等属性,学号是主键,学生和班级有关系,归属关系,一对多,学生表里加班级属性,那么学生和专业呢,所学专业关系,学生表里加所学专业属性,或者班级和专业建立关系,学生就不用和专业建立关系了,但是一个班里要是有两个专业的学生就麻烦了,还是学生和专业直接联系好,不过班级和专业也需要建立一个关系,这样,统计每个专业有几个班就可以搞定了,从上看来,基本方法是从需求出发,发现实体,建立关系,在POWERDISIGNER里,设计概念模型时,只需要添加好关系,生成物理模型时会自动添加外键和约束,非常方便。这些只是学籍管理简单的一小部分,往下还有课程计划,教师排课,学生选课,排课程表等跟复杂的内容,可以自己练习分析一下。除了这个系统,博客系统,论坛,也是常见常用的都可以按照实现好的功能进行建模练习。

接下来要说一下的就是sql语句,写好sql语句主要明白几点:
一.多表连接,多表连接是在查询一个实体或关系的数据时,同时显示出外键表的相关信息,如在显示学生的成绩表时,除了显示成绩还可以显示该课程的学分是多少,其实课程的名称通常都不存在成绩表里,也需要关联到其它表,我们通常的成绩表这么建立:学号,课程id,成绩,那么还会有一张课程信息表:课程id,课程名,学分,这里面课程id是外键,我们需要的结果是:学号,课程名称,成绩,那么 我们必须从两种表里取数据 ,如果from 后面有多张表,那么产生的结果就会是多张表的笛卡尔积,我们必须通过where条件里主外键相等过滤掉不相关的数据,通常把成绩表叫主表,不管怎么增加关联表,查询的数据条数不能改变,关联表可以和主表主外键关联,关联表也可以一层层主外键关联,一个查询关联个3,5张表很正常,多的10来张表的也有,有时一张表会被同时关联好几遍。
二 .聚合,其实就是分组,在做数据统计时主要就是分组。按哪个字段分组就一定要显示这个字段,例如对于学生表,按省份分组查询,select字段里就一定有省份,其它字段只能用聚合类函数,如count(*),sum(age),min(age),max(age),avg(age)等,除了这些还可以根据需要自己编写聚合函数,分组可以同时按几个字段来分,select一定要有这几个字段,不能多,也不能少,其它字段只能用聚合类函数。
三.结果嵌套,每一个查询语句用括号扩起来,就可以当作一张表,可以从中进行分组查询,也可以和其它表关联查询,也可以关联查询后,再进行分组查询,总而言之,查询语句通过层层嵌套可以完成强大的功能。在很早的时候,还不会这个,在一次面试中被嘲笑了一把,题目就是一个班里哪个省份的学生最多,先分组,然后在结果中再查出最大的就行,那个时候就会写存储过程,建游标,插入临时表,从临时表中查询,后来看到别人用,就会了,少写了不少存储过程。那时候网络还是稀罕的东西,不像现在,这东西在网上经常能看到。
以上就是我觉得数据库方面应该熟练掌握的并能灵活运用的知识,还有很多地方和很多经验技巧没提到,也可能讲的不是太清楚,大家也可以补充或提些问题,不过不管是建模还是写sql都需要大量的练习实践,多分析一些项目,多看一些网上技巧,才能不断进步。再说一点,写SQL语句的时候不同的写法带来的执行效率相差很大,我知道的几点说一下,使用group查询时,尽量使用having子句,where条件里,索引字段往前放,对于经常使用where查询的字段最好建立索引,索引的顺序和where 里的顺序保持一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: