网友来信:王老师 您好 我是一个学习过数据库的大三学生 对于数据库 现我可能是只明白一点点 可是 其实 也不算是只学了一点点 对于基本的T—SQL 可以说是已经比较明白了 自己也开发过一些系统 能够做一点点小成绩 可是我也明白 这些系统只是可以给自己看看而已 在别人那里做做门面而已 根本没有什么太大的作用 可是 也就是在这个时候 是我最难的时候 一打开书 我感到都会 都知道 可是自己又明白什么也不会 没有一些实用的作品 没有一些有用的成绩 然而就是这样 我越发的不知道 该怎么去提高自己 您是过来人 你给我指点一下 该看什么书 学什么知识 一个迷茫的学生期待着您的回复
回复:
先说一下,我是徐老师。因为现在还不是名师,所以还要感谢一下对我的信任。我把数据库的学习先说一下,别的方面以后有机会再说。
现在搞软件开发大部分都和数据库有关。首先说说建模,也就是数据库设计,如果要想独立做一个系统,建模是核心部分,如果你在一个大企业里,按照设计要求完成代码,建模是由高级人员完成的,你必须掌握好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 里的顺序保持一致。