第一篇:数据库连接概念语句总结全
连接运算
连接是根据给定的条件,从两个已知关系R和S的笛卡尔积中,选取满足连接条件(属性之间)的若干元组组成新的关系。记作:,其中F是选择条件
1.条件连接:从两个关系的笛卡尔积中选取属性间满足一定条件的元组。
2.相等连接:从关系R与S的笛卡尔积中选取满足等值条件的元组。
3.自然连接:也是等值连接,从两个关系的笛卡尔积中,选取公共属性满足等值条件(属性相同)的元组,但新关系不包含重复的属性。
4.外连接
是在连接条件的某一边添加一个符号“*”,其连接结果是为符号所在边添加一个全部由“空值”组成的行。
4.1 外连接:
如果把舍弃的元组保存在结果关系中,而在其他属性上填空值(NULL),这种连接就叫做外连接(outer join)。1.R和S作自然连接:把满足R.B=S.B条件的元组保留在新关系中。
2.把不满足R.b=S.B条件的元组也保留在新关系中,相应的值填空。
左外连接:
如果只把左外关系R中要舍弃的元组保留就叫做左外连接(left join)。
右外连接:
如果只把右外关系S中要舍弃的元组保留就叫做右外连接(right join)。
【例】:
1.左外连接
左向外联接的结果集包括 left outer 子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值(null)Sql: select * from table1 left join table2 on table1.id=table2.id;
注释:包含table1的所有子句,根据指定条件返回table2相应的字段,不符合的以null显示
2.右外连接
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。Sql: select * from table1 right join table2 on table1.id=table2.id;
注释:包含table2的所有子句,根据指定条件返回table1相应的字段,不符合的以null显示
3.完整外部联接:full join 完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。Sql: select * from table1 full join table2 on table1.id=table2.id;
2.内连接 join 或 inner join 条件连接
概念:内联接是用比较运算符比较要联接列的值的联接(写清楚on以后的条件)
select * from table1 inner join table2 on table1.id=table2.id;
3.自然连接(natural join)默认两个表里字段相等的连接。
自然连接得到的结果表中,两表中名称相同的列只出现一次.select * from employee natural join department;
第二篇:数据库语句总结
实验四
1、建立数据库
createdatabaseTSJY on(name=TSJY, filename='E:TSJY.mdf', size=10MB, maxsize=100MB, filegrowth=1MB)logon(name='TSJY_log', filename='E:TSJYT.ldf', size=5MB, maxsize=50MB, filegrowth=1MB);
2、建表
useS_T createtableStudent(Snochar(11)notnullprimarykey, Snamechar(8)notnull, Ssexchar(2)notnull, SageTinyintnotnull, Sdeptchar(10)notnull check(Ccredit >=1 and Ccredit <=6)(学分取1-6的整数)check(Grade >=1 and Grade <=100)(成绩在0-100之间));
3、将course表的cpno的长度改为3 altertableCoursealtercolumncpnochar(3)
4、给student表中的ssex列的增加默认约束,默认值为“男”
altertableStudentaddconstraintdf_Student_Ssex default'男'forSsex;
5、为course表增加一列teacher,char(8)altertableCourseaddteacherchar(8);
6、删除course表的teacher列
altertableCoursedropcolumnteacher;
7、插入数据
insertintoS(SNO,SNAME,STATUS,CITY)values('S1','精益','20','天津'),('S2','盛锡','10','北京'),('S3','东方红','30','北京'),('S4','丰泰盛','20','天津'),('S5','为民','50','上海');
8、为S表设一个主键
altertableSaddprimarykey(SNO);
9、为S表增加一个唯一索引s_sno createuniqueindexs_snoonS(SNO);为SPJ表增加索引spj_sno_pno_jno,要求索引列sno用降序,pno、jno用升序
createindexspj_sno_pno_jnoonSPJ(SNOdesc,pno,jno);为HISD的Doctor表按医生ID(dID)升序建立唯一索引
createuniqueindex Dindex on Doctor(dID)
为HISD的Doctor表按医生ID(dID)降序建立唯一索引
createuniqueindex Dindex on Doctor(dID desc)
10、为SPJ表加外键约束(若建表时已经建立外键,可以先删除某个已有外键,重新建立
altertableSPJaddconstraintFK_SNOforeignkey(SNO)referencesS(SNO);altertableSPJaddconstraintFK_PNOforeignkey(PNO)referencesP(PNO);altertableSPJaddconstraintFK_JNOforeignkey(JNO)referencesJ(JNO);
11、为SPJ表增加列qty的检查约束,要求qty>0 altertableSPJaddconstraintCK_SPJ_qtycheck(qty>0);
12、删除SPJ表的检查约束CK_SPJ_qty altertableSPJdropconstraintCK_SPJ_qty
13、查询全体学生的学号与姓名
select Sno,Sname FROM Student
14、查询全体学生的基本信息
select * FROM Student
15、查询全体学生的姓名、出生年份及所在系
uses_t SELECTSname,year(getdate())-sagebirthyear,sdept FROMstudent
16、查询选修了课程的学生学号。(掌握distinct的用法)
SELECTdistinctSnoFROMSC
17、查询年龄在18-20岁间的06级的学生姓名及学号
SELECTSname,SnoFROMstudentWHERESageBETWEEN 18 AND 20 ANDSNOlike'2006%'
18、查询信息系(IS)、数学系(MA)和计算机科学系(CS)学生的姓名和性别
SELECT Sname,Ssex
FROM Student WHERE Sdept IN('IS','MA','CS');
19、查找所有姓李的学生的信息
SELECT*FROMstudentwhereSnamelike'李%' 20、查找所有已选修但没有成绩的学生学号。
selectSno fromSC whereGradeisnull
21、对所有已选课的学生按学号进行升序排列,同时要求每个学生按成绩降序排列。(掌握order by的用法)
selectSno,Grade fromSC orderbySno,Gradedesc
22、统计每门课程的选课人数。(掌握group by用法)
selectcourse.Cname,COUNT(sc.Cno)as人数
fromcourse,SC wherecourse.Cno=SC.Cno groupbyCname
23、统计重名的学生姓名及人数。
selectSname,COUNT(*)as人数 fromstudent groupbySname havingCOUNT(*)>1
24、统计男生与女生的人数。
selectssex,COUNT(sno)cnt fromstudent groupbyssex
25、查询“计算机系”年龄最大的学生的基本信息。
select* fromstudenta whereSage=(selectMAX(Sage)fromstudentb whereSdept='计算机系')
实验五
26、打出所有供应商的姓名和所在城市。
useSPJ selectSNAME,CITY froms
27、找出所有零件的名称及重量。
useSPJ selectPNAME,WEIGHT fromp
28、统计每个供应商供应的各种零件数量。
selectPNAME,COUNT(PNAME)cnt fromP,SPJ whereP.PNO=SPJ.PNO groupbyPNAME
29、求供应工程J1零件的供应商号码SNO。
useSPJ selectdistinctsno fromspj wherejno='j1' 30、求供应工程J1零件P1的的供应商号码SNO。
useSPJ selectdistinctsno fromspj wherejno='j1'andpno='p1' 实验六
31、求所在的城市为直辖市的供应商的名称。
selectSnamefromswherecityin('北京','天津','重庆','上海')
32、求供应红色零件的供应商号,零件号和数量。
selectSNO,PNO,QTYFROMSPJ wherePnoIN(SELECTpnoFROMp whereColor='红')
33、没有使用天津供应商生产的红色零件的工程号JNO。
selectdistinctJNOfromSPJwhereJNOnotin(selectJNOfromSPJ,P,SwhereSPJ.PNO=P.PNO
andSPJ.SNO=S.SNOandP.COLOR='红'andS.CITY='天津')
34、求供应数量超过300的供应信息,包括供应商名,零件名,项目名和供应数量。
selectSNAME,PNAME,JNAME,QTYfromSPJ,S,P,J whereS.SNO=SPJ.SNOandP.PNO=SPJ.PNO
andJ.JNO=SPJ.JNOandQTY>300
35、至少使用了供应商S1所供应的全部零件的工程号JNO。
selectPNOfromSPJwhereSNO='S1';selectJNOfromSPJwhere(PNO='P1'andSNO='S1')intersectselectJNOfromSPJwhere(PNO='P2'andSNO='S1')
36、找出使用供应商S1所提供零件的工程号码。
selectdistinctJNOfromSPJwhereSNO='S1'
37、找出工程项目J2使用的各种零件的名称及其重量。
selectPNAME,WEIGHTfromP,SPJ whereSPJ.PNO=P.PNOandJNO='J2'
38、找出上海厂商供应的所有零件号码。
selectPNOfromS,SPJwhereS.SNO=SPJ.SNO andS.CITY='上海'groupbyPNO
39、找出使用上海产的零件的工程名称。
selectJNOfromS,SPJ whereS.SNO=SPJ.SNOandS.CITY='上海' groupbyJNO
40、找出没有使用天津产的零件的工程号码。
selectJNOfromSPJwhereSPJ.JNOnotin(selectJNOfromS,SPJwhereS.SNO=SPJ.SNOands.CITY='天津')
41、查询‘IS’系学生的学号、所选课程名称及该门课程的成绩。
selectSC.Sno,Cname,GradefromSC,Course,student wherestudent.Sno=SC.SnoandCourse.Cno=SC.CnoandSdept='数学系'
42、查询‘CS’系成绩不及格的学生姓名。
selectdistinctSnamefromStudent,SC wherestudent.Sno=SC.SnoandGrade<60 andSdept='计算机系'
43、查询每一门的课程的间接先修课程。
selectfirst.Cno,second.Cpno fromCoursefirst,Coursesecond wherefirst.Cpno=second.Cno
44、查询所有的学生的选课情况,要求没有选课的情况也能在结果显示出来。
selectStudent.*,sc.CnoFROMStudentLEFTJoinSCon SC.Sno=Student.Sno
45、查询每个学生超过他选修课程平均成绩的课程号,课程名称及成绩。
selectx.Cno,Cname,Grade
fromSCx,Coursewherex.Cno=Course.CnoandGrade>(selectAVG(Grade)fromSCywherex.Sno=y.Sno)
46、查询‘IS’系的学生以及‘数据库系统原理’成绩在70~80之间的学生。
selectSnamefromStudent,Course,SC
whereStudent.Sno=SC.SnoandCourse.Cno=SC.Cno andCourse.Cname='数据库系统原理'andGradebetween'70'and'80' andSdept='数学系'
47、用两种方法实现:选修了001课程和002课程的学生学号。
方法一:selectSnofromSCwhereCno='1'intersect selectSnofromSCwhereCno='2' 方法二:selectSnofromSCwhereCno='2'andSnoin(selectSnofromSCwhereCno='1')
48、查询至少选修了学生001课程和002课程的学生学号。
selectdistinctSnofromSCAwherenotexists(select*fromSCBwhere(Cno='1'orCno='2')andnotexists(select*fromSCCwhereC.Sno=A.Sno andC.Sno=B.Sno))实验七
49、建一新表,并将所有学生的学生的学号、平均成绩增加到其中。
createtableavgrade(snochar(11)primarykeynotnull, avgranumeric(3,1))insertintoavgrade(sno,avgra)selectsno,avg(Grade)fromSCgroupbySno 50、假设所有的学生都选了‘008‘课程,如何将记录插入选修表中。
insertintoSC(sno,cno)selectsno,'008' fromstudent
51、将所有CS系的成绩不及格学生的成绩加5分。
updateSC setgrade=grade+5 where'计算机系'=(selectsdept fromstudent,sc
wherestudent.Sno=sc.Snoandgrade<60)
52、删除选了‘数据库’数据库的学生的选课记录。
delete fromSC wherecno=(selectcnofromcoursewhereCname='数据库')
53、删除所有的学生记录。
delete
fromstudent
54、把全部红色零件的颜色改成蓝色。
updatep setcolor='蓝' wherecolor='红'
55、由S5供给J4的零件P6改为由S3供应。
updatespj setsno='s3' wheresno='s5'andjno='j4'andpno='p6'
56、从供应商关系中删除供应商号是S2的记录,并从供应情况关系中删除相应的记录。
deletefroms wheresno='s2' deletefromSPJ wheresno='s2'
57、请将(S2,J6,P4,200)插入供应情况关系。
insertintospj(sno,pno,jno,qty)values('s2','j6','p4','200')
实验八
58、为“图书”的“分类号”建立一个索引ts_flh。
createindexts_flhontushu(fenleihao)
59、为“借阅”表建立一唯一索引jycx,要求按“借书证号”升序,“借书日期”降序。
createindexjycxonjieyue(cardID,jdatedesc)
60、为“管理员”表建立一检查约束,要求“基本工资”在(100,10000)之间。
altertableadministratoraddconstraintCK_administrator_gongzi
check(gongzibetween 100 and 10000)
61、建立“借阅”与“图书”及“读者”表之间的参照关系。(增加借阅表的外键约束)
altertablejieyueaddconstraintFK_IDforeign key(ID)referencestushu(ID)altertablejieyueaddconstraintFK_cardIDforeign key(cardID)referencesduzhe(cardID)
62、查询出“图书”数据库中作者姓“刘”的所有图书。SELECT*FROMtushuwherewriterlike'刘%'
63、查询出“图书”数据库中高等教育出版社出版的、单价低于25元的所有种类的图书。
select*fromtushuwhereaddress='高等教育出版社'andprice<25 64、求出“读者”数据库中的总人数。
selectCOUNT(*)fromduzhe 65、求出“图书”数据库中的所有图书的最高价、最低价和平均价。
selectMAX(price)as最高价,MIN(price)as最低价,AVG(price)as平均价fromtushu 66、求出“借阅”库中借书证号为“112”的所借图书的册数。
selectcardID,COUNT(*)as册数fromjieyuewherecardID='112'groupbycardID 67、按分类号降序显示“图书”库中各种图书的分类号、书名合作者。
selectfenleihao,bookname,writerfromtushuorderbyfenleihaodesc 68、按单价升序显示“图书”库中的高等教育出版社出版的所有图书。
select*fromtushuwhereaddress='高等教育出版社'orderbyprice
69、按单价升序显示出“图书”库中由清华大学出版社和电子工业出版社出版的所有图书。
select*fromtushuwhere(address='高等教育出版社'oraddress='电子工业出版社')orderbyprice 70、按书名和作者分组统计出“图书”库中每种图书的数量。
selectbookname,writer,COUNT(*)as数量fromtushugroupbybookname,writer 71、统计出“图书”数据库中15至25元之间的图书数量。
selectcount(*)as数量fromtushuwherepricebetween 15 and 25 72、查询出“图书”数据库中书名中含有“应用基础”字串的所有图书。
select*fromtushuwherebooknamelike'应用基础%' 73、分组统计出“借阅”数据库中每一种借书证号所借图书的册数。
selectcardID,COUNT(*)as册数fromjieyuegroupbycardID 74、按单位分组统计出“读者”数据库中每个单位的人数。
selectdanwei,COUNT(*)as人数fromduzhegroupbydanwei
75、分组统计出1997年底以前借阅不低于2本图书的借书证号和数量。
selectcardID,COUNT(*)as人数fromjieyuewherejdate<'1997-12-31' groupbycardIDhavingcount(*)>=2 76、联接查询“借阅”库和“图书”,得到借阅每一本书的信息。
select*fromtushu,jieyuewheretushu.ID=jieyue.ID
77、联接查询“借阅”库和“读者”库,得到每一个以借阅者的借书证号、姓名、单位。
selectduzhe.cardID,name,danweifromduzhe,jieyuewhereduzhe0..cardID=jieyue.cardID
78、联接查询“借阅”、“读者”、“图书”三个库,得到每一本所借图书的读者的借书证号、姓名、单位、书名。
selectduzhe.cardID,name,danwei,booknamefromduzhe,jieyue,tushu
whereduzhe.cardID=jieyue.cardIDandtushu.ID=jieyue.ID 79、从“图书”数据库中(通过对“借阅”库的嵌套)查询出所有被借图书的信息。
select*fromtushuwhereIDin(selectIDfromjieyue)80、按单位分组统计出被借图书的数量。
selectdanwei,COUNT(*)as数量fromduzhe,jieyuewhereduzhe.cardID=jieyue.cardIDgroupbydanwei 81、按单位分组统计出借阅图书的人数。
selectdanwei,COUNT(*)as人数fromduzhewherecardIDin(selectdistinctcardIDfromjieyue)groupbydanwei 82、从读者库中查询出每个借阅图书的读者的情况。
select*fromduzhewherecardIDin(selectdistinctcardIDfromjieyue)83、查询‘管理员’表中职称为教授或副教授,并且在1950年(含该年)以后出生的所有职工记录。
select*fromadministratorwherezhicheng='教授'orzhicheng='副教授'andbirth<=1950 84、查询‘管理员’表中基本工资在250到380元之间的职工记录。
select*fromadministratorwheregongzibetween 250 and 380 85、将基本工资小于500的管理员,工资加上100元。
updateadministratorsetgongzi=gongzi+100 wheregongzi<500
86、列出藏书在十本以上的图书(书名、作者、出版社)。
selectbookname,writer,addressfromtushuwherecangshuliang>10
87、“数据库系统原理教程,王珊编,清华大学出版社,1998年出版”还有几本?
selectkucunfromtushuwherebookname='数据库系统'andwriter='王瑞'andaddress='清华大学出版社' 实验九
88、请为三建工程项目建立一个供应情况的视图,包括供应商代码(SNO)、零件代码(PNO)、供应数量(QTY)。针对该视图完成下列查询:
CREATEVIEWVSPASSELECTSNO,PNO,QTYFROMSPJ,JWHERESPJ.JNO=J.JNOANDJ.JNAME='三建'
89、找出三建工程项目使用的各种零件代码及其数量。
SELECTPNO,sum(QTY)FROMVSPgroupbyPNO 90、找出供应商S1的供应情况。
SELECTdistinct*FROMVSPWHERESNO='S1' 91、建立信息系学生的视图(用with check option子句),并向该视图中插入类似以下的语句:
insert into is_student1(sno,sname,sage)values(‘20051100101’,‘王一’,20)
是否合理?如何更改?
createviewIS_student as selectsno,sname,sagefromstudent wheresdept='IS' withcheckoption 不合理(sno,sname,sage)不用
92、建立信息系选修了001号课程的学生的视图。
createviewIS_S1 as selectstudent.sno,sname,gradefromstudent,sc wheresdept='IS'andstudent.sno=sc.snoandcno='1' 93、在第(2)题创建的视图的基础上建立信息系选修了1号课程且成绩在90分以上的学生的视图。
createviewIS_S2 as
selectstudent.sno,sname,gradefromstudent,sc wheresdept='IS'andstudent.sno=sc.snoandcno='2'andGrade>=90 94、试图删除“选修”表(SC表),看看第(2)题与第(3)题建立的视图是否存在。
deletefromSC 不存在
第三篇:数据库语句
sp_helpdb----------查本服务器中所有数据库 可跟库名 例:sp_helpdb 库名
------------------------------sp_databases-------------查看本服务器中可用的数据库------sp_helpfile-------------------查看当前工作着的数据库----------------------------sp_helpfilegroup---------------查看当前工作着的组的信息。可加参数,跟组名 例:sp_helpdb 库名
--sp_renamedb-----------改数据库名 例:sp_renamedb 旧库名,新库名
--select groupname from sysfilegroups where status=24---------查看文件组 =8是查只读文件组 =16是查默认文件组 =24是查即只读又默认-------------sp_dboption----------修改数据库选项值 例:sp_dboption 库名 选项 值
值决定真假 一般用:true/faule 或off/on表示
选项一般常用为:use only(数据库拥有者)single user(单一用户)read only(只读)------------dbcc shrinkdatabase---------收缩数据库 例:dbcc shrinkdatabase(库名,10)收缩库,剩余空间保留10%,后面如果不加notruncate,则释放空间操作系统,加truncateonly,归还空间给操作系统,但忽略所给的百分比数值。--------dbcc shrinkfile---------收缩文件 用法与ddcc shrinkdatabase相同。
--------alter database---------------修改数据库
用法:这是起始句,告诉要做的是修改数据库,然后再接要做什么工作。每次只做一项工作 alter database 库名
add file 文件名....to filegroup 文件组名
----------------增加库文件,格式与建库时括号里指定大小时的格式一样 add log file 文件名-------------增加日志文件 remove file 文件名---------删除库内的文件
add filegroup 文件组名-----------增加一个文件组 modify file 文件名-------------修改文件属性
modify filegroup 组名------------修改文件组属性-------------drop database--------------删除数据库
例:drop database 库名1,库名2---------可同时删除两个库----------create table 表名(列名 类型, 列名 类型)-------------------建立表
------select * from 表名---------查询表结构
------select @@dbts----------查询最后一次操作------insert into 表名(列名,列名)values(变量,变量.....)------------向表中插入数据
如省略列名,则必须把每列的变量填全,不可缺少。可以省略 into------sp_addtype 自定义类型名 系统类型名-------用户自定义类型------sp_droptype 自定义类型名-----------删除自定义类型 如有数据库正在使用该自定义类型,则不能删除------alter table---------修改表结构 用法: alter table 表名
alter column 列名 类型---------修改列的类型 drop column 列名--------删除列
add(column)列名--------增加列,实际用时不加 column---sp_help-------------查看数据库中对象信息 用法: sp_help 表名---------------查表的信息 或 sp_help 库名--------------查库信息
后面可以跟库名或者表名,是查数据库或者表的信息---sp_spaceused--------查看对象占用的空间信息 用法: sp_spaceused----------查当前库占用空间信息 或 sp_spaceused 表名----------查指定表占用空间信息
后面可以加表名查看表占空间信息。如不加,则查看当前数据库。----sp_depends------------查看对象的相关性 用法: sp_depends 表名-----------后面加表名----sp_rename---------------重新命名
用法: sp_rename 旧表名,新表名---------改表名
或 sp_rename '表名.旧列名','新列名' 'column'-------修改列名------create index--------------创建索引
用法: create index 索引名 on 表名(列名)------创建索引 或: create unique clustered index 索引名 on 表名(列名)------创建簇集唯一索引 unique是建唯一索引 clustered是建簇集索引---非簇集索引用:nonclustered--------select top---------查表中前几行
用法: select top 3 * from 表名-------查表中前三行
或: select top 10 percent * from 表名-------显示表中前10%数据------------加入percent是百分比的意思。只以大于的最小整数,无小数--------select 列名,列名,列名 from 表名-------显示表中特定的列--------select *,列名 from 表名----------查询表中所有,后面再加一列--------select distinct----------查询不重复数据 distinct用于去掉重复数据 用法: select distinct * from 表名---------查表中不重复数据
或: select distinct * into 新表名 from 旧表名------查旧表中不重复数据同时生成新表-----------------------select 列名+列名 from 表名-------允许有计算式出现,显示无列名的计算结果 如想加列名,则: select 列名+列名 as 新列名 from 表名-----------select 年龄,联系电话,cast(年龄 as varchar(2))+联系电话 from 表名--------把整型数据年龄转化为字符型与字符型数据联系电话相加--------------ctrl+o(字母O)--------清空数据。空值与别的数据运算结果为空--------------select 原始列名 别名 from 表名 select 原始列名 as 别名 from 表名 select 别名=原始列名 from 表名
--------指定别名的三种方法。非法符号可''或[]引起来,不得直接使用。--------------select * from 表名
where 年龄 between 20 and 30---------显示年龄在20到30之间的人-------between是从条件一到条件二之间的限制---------select * from 表名
where 年龄 in(20,21,22)---------显示年龄为20、21、22的人--------in是限制在这些条件内的,是显示一个取值范围---------select * from 表名
where 联系电话 like '[1-3]%'--------查电话是1-3开头的人--------like是像这些条件的语句,能用通配符:%、_、[]、[^]--------意思分别代表:所有字符、一个字符、一位上可取值、一位上不可取值--------select * from 表名 where 姓名 like '[e[]%' or 姓名 like '%e]' escape 'e'------------显示以‘[’开头或以‘]’结尾的所有数据,中间有不显示----------escape ''是指定通配符
---------------order by---------给数据排序 用法: select * from 表名
order by 年龄-----------排序显示年龄。默认为升序(asc)要降序必须加desc----------select distinct top 3 from 表名
order by 年龄 desc--------显示最大的三种年龄-----------select * from 表名
where 年龄 in(select distinct top 3 年龄 from 表名 order by 年龄)order by 年龄-----------显示年龄最小的所有人,并排序-----------select 姓名, case when MCSE成绩 >=80 and MCSE成绩<=100 then '考的不错' when MCSE成绩 >=60 and MCSE成绩<80 then '考的一般' when MCSE成绩 >=0 and MCSE成绩<60 then '不及格' when MCSE成绩 is null then '这小子没考试' else '异常数据' end MCSE成绩 from 表名
-----------判断语句 null是空值的意思,不能用等号连接,只能用is-----------case到end为一列里的判断,case在这里是取值,结果用于输出,不显示原值---------------select 列名1, case 列名2 when 1 then '男生' when 0 then '女生' else '未知' end from 表名
--------这里case取列名,是用于这一列每项取值比较,在这里列名2用的是bit型数据-----------select * into 库1.表1 from 库2.表2-----------把库2中表2移到库1中
----------数据维护三个命令: insert---------向表中插入数据 update---------修改表中的数据 delete---------删除表中的数据
----------insert into 表名-----------(into可有可无)(列1,列2,列3,列4)-----------表的原始列,用括号括起来 values----------有这条命令只能插入一条数据(数1,数2,数3,数4)----------插入的数值
---------可以省略原始列清单,但必须把所有列都赋值----------insert into 表1(列1,列2,列3,列4)select * from 表2 where sex=1----------将表2中sex列等于1的数据信息插入表1中-----------update 表名 set 姓名='丁一' where 姓名='李一'----------把表中姓名叫李一的改为丁一。------------where后面跟定位的列与值
-----------update 表名 set 学号=14, 姓名=陈强
where 学号=1------------把学号为1的同学改为学号14,姓名陈强---------update 表名
set 学号=年龄+7, 姓名='陈一强', 年龄=29 where 学号=14
-------把学号为14的同学资料改为年龄加七赋给学号姓名改为陈一强,年龄改为29-------如果没用where定位,则修改全部值
----------delete 表名
where 学号>30---------把学号大于30的资料删除
--------如不指定条件,则删表内所有数据。这是记录日志文件的操作--truncate table 表名
-------清空表。不记录日志文件的操作。
------create view 图名-------------新建视图 用法: create view 图名 as select 列名 from 表名----------------syscomments------------这个表存着视图代码的信息----------------alter view 图名 with encryption as
select 列名 from 表名-----------用with encyption语句给视图原代码加密-------------不可恢复,除非保留源代码
----------------sp_helptext 图名-----------查看视图源代码
---------------select text from syscomments where id =(select id from sysobjects where name ='图名')---------查视图的代码
---------------create view 图名 as select * from 源图名------------基于源图创建新视图---------------create view 图名 as select 列1 as 新列1,列2 新列2,列3=新列3---------起别名的三种方法 from 表名-----------在新视图中为列起别名,则所见的是新起的别名---------------sp_depends 表名-----------查该表的相关性,有多少表、图与之相关。-----------------create view 图名 select * from 表名 where 年龄<20 with check option---------强制插入数据符合年龄小于20的条件,加在where后面-----------是约束insert和update语句的
-----------------select 男公民.姓名,女公民.姓名 from 男公民,女公民 where 男公民.配偶编号=女公民.编号
------------查结婚男女。较原始的语法,后被下列语法取代 或: select 男公民.姓名,女公民.姓名
from 男公民 join 女公民 on 男公民.配偶编号=女公民.编号-------新的形式,在join之前省略了inner语句。
--可用左连接(*=或left outer join)右连接(=*或right outer join)全连接(full outer)----where不能做全连接,但可以做连接的约束 select * from 男公民
where 配偶编号 in(select 编号 from 女公民)--------嵌套查询,查配偶编号在女公民表中编号列中出现过的-----------------select distinct 客户表.*
from(select * from 订单表 where 订单年份=2004)as d,客户表 where d.客户号=客户表.客户号
-----子查询放在from身后,也可以放在where身后--------------select(select 子查询语句)from 表名
-------这种格式要求子查询查出的必须是唯一的数据--------------select a.员工编号,a.员工姓名,b.员工姓名 as 领导姓名 from 员工表 as a,员工表 as b where a.部门领导编号=b.员工编号
select a.员工编号,a.员工姓名,b.员工姓名 as 领导姓名
from 员工表 as a join 员工表 as b on a.部门领导编号=b.员工编号
select a.员工编号,a.员工姓名,(select 员工姓名 from 员工表 as b where a.部门领导编号=b.员工编号)as 领导姓名 from 员工表 as a---------三种查询员工领导的方法
------如果里面总经理领导编号是这空的,这种查询方法不显示空值。如要显示,则用左连接---------------sp_tables-----------查当前数据库中的所有表
----------------select * from 男公民
union------------联合。自动升序排序,并去掉重复语句 select * from 女公民
-----查询结果是男公民和女公民表的总集。如果不去掉重复的,则用 union all-----如果要降序排,则要在最后一个select语句后面加上order by 列名 desc-----用union查询时,结果集内列数必须相同,并且数据类型必须相互兼容-----多表联合查询加order by时,后面必须跟第一个结果集的列名----------------select top 2 成绩 from 表
order by 成绩 desc---------查前两种最好成绩
-----------------select top 2 with ties 成绩 from 表
order by 成绩 desc---------查前两种最好成绩所有人的信息-----------------select top 1 a.成绩
from(select distinct top 3 成绩 from 表 order by 成绩 desc)as a order by 成绩---------嵌套查询,查考成绩第三名的值-----------------select max(SQL成绩),min(MCSE成绩)from 表-----查SQL最高分和MCSE最低分
-----常用的函数:max(最大),min(最小),sum(总和),avg(平均值)-----count(*)统计表内数据的行数。count(列名)统计表内列里非空值的行数-----------------select count(*)from 表名--------查表内有多少行数据-----------------select count(列名)from 表名------------查表内列中有多少行非空数据-----------------select min(成绩),max(成绩),sum(成绩),avg(成绩),count(*),count(成绩)from 表名--------返回显示数据只有一行。中间不能加列名,如想加,可以在后面加列。-----------------group by---------分组统计,后面跟的是列名
---------上面select检索多少原始列,后面group by就要跟多少原始列 例: select 性别,avg(年龄)from 表名
group by 性别-------统计性别的平均年龄
-----------------select 年龄,avg(年龄)from 表名 where 年龄<23 group by 年龄-------查年龄小于23岁的各年龄段平均年龄-------或也可用如下方法:
select 年龄,avg(年龄)from 表名 group by 年龄
having<23-------having是统计之后的条件,where是统计之前的条件--------having是做为group by的子句出现的,不能单独使用----------------select 年龄,avg(年龄)from 表名 where 年龄<23 group by all 年龄-------显示所有年龄,但只统计年龄小于23的,大于23的显示空值----------------select 品牌,颜色,sum(价格),avg(价格)from 汽车表 group by 品牌,颜色
with cube-------多维统计,按不同品牌不同颜色统计,也是group by的子句--------其结果出现把各品牌统计一下,最后再统计所有品牌、所有颜色的总统计----------------select 品牌,颜色,sum(价格),avg(价格)from 汽车表 group by 品牌,颜色
with rollup------只按第一列统计,也是group by的子句---------即统计品牌各颜色和所有品牌所有颜色的总统计----------------select 品牌,颜色,价格 from 汽车表
compute sum(价格),avg(价格)----------出现两个结果集------------查原始列,另外统计所有的总和与平均值
-----------------select 品牌,sum(价格),avg(价格)from 汽车表
group by 品牌------只对汽车品牌进行统计。进行分组的列不一定用来统计----------------select 品牌,颜色,价格 from 汽车表 order by 品牌
compute sum(价格),avg(价格)by 品牌
--------按品牌分组统计。分别显示品牌各款,然后再显示函数计算值----------------exists--------存在。相当于一个判断开关。说对了执行,说错了放弃 用法: select * form 表名
where exists(select * from 表名 where 性别='男')------如果存在性别为男的,执行查询。如果不存在,则不执行命令。---------------数据完整性:1.实体完整性----用unique(唯一)或主键控制,数据不能重复
2.值域完整性----用check控制。控制的是列中不能有非法数据
3.引用完整性----一列的取值完全依赖于前一列时,用这个。
4.用户自定义完整性
----------------create table 表名
(列1 int primary key,--------设置列级主键,紧跟在设置列的后面。列2 int)-----------------create table 表名(列1 int, 列2 int, primary key(列1))--------设置表级主键,放在建表语句的最后面。-----------------create table 表名
(列1 int constraint pk_表 primary key, 列2 int)
--------把列1设为主键,并且起名叫:pk_表。constraint是命名的命令
第四篇:JDBC连接数据库经验总结
Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。
一、连接各种数据库方式速查表
下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。
1、Oracle8/8i/9i数据库(thin模式)
Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();String url=“jdbc:oracle:thin:@localhost:1521:orcl”;//orcl为数据库的SID String user=“test”;String password=“test”;Connection conn= DriverManager.getConnection(url,user,password);
2、DB2数据库
Class.forName(“com.ibm.db2.jdbc.app.DB2Driver ”).newInstance();String url=“jdbc:db2://localhost:5000/sample”;//sample为你的数据库名 String user=“admin”;String password=“";Connection conn= DriverManager.getConnection(url,user,password);
3、Sql Server7.0/2000数据库
Class.forName(”com.microsoft.jdbc.sqlserver.SQLServerDriver“).newInstance();String url=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb“;//mydb为数据库 String user=”sa“;String password=”“;Connection conn= DriverManager.getConnection(url,user,password);
4、Sybase数据库
Class.forName(”com.sybase.jdbc.SybDriver“).newInstance();String url =” jdbc:sybase:Tds:localhost:5007/myDB“;//myDB为你的数据库名
Properties sysProps = System.getProperties();SysProps.put(”user“,”userid“);SysProps.put(”password“,”user_password“);Connection conn= DriverManager.getConnection(url, SysProps);
5、Informix数据库
Class.forName(”com.informix.jdbc.IfxDriver“).newInstance();String url = ”jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;user=testuser;password=testpassword“;//myDB为数据库名 Connection conn= DriverManager.getConnection(url);
6、MySQL数据库
Class.forName(”org.gjt.mm.mysql.Driver“).newInstance();String url =”jdbc:mysql://localhost/myDB?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1“ //myDB为数据库名
Connection conn= DriverManager.getConnection(url);
7、PostgreSQL数据库
Class.forName(”org.postgresql.Driver“).newInstance();String url =”jdbc:postgresql://localhost/myDB“ //myDB为数据库名 String user=”myuser“;String password=”mypassword“;Connection conn= DriverManager.getConnection(url,user,password);
8、access数据库直连用ODBC的
Class.forName(”sun.jdbc.odbc.JdbcOdbcDriver“);String url=”jdbc:odbc:Driver={MicroSoft Access Driver(*.mdb)};DBQ=“+application.getRealPath(”/Data/ReportDemo.mdb“);Connection conn = DriverManager.getConnection(url,”“,”“);Statement stmtNew=conn.createStatement();
二、JDBC连接MySql方式
下面是使用JDBC连接MySql的一个小的教程
1、查找驱动程序
MySQL目前提供的java驱动程序为Connection/J,可以从MySQL官方网站下载,并找到mysql-connector-java-3.0.15-ga-bin.jar文件,此驱动程序为纯java驱动程序,不需做其他配置。
2、动态指定classpath 如果需要执行时动态指定classpath,就在执行时采用-cp方式。否则将上面的.jar文件加入到classpath环境变量中。
3、加载驱动程序
try{ Class.forName(com.mysql.jdbc.Driver);System.out.println(Success loading Mysql Driver!);}catch(Exception e){ System.out.println(Error loading Mysql Driver!);e.printStackTrace();}
4、设置连接的url
jdbc:mysql://localhost/databasename[?pa=va][&pa=va]
三、以下列出了在使用JDBC来连接Oracle数据库时可以使用的一些技巧
1、在客户端软件开发中使用Thin驱动程序
在开发Java软件方面,Oracle的数据库提供了四种类型的驱动程序,二种用于应用软件、applets、servlets等客户端软件,另外二种用于数据库中的Java存储过程等服务器端软件。在客户机端软件的开发中,我们可以选择OCI驱动程序或Thin驱动程序。OCI驱动程序利用Java本地化接口(JNI),通过Oracle客户端软件与数据库进行通讯。Thin驱动程序是纯Java驱动程序,它直接与数据库进行通讯。为了获得最高的性能,Oracle建议在客户端软件的开发中使用OCI驱动程序,这似乎是正确的。但我建议使用Thin驱动程序,因为通过多次测试发现,在通常情况下,Thin驱动程序的性能都超过了OCI驱动程序。
2、关闭自动提交功能,提高系统性能
在第一次建立与数据库的连接时,在缺省情况下,连接是在自动提交模式下的。为了获得更好的性能,可以通过调用带布尔值false参数的Connection类的setAutoCommit()方法关闭自动提交功能,如下所示:
conn.setAutoCommit(false);
值得注意的是,一旦关闭了自动提交功能,我们就需要通过调用Connection类的commit()和rollback()方法来人工的方式对事务进行管理。
3、在动态SQL或有时间限制的命令中使用Statement对象
在执行SQL命令时,我们有二种选择:可以使用PreparedStatement对象,也可以使用Statement对象。无论多少次地使用同一个SQL命令,PreparedStatement都只对它解析和编译一次。当使用Statement对象时,每次执行一个SQL命令时,都会对它进行解析和编译。这可能会使你认为,使用PreparedStatement对象比使用Statement对象的速度更快。然而,我进行的测试表明,在客户端软件中,情况并非如此。因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。
此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。因此,我认为,Statement对象可以使动态SQL命令的创建和执行变得更加简单。
4、利用helper函数对动态SQL命令进行格式化
在创建使用Statement对象执行的动态SQL命令时,我们需要处理一些格式化方面的问题。例如,如果我们想创建一个将名字O'Reilly插入表中的SQL命令,则必须使用二个相连的“''”号替换O'Reilly中的“'”号。完成这些工作的最好的方法是创建一个完成替换操作的helper方法,然后在连接字符串心服用公式表达一个SQL命令时,使用创建的helper方法。与此类似的是,我们可以让helper方法接受一个Date型的值,然后让它输出基于Oracle的to_date()函数的字符串表达式。
5、利用PreparedStatement对象提高数据库的总体效率
在使用PreparedStatement对象执行SQL命令时,命令被数据库进行解析和编译,然后被放到命令缓冲区。然后,每当执行同一个PreparedStatement对象时,它就会被再解析一次,但不会被再次编译。在缓冲区中可以发现预编译的命令,并且可以重新使用。在有大量用户的企业级应用软件中,经常会重复执行相同的SQL命令,使用PreparedStatement对象带来的编译次数的减少能够提高数据库的总体性能。如果不是在客户端创建、预备、执行PreparedStatement任务需要的时间长于Statement任务,我会建议在除动态SQL命令之外的所有情况下使用PreparedStatement对象。
6、在成批处理重复的插入或更新操作中使用PreparedStatement对象
如果成批地处理插入和更新操作,就能够显著地减少它们所需要的时间。Oracle提供的Statement和 CallableStatement并不真正地支持批处理,只有PreparedStatement对象才真正地支持批处理。我们可以使用addBatch()和executeBatch()方法选择标准的JDBC批处理,或者通过利用PreparedStatement对象的setExecuteBatch()方法和标准的executeUpdate()方法选择速度更快的Oracle专有的方法。要使用Oracle专有的批处理机制,可以以如下所示的方式调用setExecuteBatch():
PreparedStatement pstmt3D null;try {((OraclePreparedStatement)pstmt).setExecuteBatch(30);...pstmt.executeUpdate();}
调用setExecuteBatch()时指定的值是一个上限,当达到该值时,就会自动地引发SQL命令执行,标准的executeUpdate()方法就会被作为批处理送到数据库中。我们可以通过调用PreparedStatement类的sendBatch()方法随时传输批处理任务。
7、使用Oracle locator方法插入、更新大对象(LOB)
Oracle的PreparedStatement类不完全支持BLOB和CLOB等大对象的处理,尤其是Thin驱动程序不支持利用PreparedStatement对象的setObject()和setBinaryStream()方法设置BLOB的值,也不支持利用setCharacterStream()方法设置CLOB的值。只有locator本身中的方法才能够从数据库中获取LOB类型的值。可以使用PreparedStatement对象插入或更新LOB,但需要使用locator才能获取LOB的值。由于存在这二个问题,因此,我建议使用locator的方法来插入、更新或获取LOB的值。
8、使用SQL92语法调用存储过程
在调用存储过程时,我们可以使用SQL92或Oracle PL/SQL,由于使用Oracle PL/SQL并没有什么实际的好处,而且会给以后维护你的应用程序的开发人员带来麻烦,因此,我建议在调用存储过程时使用SQL92。
9、使用Object SQL将对象模式转移到数据库中
既然可以将Oracle的数据库作为一种面向对象的数据库来使用,就可以考虑将应用程序中的面向对象模式转到数据库中。目前的方法是创建Java bean作为伪装的数据库对象,将它们的属性映射到关系表中,然后在这些bean中添加方法。尽管这样作在Java中没有什么问题,但由于操作都是在数据库之外进行的,因此其他访问数据库的应用软件无法利用对象模式。如果利用Oracle的面向对象的技术,可以通过创建一个新的数据库对象类型在数据库中模仿其数据和操作,然后使用JPublisher等工具生成自己的Java bean类。如果使用这种方式,不但Java应用程序可以使用应用软件的对象模式,其他需要共享你的应用中的数据和操作的应用软件也可以使用应用软件中的对象模式。
10、利用SQL完成数据库内的操作
我要向大家介绍的最重要的经验是充分利用SQL的面向集合的方法来解决数据库处理需求,而不是使用Java等过程化的编程语言。
如果编程人员要在一个表中查找许多行,结果中的每个行都会查找其他表中的数据,最后,编程人员创建了独立的UPDATE命令来成批地更新第一个表中的数据。与此类似的任务可以通过在set子句中使用多列子查询而在一个UPDATE命令中完成。当能够在单一的SQL命令中完成任务,何必要让数据在网上流来流去的?我建议用户认真学习如何最大限度地发挥SQL的功能。11 JNDI
try{
InitialContext ctx=new InitialContext();Object o = ctx.lookup(”java:comp/env/hibernate“);out.print(”class="+o.getClass().getName());DataSource ds=(javax.sql.DataSource)o;}catch(NamingException e){
e.printSatckTrace;}
第五篇:数据库概念题汇总
数据库系统概论课后习题概念型知识汇总,小炒哦
第1 章绪论.试述数据、数据库、数据库系统、数据库管理系统的概念。答:(l)数据(Data):描述事物的符号记录称为数据。(2)数据库:数据库是长期储存在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。(3)数据库系统:数据库系统是指在计算机系统中 引入数据库后的系统构成,一般由数据库、数据库管理系统(及其开发工具)、应用系统、数据库管理员构成。解析数据库系统和数据库是两个概念。数据库系统是一个人一机系统,数据库是数据库系统的一个组成部分。(4)数据库管理系统:数据库管理系统是 位于用户与操作系统之间的一层数据管理软件,用于科学地组织和存储数据、高效地获取和 维护数据。DBMS的主要功能包括数据定义功能、数据操纵功能、数据库的运行管理功能、数据库的建立和维护功能。.使用数据库系统有什么好处?答:使用数据库系统的好处很多 如,可以大大提高应用开发的效率,方便用户的使用,减轻数据库系统管理人员维护 的负担,等等。使用数据库系统可以大大提高应用开发的效率。3 .试述文件系统与数据库系统的区别和联系。文件系统与数据库系统的区别是:文件系统面向某一应用程序,共享性差,冗余度大,数据 独立性差,记录内有结构,整体无结构,由应用程序自己控制。数据库系统面向现实世界,共享性高,冗余度小,具有较高的物理独立性和一定的逻辑独立性,整体结构化,用数据模
型描述,由数据库管理系统提供数据的安全性、完整性、并发控制和恢复能力。文件系统与数据库系统的联系是:文件系统与数据库系统都是计算机系统中管理数据的软件。解析文件系统是操作系统的重要组成部分;而 DBMS是独立于操作系统的软件。但是DBMS是在操作系统的基础上实现的;数据库中数据的组织和存储是通过操作系统中的文 件系统来实现的。.试述数据库系统的特点。
答:(l)数据结构化数据库系统实现整体数据的结构化,这是数据库的主要特征之一,也是数据库系统与文件系统的本质区别。(2)数据的共享性高,冗余度低,易扩充数据库的数据不再面向某个应用而是面向整个系统,因此可以被多个用户、多个应用以多种不同的语言共享使用。(3)数据独立性高数据独立性包括数据的物理独立性和数据的逻辑独立性。(4)数据由 DBMS统一管理和控制数据库的共享是并发的共享,即多个用户可以同时存取数据库中的数据甚至可以同时存取数据库中同一个数据。6 .数据库管理系统的主要功能有哪些?
答:(l)数据库定义功能;(2)数据存取功能;(3)数据库运行管理;(4)数据库的建立和维护功能。7 .试述数据模型的概念、三个要素。进行抽象的工具,段的形式构架。和完整性约束三部分组成。什么?答:模式和内模式组成。外模式,理,层映像:正是这
2SQL
第3 章关系数据库标准语言SQL1 .试述SQL语言的特点。
答:(l)综合统一。sQL语言集数据定义语言 DDL、数据操纵语言 DML、数据控制语言 DCL的功能于一体。(2)高度非过程化。(3)面向集合的操作方式。(4)以同一种语法结构提供两种使用方式。(5)语言简捷,易学易用。这些关系数据语言的共同特点是,语言具有完备的表达能力,是非过程化的集合操作语言,功能强,能够嵌入高级语言中使用。
什么是基本表?什么是视图? 两者的区别和联系是什么?基本表是本身独立存在的表,在 sQL中一个关系就
对应一个表。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。即数据库中只存放视图的定义而不存放视图对应的数据,这些数据仍存放在导出视图的基本表中。视图在概念上与基本表等同,用户可以如同基本表那样使用视图,可以在视图上再定义视图。.试述视图的优点。答(l)视图能够简化用户的操作;(2)视图使用户能以多种角度看待同一数据;(3)视 图对重构数据库提供了一定程度的逻辑独立性;(4)视图能够对机密数据提供安全保护。第4 章数据库安全性1 .什么是数据库的安全性?答:数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄露、更改或破坏。.试述实现数据库安全性控制的常用方法和技术。答:实现数据库安全性控制的常用方法和技术有:(l)用户标识和鉴别:(2)存取控制(3)视图机制:为不同的用户定义视图,通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动地对数据提供一定程度的安全保护。(4)审计:建立审计日志,把用户对数据库的所有操作自动记录下来放入审计日志中,DBA 可以利用审计跟踪的信息,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。(5)数据加密:对存储和传输的数据进行加密处理,从而使得不知道解密算法的人无法获 知数据的内容。
第5 章数据库完整性什么是数据库的完整性?
答:2 .别和联系?答: 概念,但是有一定的联系。不符合语义的数据,DBMS 的完整性控制机制应具有哪些功能?
答:(l束条件的机制;(2)
(2(3)分解规则: 13NF。答:正确。因(2)任何BCNF.答:正确。按BCNF 的定义,若XYY 每个决定因素都包含码,(3)4NF.答:正确。因为只有两个属第7 章数据库设计.试述数据库设计过程。
(l)需求分析;(2)概念结构设计;(3)逻辑结构设计;(4)数据库物理设计;(5)数据库实施;(6)数据库运行和维护。.试述数据库设计的特点。答:数据库设计既是一项涉及多学科的综合性技术又是一项庞大的工程项目。其主要特点有:(l)数据库建设是硬件、软件和干件(技术与管理的界面)的结合。(2)从软件设计的 技术角度看,数据库设计应该和应用系统设计相结合,也就是说,整个设计过程中要把结构(数据)设计和行为(处理)设计密切结合起来。数据字典的内容和作用是什么?答:数据字典是系统中各类数据描述的集合。数据字典的内容通常包括:(l)数据项(2)数据结构3)数据流4)数据存储5)处理过程五个部分。其中数据项是数据的最小组成单位,若干个数据项可以组成一个数据结构。数据字典通过对数据项和数据结构的定义来描述数据流和数据存储的逻辑内容。数据字典的作用:数据字典是关于数据库中数据的描述,在需求分析阶段建立,是下一步进行概念设计的基础,并在数据库设计过程中不断修改、充实、完盖。9 .什么是数据库的逻辑结构设计?试述数据库概念结构设计的重要性和设计步骤。答:数据库的逻辑结构设计就是把概念结构设计阶段设计好的基本 E一 R图转换为与选用的 DBMS产品所支持的数据模型相符合的逻辑结构。重要性:数据库概念设计是整个数据库设计的关键,将在需求分析阶段所得到的应用需求首先抽象为概念结构,以此作为各种数据模型的共同基础,从而能更好地、更准确地用某一 DBMS实现这些需求。设计步骤:概念结构的设计方法有多种,其中
最经常采用的策略是自底向上方法,该方法的设计步骤通常分为两步:第 1步是抽象数据并设计局部视图,第 2步是集成局部视图,得到全局的概念结构。
第9 章关系查询处理和查询优化.试述查询优化的一般准则。查询优化的一般步骤。答:下面的优化策略一般能提高查询效率:(l)选择运算应尽可能先做;(2)把投影运 算和选择运算同时进行(3)把投影同其前或其后的双目运算结合起来执行;(4)把 某些选择同在它前面要执行的笛卡儿积结合起来成为一个连接运算;(5)找出公共子表 达式;(6)选取合适的连接算法。大致的步骤可以归纳如下:(l)把查询转换成某 种内部表示,通常用的内部表示是语法树。(2 利用优(3选择低层的存取路径。(4第1
答:这些操作要有44 .
大致可以以1 3)介质故障
答: 的文件2 进行系统故障恢复;协助后备副本进行介质故障恢复。.登记日志文件时为什么必须先写日志文件,后写数据库?答: 把对数据的修改写到数据库中和把表示这个
操作。有可能在这两个操作之间发生故障,即这两个写操作只完成了一个。如果先写了数据库修改,而在运行记录中没有登记这个修改,则以后就无法恢复这个修改了。如果先写日志,但没有修改数据库,在恢复时只不过是多执行一次UNDO操作,并不会影响数据库的正确性。所以一定要先写日志文件,即首先把日志记录写到日志文件中,然后写数据库的修改。.针对不同的故障,试给出恢复的策略和方法。
答:事务故障的恢复:事务故障的恢复是由DBMS 执行恢复步骤是:(1)反向扫描文件日志(2)对该事务的更新操作执行逆操作 3)继续反向扫描日志文件,做同样处理;(4)如此处理下去,直至读到此事务的开始标记,该事务故障的恢复就完成了。系统故障的恢复:撤销(UNDO)故障发生时未完成的事务,重做(REDO)已完成的事务。介质故障的恢复:介质故障是最严重的一种故障。恢复方法是重装数据库,然后重做已完成的事务。第11 章并发控制
1.在数据库中为什么要并发控制?
答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就 会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不 正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。2 .并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?
答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏’数据。避免不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。3 .什么是封锁?基本的封锁类型有几种?试述它们的含义。答:封锁就是事务 T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对
其加锁。基本的封锁类型有两种:排它锁(x锁)和共享锁(S锁)。排它锁又称为写锁。共享锁又称为读锁。6 .试述活锁的产生原因和解决方法。答:活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限 期等待某个封锁,从而导致活锁。避免活锁的简单方法是采用先来先服务的策略。