资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数据库技术,第五章,数据库设计过程,E/R,图到关系模式的转换,关系模式的规范化,需求分析,概念模式设计,逻辑模式设计,数据库实施,E/R,图,UML,RDBMS,模式,存储模式,数据库运行和维护,什么是概念数据建模,对系统中数据的描述,描述类间的各种关系,概念数据建模过程,概念数据建模方法,UML,ER,概念数据建模-UML,类被表示为由3个部分组成的矩形,上面部分给出了类的名称,类名用粗体,背景颜色较深。,中间部分给出了该类对象的属性。,下面部分给出了对象的约束条件以及可以应用到这些对象的操作。其中第二和第三个部分之间,用一条线间隔开来。,UML例子,UML关系表达,关系是一个或多个类的对象之间的语义连接,一个关系可以是因为实体之间的自然联系而造成的结果,例如,一个教师属于某一个院系;,也可能是由于发生了某一个事件,例如一个学生选了某门课。,关系的度(或元数),参与一个关系的类的数目,一元关系,二元关系,关系的重数,一个类的对象与另一个类的对象存在的数目上的关系,0.1:表示最小值是0,最大值是1。,*(或0.*):表示范围从0到无穷大。,0.n:最小为0,最大为n。,单个1:代表1.1,表示关系中参与的对象数目恰好是1,关系的重数举例,关联,关联是一种关系,关联的2个类间产生属性,概念模式设计,ER,图,实体联系模型(,Entity-Relationship Model,,简称,E-R,模型),P.P.Chen,于,1976,年在“,The Entity-Relationship Model: Toward a Unified View of Data,”, ACM Transactions on Database Systems, Vol 1, Num 1 (1976).,论文中提出的。,模型直接从现实世界中抽象出实体类型及实体联系,.,用实体联系图即,E-R,表示数据模型。其核心就是设计,E-R,图(,Entity-Relationship Diagram,)。,E-R,模型的基本概念,实体,(entity),:客观存在,可以相互区别的事物称为实体。,实体集,(entity set),:性质相同的同类实体的集合,称实体集。,属性,(attribute),:实体有很多特性,每一个特性称为属性。每一个属性有一个值域,其类型可以是整数型、实数型、字符串型等。,实体标识符,(identifier),:能惟一标识实体的属性或属性集,称 为实体标识符。有时也称为关键码,(key),,或简称为,键,。,联系,(relationship),是实体之间的相互关系。,数据模型,:,能表示,实体类型,及,实体间联系,的模型称为“数据模型”。,实体表达,E-R,图的基本组成部分,E/R,图有四个主要部分:,(,1,)实体集,用矩形表示。,(,2,)属性,用椭圆形表示。,(,3,)联系,用菱形表示。,(,4,)直线,表示联系的类型及实体与实体之间的联系;,数据联系,联系(,relationship,)是实体之间的相互关系。,二元联系有以下三种类型:,一对一联系,:实体集,E1,中每个实体至多和实体集,E2,中的一个实体有联系,反之亦然,那么实体集,E1,和,E2,的联系称为,“,一对一联系,”,,记为,“,1:1,”,。,一对多联系,:实体集,E1,中每个实体可以与实体集,E2,中任意个(零个或多个)实体间有联系,而,E2,中每个实体至多和,E1,中一个实体有联系,那么称,E1,对,E2,的联系是,“,一对多联系,”,,记为,“,1:N,”,。,多对多联系,:如果实体集,E1,中每个实体可以与实体集,E2,中任意个(零个或多个)实体有联系,反之亦然,那么称,E1,和,E2,的联系是,“,多对多联系,”,,记为,“,M:N,”,。,三种联系的,E-R,图,实体,1,实体,2,联系,实体,1,实体,2,联系,实体,1,实体,2,联系,1,1,联系,1,n,联系,m,n,联系,三种联系的,E-R,图实例,客人,飞机座位号,联系,院系,教师,联系,课程,学生,联系,1,1,联系,1,n,联系,m,n,联系,E-R,图实例,例:设计一个学生选课数据库。要求包括学生,(student),、课程,(course),和教师,(teacher),的信息。,实体中存在如下联系:,一个学生可以选修多门课,而每门课也能由多个学生选修;一位教师可以教多门课,每门课也可以由多个教师讲授;用,E-R,图来描述此数据库。,学生信息:学号,(no),、学生姓名,(name),、年龄,(age),、地址,(dddress),课程信息:课程号,(no),、课程名,(name),、课程学分,(credits),教师信息:工号,(no),、姓名,(name),、教师的地址,(address),学生,-,课程,-,教师,E-R,图,student,course,teacher,take,teach,注意:如果一个联系具有属性,则这些属性也与该联系连接起来。,TeachCourseNo,条码,白酒,容量,度数,编号,销售商,联系人,地址,电话,名称,销售,数量,单价,E-R,图实例 白酒销售,IBM,研究员,E.F.Codd,(,Edgar Frank Codd,,,1924-2003,)于,1970,发表了业界第一篇关于关系数据库理论的论文“,A Relational Model of Data for Large Shared Data Banks,”,,首次提出了关系模型的概念。这篇论文是计算机科学史上最重要的论文之一,也奠定了,Codd,博士“关系数据库之父”的地位。,E.F.Codd,因此获得,ACM,图灵奖(,1981,年)。,关系数据模型,关系描述,关系名,(,关键属性,,属性,1,,属性,2,,,,属性,N),Student (,studentNo,,,studentName,,,birthday,,,sex),关系基本概念,关系:对应通常所说的二维表。,元组:表中的一行即为一个元组,属性:表中的一列即为一个属性,例如下表有,4,列,就有,4,个属性(,studentNo,studentName, birthday, sex,)。,主键:表中的某个属性组,(,可以多属性组合成主键,),,它可以唯一确定一个元组,例如,,studentNo,可以唯一确定一个学生,也就成为学生关系的主键;,域:属性的取值范围,例如,大学生性别域是(男,女);,分量:元组中的一个属性个数。例如,学生关系分量为,4,。,关系模式:对关系的描述,一般表示为:关系名,(,属性,1,,属性,2,,,,属性,N),。,关系模型实例,关系,关系名,元组,:表中的一行即为一个元组或记录;,字段,:表中的一列,列值称为字段值,列名称为字段名,值域,:字段值的取值范围,元组,(,记录),属性,(,字段,),主键,:能唯一标识一个元组的属性集合。,外键,:若属性组,F,不是关系,R1,的主键,但它是关系,R2,的主 键,则,F,称是关系,R1,的外键。,主键,主键,外键,关系模型查询的实现,通过关联表的方式实现,良构关系,良构关系包含最小的数据冗余,,允许操作者插入、删除、修改表中的行而不会引起错误或数据的不一致,良构关系,-,关系的规范化,1,、问题,学生选课表,SNo,SName,SDept,Mname,CName,grade,991230,贺小华,计算机,周至光,数据库,96,991239,金谦,计算机,周至光,操作系统,90,991239,金谦,计算机,周至光,编译原理,92,993851,陈刚,建筑,王勇,建筑原理,89,992076,吕宋,自动化,李霞,自动化设计,85,992076,吕宋,自动化,李霞,电路原理,82,数据冗余,修改异常,插入异常,删除异常,学号 课程 学分,100,人工智能,3,125,文化学,2,150,市场营销学,2,175,人工智能,3,190,文化学,2,更新异常:删除学号为,150,的学生的选课记录,丢掉了学生,150,选修,“,市场营销学,”,的事实,还失去了,“,市场营销学,”,的学分是,2,的事实。,插入异常:若有一门,“,法律,”,课,学分为,3,,但无学生选修时,不能输入。,消除异常的方法:模式分解,若将以上的学生关系分解成学生,-,选课、课程,-,学分关系,更新异常、插入异常就都可消除了,对关系进行分解的过程就是规范化过程。,学号,课程,100,人工智能,125,文化学,150,市场营销,175,人工智能,190,文化学,课程,学分,人工智能,3,文化学,2,市场营销,2,学生选课关系,课程学分关系,属性间有三种联系,1),函数依赖,:给定一个属性的值,可以获得另一个属性的值。例如,若已知,“,课程名,”,的值,便可知道,“,授课学时,”,。,“,授课学时,”,依赖于,“,课程名,”,,或,“,课程名,”,决定,“,授课学时,”,。记作,“,课程名授课学时,”,。,4,36,面向对象,X002,3,54,数值分析,X001,6,72,编译原理,Z006,5,72,操作系统,Z004,2,54,C,程序设计,J003,6,72,数据库,J001,授课学期,授课学时,课程名,课程号,2),部分依赖:,下表的主键是属性集合,学号,课程号,。主键,学号,课程号,决定了,“,学分,”,的值。但,“,学分,”,只由,“,课程号,”,决定,与,“,学号,”,无关,也就是,“,学分,”,属性只由主键,学号,课程号,的一部分而不是全部来决定,,把这种依赖称为部分依赖。,记作“学分 ,学号,课程号,”,。,学号,姓名,课程号,课程名,学分,0100101,李灿,J01,数据库,4,0100101,李灿,J04,操作系统,4,0100101,李灿,L02,数值算法,3,0100201,张简,J01,数据库,4,0100101,李灿,J04,操作系统,4,0200301,张名,F09,德语,6,0100201,张简,F09,德语,6,3),传递依赖:,下表的主键是,“,学号,”,,学生住宿的楼号依赖于学号。但是,学生应交的住宿费是由楼号决定的,也就是说,,“,收费,”,依赖于,“,楼号,”,,这是一种新的依赖关系:,“,楼号,”,依赖于,“,学号,”,,而,“,收费,”,又依赖于,“,楼号,”,。一般把这种依赖关系称为,“,传递依赖,”,。记作,“学号收费,”。,800,8,150,600,4,120,500,2,130,500,2,100,2,楼号,500,180,收费,学号,1,)第一范式,(,First Normal Form,,,1NF,),定义:,如果一个关系模式,R,的所有属性都是不可分的基 本,数据项,则关系,R,属于第一范式。,注意:集合、数组和结构都不能为第一范式关系中属性的,类型。,符合第一范式的关系可能有插入、删除异常。,例如:在关系“选课”中,存在着部分依赖:,学分 ,学号,课程号,将导致插入、删除异常。,p,2,)第二范式,(,Second Normal Form,,,2NF,),定义:,若关系模式,R,属于第一范式,且每个非主属性都完,全函数依赖于主键,则,R,属于第二范式,。,注意:单个属性作为主键的关系自动就是第二范式。,第二范式中的关系存在更新异常,.,例如:,(,学号、楼号、收费,),,虽然学号是单属性主键,属于第二范式,而楼号、收费都由学号决定,存在传递依赖关系:,“学号收费,”,将导致更新异常。,t,3,)第三范式,定义:,如果一个关系,R,是第二范式的,并且每个非主属性 都不传递依赖于主键,则,R,属于第三范式。,例如:学生住宿关系可以分解为两个关系:学生,-,楼号关系(学号,楼号)和楼号,-,收费关系(楼号,收费)。这两个关系属于第三范式。,学号,楼号,100,2,120,4,130,2,150,8,180,2,楼号,收费,2,500,4,600,2,500,8,800,2,500,UML到关系模型的转换类转换,系模式名就是类名,关系模式的属性由原类中的各属性组成,关系模式的主键就是原类的主键,Student(,studentNo, studentName, sex, birthday),UML,到关系模型的转换,关系转换,1:1,关联,(,二元关系 重数,=1:1),两个类转换成两个关系模式,在其中任意一个关系模式的属性集中加入另一个关系模式的主键,1:N,关联,(,二元关系 重数,=1:N),两个类转换成两个关系模式,在,N,端的类转换成的关系模式中加入,1,端关系模式的主键,1:N,关联,转换实例,Teacher(,TeacherId, teacherName, sex),Deaprtment(,DeptId, deptName, location),Teacher(,TeacherId, teacherName, sex,deptId),UML到关系模型的转换关联类,关联两端的对象各转换成一个关系模式,关联本身也产生一个关系模式 ,其主键用关联两端对象的主键形成复合键,关联类转换实例,Student (,studentNo,.),Course(,courseNo,),selectCourse(,studentNo,courseNo, grade),4,、,E-R,模型到关系模式的转换,1,)实体,(,对象,),到关系模式的转换,2,)联系,(,关系,),到关系模式的转换,1,)实体到关系模式的转换,规则:,将实体的名称作为关系的名称,将实体的属性作为关系的属性,并用下划线标识出主属性。,student,course,take,sNo,sname,saddress,age,cNo,cname,credits,grade,student,(,sNo,sName,sex,age,),表示,student,关系,其中,sNo,为主键。,course,(,cNo,cName,credits,),表示,course,关系,其中,cNo,为主键。,2,)联系到关系模式的转换,1:1,若实体间联系是,1:1,,可以在两个实体转换成的两个关系模式后,然后在其中任意一个关系模式的属性集中加入另一个关系模式的主键和联系自身的属性。 也就是说,1:1,联系不单独转换为一个独立的关系。,2,)联系到关系模式的转换,1:N,若实体间联系是,1:N,,则在,N,端实体转换成的关系模式中加入,1,端实体的主键和联系的属性。 同样,1:N,联系也不独立构成一个关系。,Teacher,teacherId,teacherName,sex,Department,DepartmentId,deptName,location,工作,二元关系,2,)联系到关系模式的转换,M:N,若实体间联系是,M:N,,则将,联系,转换成,一个关系,模式,其属性为两端实体的主键加上联系自身的属性,而联系关系的主键为一复合键,通常是两端实体主键的组合。,对于“学生选课”,E/R,图的课程和学生之间的多对多的联系,可转换成关系模式:,take,(,sNo,cNo,grade,),主键为复合键,sNo,cNo,。,student,course,take,sNo,sname,saddress,age,cNo,cname,credits,grade,例:,关系的完整性,域完整性,实体完整性,参照完整性,关系数据库的组织,表,1,表,2,表,3,DB,Column or Field,Record,SQL 2000,数据库的组成,关系图,表,视图,存储过程,用户,角色,SQL 2000,创建数据库,执行,“,开始,”,“,程序,”,“,Microsoft SQL Server”,“,企业管理器,”,后,进入,SQL Server,管理,在窗口的左边展开数据库,右击数据库项目列表的空白处,在弹出的菜单中选择,“,新建数据库,”,,出现,“,数据库属性,”,窗口,在该窗口的,“,常规,”,选项卡上,输入数据库的名字,例如:,ScoreManager,。,作业 创建数据库,ScoreManager,SQL 2000,字段类型,数据类型,描述,binary,binary,用来存储固定格式长度的二进制数据,最多存储,8k,字节,varbinary,varbinary,用来存储可变长度的二进制数据,最多存储,8k,字节,image,Image,用来存储超过,8k,的可变长度的二进制数据,如,word,、,bmp,程序中定义的类对象。,char,存储固定长度的字符类型的数据,,(=8k),,实际定义,varchar,varchar,存储可变长度的字符数据,,(=8k),text,Text,用来存储大于,8k,的,ASCII,字符。,Datatime,Datetime,是日期类型,存储从,1753,年,1,月,1,日,-9999,年,12,月,31,日的日期,smalldatetime,存储,1900-1-1,到,2079-6-6,的日期。,bigint,8,字节长整型,int,4,字节整型,表达范围是,-2147483648-2147483647,。,smallint,2,字节整型,tinyint,一字节整型,Float,浮点数,在计算机里面的表达是一个近似植,例如,1.683,可能表达为,1.682999999999,decimal,浮点数,但表达是一个精确的值,money,货币类型,,8,字节,smallmoney,货币类型,,4,个字节,bit,占用一个二进制的位,经常作为布尔类型使用,smalldatetime,二战四巨头,富兰克林,德拉诺,罗斯福,约瑟夫,维萨里昂诺维奇,斯大林,温斯顿,伦纳德,斯宾塞,丘吉尔,蒋介石,字段的属性,字段长度,对于字符类型,例如,char,和,varchar,,定义字段的同时可以指定字段存放的字符的个数,例如定义姓名字段为,name varchar(20),,表示该字段最多存放,20,个字符。数值型的字段,除了,decimal,由用户自己定义长度和小数位数外,其他的如,int, float,等,系统自定义其占用的字节数。,小数位数,用于,decimal,和货币类型的字段,标识种子,用于数据库表的记录号的自动增加,经常用于做表中记录的主键。用于整型数值,.,默认值,当表中新增加一个记录时,又不想具体指定某个字段的值。可以给它一个默认的值。,非空,限制 用于限制字段的值不能为空,例如学生的姓名字段,每一个记录都必须有值,因为学生不能没有名字。,索引,对字段进行索引,可以通过设定该字段为查询条件来加快数据的检索速度和统计、分组的速度。,关键字,关系模式中的主键,用于唯一标识数据库表中的记录。,进入企业管理器,展开数据库,展开表,右键,选择创建表,输入字段名,确定每个字段的类型,保存,为表起名,作业 :在,scoreManager,中创建上表,字段的属性和约束该如何定义?,studentNo,studentName,courseNo,courseName,grade,010101,李灿,J01,数据库,99,010101,李灿,J04,操作系统,89,010101,李灿,L02,数值算法,78,010201,张简,J01,数据库,78,010101,李灿,J04,操作系统,91,020301,张名,F09,德语,98,010201,张简,F09,德语,100,Table t_studentVsCourse,创建表,作业,展开数据库,然后用鼠标右击,ScoreManager,数据库,选择所有任务,生成,SQL,脚本,。出现图导出,SQL,脚本对话框,在,”,常规,”,卡上,用鼠标点击,”,全部显示,”,按钮,然后选中,”,编写全部对象,”,复选框。,在,“,设置格式,”,卡中,一般选择,”,为每个对象生成,Create,命令,”,和,”,为每个对象生成,Drop,命令,”,两项就可以。,在,“,选项,”,卡上,根据需要,把,“,表脚本选项,”,下的选择项都选中,最后选择,“,确定,”,按钮 ,输入脚本的名字,作业:上交你创建的数据库,scoreManager,的,SQL,脚本,.,创建三个符合设计规范的表。并输入数据内容,自己保存数据库的备份,待以后使用,获得数据库的,SQL,脚本 *,用脚本迅速恢复数据库 *,先创建数据库,进入查询分析器,把脚本调入到查询分析器,执行,恢复数据库,简单的SQL 查询语句 Select,SELECT,字段,1,字段,2,| *,FROM,表名,WHERE,条件表达式,在查询分析器中执行SQL语句,从开始菜单进入查询分析器,选择数据库,输入,Select,语句,执行,学生课程成绩表 ? 有何缺陷,Table t_studentVsCourse,studentNo,studentName,courseNo,courseName,grade,010101,李灿,J01,数据库,81,010101,李灿,J04,操作系统,62,020301,张简,F09,德语,92,建立符合范式的表(作业内容),studentNo,name,birthday,sex,courseNo,courseName,studentNo,courseNo,score,030318,古待,1986-1-2,女,S01,高数一,020301,F09,98,020301,张名,1989-1-1,男,L02,数值算法,010101,L02,78,010201,张简,1981-2-2,女,J04,操作系统,010101,J04,89,030501,许昌,1987-9-8,男,F09,德语,010201,J01,79,030502,刘放,1988-1-9,男,F01,日语,010101,J04,91,010101,李灿,1981-9-2,男,J01,数据库,010101,J01,99,010503,顾争,1988-2-7,男,020002,郭洁,1988-1-5,女,学生表,tblStudent,课程表,tblCourse,学生修课表,tblSelectCourse,结构化查询语言,SQL,SQL,语言是一种关系数据库语言,是,结构化查询语言,(,Structured Query Language,)的缩写,它包括,查询,定义,操纵,控制,SQL,的使用方法有两种,用户交互的方式联机使用,称为交互式,SQL,;,另一种是作为子语言嵌入到其他程序设计语言中使用,称为嵌入式,SQL,。,SQL表达式,SQL,的表达式可分为两类:,值表达式,值表达式包括几种:,数值表达式:实现数值型数据的算术运算;,字串值表达式完成了字串的操作;,日期时间值表达式处理日期时间数据。,2.,逻辑表达式。,逻辑运算包括与(,AND,)、或(,OR,)、否(,NOT,)。,比较谓词(,=,、,、,、,!=,、,=,)、范围谓词(,IN,、,LIKE,、,IS,)和存在谓词(,EXIST,)。,函数,SQL,内置函数有三类:,统计函数,:COUNT,、,SUM,、,AVG,、,MAX,和,MIN,字串处理函数,len, substring,(studentName,1,2),大小写转换函数(,Upper,Lower,),时间日期处理函数。,getDate,(,返回当前日期时间,),。,Year(,dateTime,类型字段,),Month(dateTime,类型字段,),Day(dateTime,类型字段,),数据检索语句select,语法格式为:,SELECT ALL|DISTINCT,目标列,FROM,表,1,表,2,表,n,(或视图),as,表别名,inner | Left | right | full outer join,表,on,关系表达式,WHERE,条件表达式,GROUP BY,列名,HAVING,条件表达式,ORDER BY,列名,ASC/DESC,说明,DISTINCT,为去掉查询结果中重复的行,默认为,ALL,,既列出所有的记录;,目标列的格式可以写为:列名,1 as,别名,1,列名,n as,别名,n,,省略别名,返回的结果集中以列名标记,否则以别名标记,如果目标列用*表示,则返回表中的所有的列;,From,子句指明了从那些表或视图中得到数据,所有的列名都必须存在于,From,后的表中,或出现于,left join, inner join, full outer join,之后的表,如果列名存在于,From,后的多个表中,则必须标明该列来源于哪个表,格式为,表名,.,列名,;,目标列可以是,SQL,中的库函数或常数表达式。如,Sum,、,Count,、,Avg,等函数。,Select 语句,Where,子句有双重作用,一是返回需要的记录,另一种是建立多表之间的内连接联合查询。,GROUP BY,用来,对查询结果进行分组,把某一列值相同的记录分成一组,,与统计函数如,Sum,、,Count,等联合使用,;在有,Group,子句时,可以进一步使用,HAVING,子句对分组后的记过进行过滤显示,是分组提取条件;,ORDER BY,是查询结果的排序方式,后面跟,ASC,为升序,,DESC,为降序,默认为升序。,关系实例,studentNo,name,birthday,sex,courseNo,courseName,studentNo,courseNo,score,030318,古待,1986-1-2,女,S01,高数一,020301,F09,98,020301,张名,1989-1-1,男,L02,数值算法,010101,L02,78,010201,张简,1981-2-2,女,J04,操作系统,010101,J04,89,030501,许昌,1987-9-8,男,F09,德语,010201,J01,79,030502,刘放,1988-1-9,男,F01,日语,010101,J04,91,010101,李灿,1981-9-2,男,J01,数据库,010101,J01,99,010503,顾争,1988-2-7,男,020002,郭洁,1988-1-5,女,学生表,tblStudent,课程表,tblCourse,学生修课表,tblSelectCourse,SQL例,例,1,:查看学生表中的全部数据,即列出所有的学生,Select *,from tblStudent,这里,*,代表表中所有的列,,上述的语句等价如下的语句:,Select studentNo, studentName, birthday, sex,From tblStudent,这时,表中有多少条记录,数据库系统就列出多少条记录。,Where子句子,例,2,:查询学生表,tblStudent,中的全部女生的学号、姓名和年龄,Select studentNo, studentName, birthday,from tblStudent,where sex=,女,例,3,: 查询学生修课表中成绩大于,80,分的学生:,Select * from,tblSelectCourse,where score80,在,where,条件中,可以使用逻辑运算符和比较关系符,包括:,=,、,!=,、,、,、,=,。也可以使用关键字,如:,between,、,like,、,in,等。注意,如果值是字符串或者字符、日期类型的,就要用单引号把它括起来,例如例,2,中的,where,条件。,例,4,查询操作系统成绩在,70,到,80,之间的学生的学号,select studentNo,from tblSelectCourse,where score between 70 and 80 and courseNo=J003,日期型数据处理,罗列出每个同学的年龄,现在有了生日,当前日期可以用,getDate(),函数获得,日期型字段的年份可以用,Year,函数获得,Select year(getDate()- year(birthday),From tblStudent,order by,子句,例,5,:查询,02,级学生的选课信息,按学号从小到大排列。,由于学号的头两位代表学生的年级,所以可以这么完成,SQL,语句的编写:,Select studentNo,courseNo,from tblSelectCourse,where studentNo like 02%,order by studentNo,这里,%,代表任意个字符。,分组 group by,例,6,:求每个学生的课程总分,Select sc.studentNo, studentName, sum(score) as tot,from tblSelectCourse sc, tblStudent s,where s.studentNo=sc.studentNo,group by sc.studentNo, studentName,问题,:,统计男女生人数怎么求,?,group by,和,Having,子句,例,6,:求每个学生的课程总分,(,大于,260,分的同学罗列,),Select sc.studentNo, studentName, sum(score) as tot,from tblSelectCourse sc, tblStudent s,where s.studentNo=sc.studentNo,group by sc.studentNo, studentName having sum(score) 260,改为,having tot 260,对不对? 请你去测试一下,!,例,7,:,列出选修课程大于等于三门课程的学生,并按学号排序,select s.studentName,sc.studentNo, count(*) as courses,from tblStudent s, tblSelectCourse sc,where sc.studentNo=s.studentNo,group by sc.studentNo, s.studentName,having count(*)=3,order by sc.studentNo,内连接查询,例,8,查找高数一成绩在,80,分以上的学生的姓名、学号、年龄以及具体成绩。,分析:分析,tblSelectCourse,和,tblStudent,,通过,tblSelectCourse,可以得到学生的学号,但无法得到学生的名字和年龄,但缺少的信息可以通过表,tblStudent,得到,表,tblStudent,和,tblSelectCourse,的,studentNo,如果统一起来,就可以唯一得到所需要的信息,Select s.studentNo, studentName, year(getDate()-year(birthday), score,from tblStudent s, tblSelectCourse sc,where s.studentNo=sc.studentNo,and courseNo= S01 and score80,例,8,的另外的写法,Select s.studentNo, studentName, birthday, score,from tblStudent s,inner join tblSelectCourse sc on s.studentNo=sc.studentNo,where courseNo=S01 and score80,嵌套查询,例,9,:找出成绩,(,不分课程,),大于,80,分的学生的姓名,Select studentName,from tblStudent,where studentNo in,(select studentNo from tblSelectCourse where score80),这里,,select studentNo from sc where score80,返回一个集合,第二个查询使用,In,关键字,判定表,S,中的,studentNo,是否在返回结果集中。,关于分页查询,Select,top 5,studentNo,studentName,From tblStudent,where studentNo not in,(select top 5 studentNo from tblstudent),这样的语句就能翻到下一页,左连接查询,问题:班主任查询班级学生某门课的成绩表,如果一个学生没选,该课程,,用内连接查询能得到什么结果?,studentNo,name,birthday,sex,courseNo,courseName,studentNo,courseNo,score,030318,古待,1986-1-2,女,S01,高数一,020301,F09,98,020301,张名,1989-1-1,男,L02,数值算法,010101,L02,78,010201,张简,1981-2-2,女,J04,操作系统,010101,J04,89,030501,许昌,1987-9-8,男,F09,德语,010201,J01,79,030502,刘放,1988-1-9,男,F01,日语,010101,J04,91,010101,李灿,1981-9-2,男,J01,数据库,010101,J01,99,010503,顾争,1988-2-7,男,020002,郭洁,1988-1-5,女,学生表,tblStudent,课程表,tblCourse,学生修课表,tblSelectCourse,左连接 查询 Left join,Select studentName, a.studentNo, b.courseNo, courseName,From tblStudent a,Left join tblSelectCourse b on (a.studentNo = b.studentNo,And b.courseNo=F001),Left join tblCourse c on b.courseNo=c.courseNo,什么时候用左连接,左表在右表中对应的记录可能有,也可能没有的情况下,,SQL,数据更新语句,语法,数据更新语句,Update,SQL,的数据更新语句,Update,修改表中原有的数据记录,与,Select,语句不同,,Update,语句不存在多表联合操作,每个语句一次只能针对一个表。,Update,语法格式为:,update,表,set,字段名,=,表达式,字段名,=,表达式,. where,条件,Update 例子,例,11,:将所有学生的年龄加,1,岁,update tblStudent set age = age+1,例,12,:将学号为,011101,的学生的,J01,课程成绩加,5,分,update tblSelectCourse set score= score+5,where studentNo=,011101,and courseNo =,J01,插入新记录语句,Insert,语法,insert into,表名,(,字段名,字段名,2,),values,(,值,1,值,2,值,n),注:,1,、不允许为空的字段,并且没有字段默认值的字段,必须出现在字段列表中,.,2,、如果不写字段名列表,则必须按表结构定义的字段顺序,在,values,后定义值的序列,.,3,、标识种子字段不用管,Insert 举例,例,13,向学生表中插入一个新同学,数据为,0300101,, 张三,男,,21,岁,insert into tblStudent values(030101, ,张三, 21, ,男,),比较下例,insert into tblStudent(studentName, studentNo) values(,汪于人, 980145),放弃了性别和年龄的输入,如果表,tblStudent,的,age,和,sex,字段允许为空,则上面的语句向数据库中插入的记录中,这两个字段的值是,Null,。如果,age,和,sex,有默认值,则取默认值,.,例,14,向修课表中插入一个新的选课记录,成绩暂时不定,insert into tblSelectCourse(studentNo, courseNo) values(030101, J04),删除记录,delete,语法,delete from,表名,where,条件,Delete 举例,例,15,删除表,tblSelectCourse,中,011101,的德语选课记录,delete from tblSelectCourse,where studentNo=010101 and courseNo=F09,Sql作业 写SQL语句,将数据库恢复,(,自己的准备工作,),罗列出所有可选的课程的课程号,课程名。,罗列出所有学生的姓名、学号,年龄,(,库里是生日,),。,罗列出学号、姓名,所选课程的总分,按总分从大到小次序排列。,罗列出学号、姓名、课程号、课程名、成绩,按学号从小到大排列,
展开阅读全文