数据库例题
- 格式:doc
- 大小:283.50 KB
- 文档页数:27
数据库关系代数运算例题摘要:1.关系代数简介2.数据库关系代数运算例题详解a.并运算b.交运算c.差运算d.笛卡尔积运算e.投影运算f.选择运算g.连接运算3.总结与展望正文:一、关系代数简介关系代数是一种对关系数据库进行操作的数学理论。
它利用基本的集合运算和关系运算对关系数据库中的数据进行查询、插入、更新和删除等操作。
关系代数的基本运算包括并、交、差、笛卡尔积、投影、选择和连接等。
二、数据库关系代数运算例题详解1.并运算例题1:给定关系R和S,求R并S的结果。
解:设R={1, 2, 3, 4}, S={3, 4, 5, 6},则R并S={1, 2, 3, 4, 5, 6}。
2.交运算例题2:给定关系R和S,求R交S的结果。
解:设R={1, 2, 3, 4}, S={3, 4, 5, 6},则R交S={3, 4}。
3.差运算例题3:给定关系R和S,求R差S的结果。
解:设R={1, 2, 3, 4}, S={3, 4, 5, 6},则R差S={1, 2}。
4.笛卡尔积运算例题4:给定关系R和S,求R与S的笛卡尔积。
解:设R={1, 2}, S={a, b},则R与S的笛卡尔积为{(1, a),(1, b),(2, a),(2, b)}。
5.投影运算例题5:给定关系T,求T中属性A的投影。
解:设T={(1, 2, 3),(2, 3, 4),(3, 4, 5)},则T中属性A的投影为{(1,3),(2,3),(3,5)}。
6.选择运算例题6:给定关系T,求满足条件“属性B大于2”的选择结果。
解:设T={(1, 2, 3),(2, 3, 4),(3, 4, 5)},则满足条件“属性B大于2”的选择结果为{(2,3,4),(3,4,5)}。
7.连接运算例题7:给定关系R和S,求R与S的连接结果。
解:设R={(1, 2),(3, 4)},S={(2, 3),(4, 5)},则R与S的连接结果为{(1,2,3),(3,4,5)}。
数据库关系代数运算例题
下面是一个关系代数运算的例题:
已知有两个关系表格R和S,分别包含以下字段:
R(A, B, C)
S(C, D)
问题1: 求R和S的笛卡尔积。
解答1: 笛卡尔积可以利用关系代数的乘积运算来表示。
乘积运算使用 ×符号表示,即 R × S。
问题2: 求R和S的并集。
解答2: 并集可以利用关系代数的并运算来表示。
并运算使用∪符号表示,即 R ∪ S。
问题3: 求R和S的交集。
解答3: 交集可以利用关系代数的交运算来表示。
交运算使用∩ 符号表示,即R ∩ S。
问题4: 求R和S的差集。
解答4: 差集可以利用关系代数的差运算来表示。
差运算使用 - 符号表示,即 R - S。
问题5: 求R关于字段A的投影。
解答5: 投影可以利用关系代数的投影运算来表示。
投影运算使用π 符号表示,即π(A)(R)。
问题6: 求R关于字段A的选择条件为A=1的选择。
解答6: 选择可以利用关系代数的选择运算来表示。
选择运算使用σ 符号表示,即σ(A=1)(R)。
问题7: 求R和S的连接条件为R.C=S.C的自然连接。
解答7: 自然连接可以利用关系代数的连接运算来表示。
连接运算使用⨝符号表示,并在连接条件上加上等式。
即 R ⨝(R.C=S.C) S。
数据库原理例题文档四.设计题(本大题共5小题,每小题4分,共20分)设某商业集团关于商店销售商品的数据库中有三个基本表:商店S HOP(S#,SNAME,AREA,MGR_NAME)其属性是商店编号,商店名称,区域名,经理姓名。
销售S ALE(S#,G#,QUANTITY)其属性是商店编号,商品编号,销售数量。
商品G OODS(G#,GNAME,PRICE)其属性是商品编号,商品名称,单价。
36.试写出下列查询的关系代数表达式、元组表达式和关系逻辑规则:检索销售“冰箱”的商店的编号和商店名称。
37.试写出上面第36题的SELECT语句表达形式。
并写出该查询的图示形式。
38.试写出下列操作的SQL语句:从SALE表中,把“开开商店”中销售单价高于1000元的商品的销售元组全部删除。
39.写一个断言,要求区域名为“EAST”的商店里销售商品的单价不能低于100元。
40.试写出下列操作的SQL语句:统计区域名为“EAST”的所有商店销售的每一种商品的总数量和总价值。
要求显示(G#,GNAME,SUM_QUANTITY,SUM_V ALUE),其属性为商品编号、商品名称、销售数量、销售价值。
五.综合题(本大题共2小题,每小题5分,共10分)41.某汽车运输公司数据库中有一个记录司机运输里程的关系模式:R(司机编号,汽车牌照,行驶公里,车队编号,车队主管)此处每个汽车牌照对应一辆汽车。
“行驶公里”为某司机驾驶某辆汽车行驶的总公里数。
如果规定每个司机属于一个车队,每个车队只有一个主管。
(1)试写出关系模式R的基本FD和关键码。
(2)说明R不是2NF模式的理由,并指出数据冗余之所在。
试把R分解成2NF模式集。
(3)进而把R分解成3NF模式集,并说明理由。
42.设某商业集团数据库中有三个实体集。
一是“仓库”实体集,属性有仓库号、仓库名和地址等;二是“商店”实体集,属性有商店号、商店名、地址等;三是“商品”实体集,属性有商品号、商品名、单价。
第五章数据库的维护和应用一、例题解析【例题1】设数据表已经打开,为了在表尾增加一条空记录,应使用的命令是()。
A.APPEND B.APPEND BLANK C.INSERT D.INSERT BLANK【解析】答案A,APPEND命令打开一个输入记录的浏览窗口;答案D,INSERT BLANK是插入一条空记录,但必须将记录指针移动到文件尾;答案B是在文件尾追加一条空记录,这个命令常常配合REPLACE命令用于程序中添加记录。
答案:B【例题2】在打开的职工表在有字符型字段“职称”和数值型字段“工资”等,若要求先按职称的升序,职称相同再按工资降序建立排序好的zcgz.dbf文件,应使用的命令是()。
A.SORT ON职称,工资/D Tozcgz.dbfB.SORT ON工资/D,职称/A Tozcgz.dbfC.SORT ON职称+工资Tozcgz.dbfD.SORT ON职称+工资/D Tozcgz.dbf【解析】在SORT命令中,排序的依据只能是关键字段名,而不能使用关键字表达式,因此,答案C和D都是错误的。
答案B是先按工资排序,工资相同再按职称排序,与题意不符,所以正确的答案是A。
答案:A【例题3】在打开的学生档案表中有字符字段“性别”和日期型字段“出生日期”等若要先按性别排序,性别相同时再按出生日期排序创建单索引文件,应使用的命令是()。
A.INDEX ON性别,出生日期TO Xbrq.idxB.INDEX ON性别+出生日期TO xbrq.idxC.INDEX ON性别+STR(出生日期)TO xbrq.idxD.INDEX ON性别+DTOC(出生日期)TO xbrq.idx【解析】对于多重索引,索引表达式中的各字段数据类型必须是一致的。
本题中,“性别”和“出生日期”的数据类型不一致,为构成一个索引表达式,通常是使用转换函数把非字符型的数据转换成字符型的数据。
这里要用DTOC()函数将日期型转换成字符型的,因而答案B、C是错误的;答案A中,索引表达式不能是用逗号隔开的式子。
1.求以下关系模式的键
(1)R(A,B,C,D),函数依赖为:F={D→B,B→D,AD→B,AC→D}。
(2)R(A,B,C,D,E,P),函数依赖为:F={A→D,E→D,D→B,BC→D,DC→A}。
(3)R(A,B,C,D,E),函数依赖为:F={A→BC,CD→E,B→D,E→A}。
2.试问下列关系模式最高属于第几范式,并解释其原因。
(1)R(A,B,C,D,E),函数依赖为:AB→CE,E→AB,C→D。
(2)R(A,B,C,D),函数依赖为:B→D,D→B,AB→C。
3.设有关系模式R(O,I,S,Q,D,B),其函数依赖集合为S→D,I→B,IS→Q,B→O。
试求:
(1)R的候选键。
(2)R所属的最高范式。
(3)如果R不属于3NF,将R分解为3NF(具有无损连接性和依赖保持性)。
4.某单位有一销售利润登记表,记录个部门年代、季度销售利润。
该表随着年代的增加,表的栏目也增加,如图所示。
现在要使用数据库进行管理,请设计关系模型。
要求关系模式必须属于BCNF 范式,指出主键和函数依赖。
5.某图书馆图书馆为每本图书作了一个借阅情况登记表,如图所示。
现在要使用数据库进行管理,请设计关系模型。
要求关系模式必须属于3NF范式,指出主键和函数依赖。
图书号:JSJ0001。
单表查询例题1.查询全体学生的学号与姓名。
2.查询全体学生的姓名、学号、所在系。
3.查询全体学生的详细记录。
4.查全体学生的姓名及其出生年份。
5.查询全体学生的姓名、出生年份和所有系6.查询选修了课程的学生学号。
7.查询所有年龄在20岁以下的学生姓名及其年龄。
8.查询年龄在20~23岁(包括20岁和23岁)之间的学生的姓名、系别和年龄。
9.查询年龄不在20~23岁之间的学生姓名、系别和年龄。
10.查询信息系、数学系和计算机系学生的姓名和性别。
11.查询既不是信息系、数学系,也不是计算机科学系的学生的姓名和性别。
12.查询学号为200518的学生的详细情况。
13.查询所有姓刘学生的姓名、学号和性别。
14.查询姓“李”且全名为两个汉字的学生的姓名。
15.查询名字中第2个字为“立"字的学生的姓名和学号。
16.查询所有不姓刘的学生姓名。
17.查询学号在200511~200515之间的学生姓名。
18.某些学生选修课程后没有参加考试,所以有选课记录,但没有考试成绩。
查询缺少成绩的学生的学号和相应的课程号。
19.查所有有成绩的学生学号和课程号。
20.查询计算机系年龄在20岁以下的学生姓名。
21.查询选修了3号课程的学生的学号及其成绩,查询结果按分数降序排列。
22.查询全体学生情况,查询结果按所在系的系名升序排列,同一系中的学生按年龄降序排列。
23.查询学生表中的前2位同学信息。
24.查询成绩最差的4条选课记录。
25.查询学生总人数。
26.查询选修了课程的学生人数。
27.计算1号课程的学生平均成绩。
28.查询选修1号课程的学生最高分数。
29.求各个课程号及相应的选课人数。
30.查询选修了3门以上课程的学生学号。
31.查询有3门以上课程是70分以上的学生的学号及课程数。
简单查询例题【例1】在zgda表中,检索所有字段。
SELECT * FROM zgda【例2】在zggz表中,检索实发工资大于2000元的记录。
SELECT 编号,姓名,实发工资 FROM zggz WHERE 实发工资>2000【例3】在zgda表中,检索所有职称名称。
SELECT DISTINCT 职称 FROM zgda【例4】在zgda表中,检索职称是助教的记录。
SELECT 编号,姓名,职称 FROM zgda WHERE 职称='助教'【例5】在zggz表中,检索实发工资大于1000小于1800元的记录。
SELECT 编号,姓名,实发工资 FROM zggz WHERE 实发工资>1000 AND 实发工资<1800【例6】检索出工资在1220元到1240元范围内的职工信息。
这个查询的条件值是在什么范围之内,显然可以用BETWEEN…AND…,为此有如下查询语句:SELECT * FROM 职工 WHERE 工资 BETWEEN 1220 AND 1240这里BETWEEN…AND…意思是在“…和…之间”,这个查询的条件等价于: (工资>=1220) AND (工资<=1240)显然使用BETWEEN…AND…表达条件更清晰、更简洁。
假如找出工资不在1220元和1240元之间的全部职工信息,可以用命令:SELECT * FROM 职工 WHERE 工资 NOT BETWEEN 1220 AND 1240【例7】在zgda表中,检索所有姓陈和姜的记录。
SELECT 编号,姓名 FROM zgda WHERE 姓名 IN("陈","姜")【例8】在供应商表中,检索出全部公司的信息,不要工厂或其他供应商的信息。
这是一个字符串匹配的查询,显然应该使用LIKE运算符:SELECT * FROM 供应商 WHERE 供应商名 LIKE "%公司"这里的LIKE是字符串匹配运算符,通配符“%”表示0个或多个字符,另外还有一个通配符“_”表示一个字符。
例1:给定关系R(A,B,C),请说明关系是否满足下列函数依赖(1)A→B(3)AB→C(4)C→A(5)BC→A(6)AC→B答:(1)(6)不成立;(2)(3)(4)(5)成立例2:设有一关系模式R(A,B,C,D,E),在该关系模式上有函数依赖集: { A->B, B->A, (A,C)->D,D->E },请回答:(1)试找出关系模式R中的所有候选关键字。
(2) 该关系模式最高能够满足第几范式?(3)试对该关系模式进行分解,使其最终满足3NNF范式。
答:(1)经分析候选码中必含有C属性,考察(A,C)∵A->B, ∴(A,C) ->B ①∵(A,C) ->(A,C) ②(A,C) ->D ③由①②③得,(A,C) ->(A,B,C,D) ④∵(A,C) ->D, D->E ∴(A,C) ->E ⑤由④⑤得,(A,C) ->(A,B,C,D,E)并为完全函数依赖,∴(A,C)为候选码。
同理有(B,C) ->(A,B,C,D,E)并为完全函数依赖,∴(B,C)为候选码。
显然(D,C) 、(E,C)不能函数决定(A,B,C,D,E)∴候选码只有(A,C)、(B,C)。
(2)显然主属性为{A,B,C},非主属性为{D,E}∵不存在D或E对码有部分函数依赖,∴R∈2NF但对E来讲,存在(A,C) ->D,D ->E,∴(A,C)->E 为传递函数依赖,∴R不属于3NF,R最高达到2NF。
(3)下面是对R的分解,分解后的关系模式满足3NF范式。
R1(A,B)函数依赖集为:{A ->B,B ->A}R2(A,C,D)函数依赖集为:{(A,C)->D}R3(D,E)函数依赖集为:{D->E}例3:假设某商业集团数据库中有一关系模式R如下:R(商店编号,商品编号,商品库存数量,部门编号,部门负责人)如果规定:●每个商店的每种商品只在该商店的一个部门销售;●每个商店的每个部门只有一个部门负责人;●每个商店的每种商品只有一个库存数量;请回答:(1)根据上述规定,写出关系模式R的基本函数依赖(2)找出关系模式R的候选码(3)关系模式R最高已经达到第几范式?为什么?(4)如果R不属于3NF,请将R分解成3NF。
数据库范式例题范式是一种关系型数据库设计的规范,它是通过对表结构进行优化来消除冗余数据、提高数据存储和操作的效率的。
常见的数据库范式有1NF、2NF、3NF等。
以下是一个例题:假设我们有一个学生信息表,包含以下字段:- 学生编号(Student_ID)- 姓名(Name)- 性别(Gender)- 年龄(Age)- 班级编号(Class_ID)- 班级名称(Class_Name)- 班主任姓名(Teacher_Name)这个表中存在冗余数据,比如班级编号、班级名称和班主任姓名都与班级相关,而不是与学生本身相关。
因此,可以使用范式将这个表优化为更好的结构。
首先,我们可以使用第一范式(1NF)来消除重复的数据,把表分成两个表:学生表和班级表。
学生表包含以下字段:- 学生编号(Student_ID)- 姓名(Name)- 性别(Gender)- 年龄(Age)- 班级编号(Class_ID)班级表包含以下字段:- 班级编号(Class_ID)- 班级名称(Class_Name)- 班主任姓名(Teacher_Name)接下来,我们可以使用第二范式(2NF)来消除部分依赖,即确保每个非主键字段完全依赖于主键。
在学生表中,班级名称和班主任姓名都只与班级相关,因此我们可以把它们从学生表中移除,放到班级表中。
最后,我们使用第三范式(3NF)来消除传递依赖,即确保每个非主键字段都不依赖于其他非主键字段。
在班级表中,班主任姓名只与班级编号相关,而不是与班级名称相关,因此我们可以把班主任姓名从班级表中移到另一个表中。
最终,我们将这个结构优化为三个表:学生表包含以下字段:- 学生编号(Student_ID)- 姓名(Name)- 性别(Gender)- 年龄(Age)- 班级编号(Class_ID)班级表包含以下字段:- 班级编号(Class_ID)- 班级名称(Class_Name)教师表包含以下字段:- 班级编号(Class_ID)- 班主任姓名(Teacher_Name)通过以上的优化,我们消除了冗余数据、提高了存储和操作的效率,并且让数据库结构更加清晰和规范。
【例4.3 】创建大学教学管理数据库,数据库名为JXGL,其主数据文件逻辑名称为JXGL_ data,数据文件的操作系统文件名称为JXGL.mdf,数据文件初始大小为5 MB,最大值为200 MB,以5%的增量增加。
日志逻辑文件名称为JXGL_log,日志的操作系统文件名称为JXGL.ldf,日志文件初始大小为5 MB,可按2 MB增量增加,最大值为50 MB。
CREATE DATABASE JXGLON( NAME = JXGL_data, //默认为主数据文件FILENAME = '''+ @data_path + 'JXGL.mdf'',SIZE = 5,MAXSIZE = 200,FILEGROWTH = 5% )LOG ON( NAME = JXGL_log,FILENAME = '''+ @data_path + 'JXGL.ldf'',SIZE = 5MB,MAXSIZE = 50MB,FILEGROWTH = 2MB )【例】创建test数据库,包含一个主文件组和两个次文件组。
CREATE DATABASE testONPRIMARY /*定义在主文件组上的文件*/( NAME=pri_file1,FILENAME=' C:\Program Files\Microsoft SQL Server\ MSSQL\Data \pri_file1.mdf ',SIZE=10,MAXSIZE=50,FILEGROWTH=15%),( NAME=pri_file2,FILENAME=' C:\Program Files\Microsoft SQL Server\MSSQL\Data \pri_file2.ndf ',SIZE=10,MAXSIZE=50,FILEGROWTH=15%),FILEGROUP Grp1 /*定义在次文件组Grp1上的文件*/( NAME=Grp1_file1,FILENAME=' C:\Program Files\Microsoft SQL Server \MSSQL\Data \ Grp1_file1.ndf ',SIZE=10,MAXSIZE = 50,FILEGROWTH=5),FILEGROUP Grp2 /*定义在次文件组Grp2上的文件*/( NAME = Grp2_file1,FILENAME=' C:\Program Files\Microsoft SQL Server\MSSQL\Data \ Grp2_file1.ndf ',SIZE=10,MAXSIZE=50,FILEGROWTH=5),LOG ON /*定义事务日志文件*/( NAME='test_log',FILENAME=' C:\Program Files\Microsoft SQL Server\MSSQL\Data \test_log.ldf ',SIZE=5,MAXSIZE=25,FILEGROWTH=5 )GO例:在原有数据库的基础上增加一个文件组date1,添加一个新文件并加入到文件组date1中ALTER DATABASE stuDBADD FILEGROUP date1GOALTER DATABASE stuDBADD FILE(NAME='stuDB_data1', --主数据文件的逻辑名FILENAME='D:\project\stuDB_data1.ndf', --主数据文件的物理名SIZE=5mb, --主数据文件初始大小MAXSIZE=100mb, --主数据文件增长的最大值FILEGROWTH=15% --主数据文件的增长率)TO FILEGROUP date1GO【例】删除已经创建的“学生管理数据库”。
数据库例题第三章关系数据库标准语言SQL 3.3数据定义[例题1]定义一个学生-课程模式S-TCreate schema“S-T”Authorization WANG;说明:为用户W ANG定义一个模式S-T,需要用户有足够的权限!命令尾加分号,所有标点符号必需是半角符号!命令的大小写的作用?模式名的引号是否必需?[例题2]定义没有模式名的模式Create schema Authorization WANG;说明:该语句没有指定<模式名>,<模式名>隐含为用户W ANG[例题3]创建模式同时创建基本表Create schema TEST Authorization ZHANGCreate table TAB1 (COL1 smallint,COL2 int,COL3 char(20),COL4 numeric(10,3),COL5 decimal(5,2));说明:该语句为用户ZHANG创建了一个模式TEST,并且在其中定义一个表TAB1 [例题4]删除模式Drop schema ZHANG cascade;说明:删除模式ZHANG,使用cascade参数,同时删除已经定义的表TAB1如果使用参数restrict,则表示只删除没有实体表的模式,有实体表则拒绝删除[例题5]建立一个“学生”表StudentCreate table Student(Sno Char(9)Primary key,/* 列级完整性约束条件,Sno是主码*/Sname Char(20)unique,/*Sname取唯一值*/Ssex char(2),Sage smallint,Sdept char(20));说明:创建一个空的“学生”表Student,并加一些限定条件(Sname的唯一性不合理,用于后面例子进行修改)[例题6]建立一个“课程”表CourseCreate table Course(Cno Char(4)Primary key,/* 列级完整性约束条件,Cno是主码*/Cname Char(40),Cpno char(4),/*Cpno的含义是先修课*/Ccredit Smallint,foreign key Cpno references Course(Cno)/*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/);说明:参照表与被参照表是同一表SQL 2008需要使用:foreign key (Cpno)references Course(Cno)[例题7]建立学生选课表SCCreate table SC(Sno Char(9),Cno Char(4),Grade smallint,primary key(Sno,Cno),/*主码由两个属性构成,必须作为表级完整性进行定义*/foreign key(Sno)references Student(Sno) ,/*表级完整性约束条件,Sno是外码,被参照表是Student*/foreign key(Cno)references Course(Cno)/*表级完整性约束条件,Cpno是外码,被参照表是Course*/);说明:两个主码,同时都是外码[例题8]向Student表增加“入学时间”列,其数据类型为日期型Step1:先创建基本表Create table Student(Sno Char(9)Primary key,/* 列级完整性约束条件,Sno是主码*/Sname Char(20)unique,/*Sname取唯一值*/Ssex char(2),Sage char(2),Sdept char(20));GoStep2:alter table Student2 Add S_entrance Datetime;Go说明:不论基本表中原来是否已有数据,新增加列一律为空值[例题9]将年龄的数据类型由字符型改为整数型alter table Student alter column Sage int;[例题10]增加课程名称必须取唯一值的约束条件。
先创建基本表Step1:Create table Course(Cno Char(4)Primary key,/* 列级完整性约束条件,Cno是主码*/Cname Char(40),Cpno char(4),/*Cpno的含义是先修课*/Ccredit Smallint,foreign key Cpno references Course(Cno)/*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno*/);GoStep2:alter table Course add unique(Cname);Go[例题11]删除Student表drop table student2cascade;drop table student2;--cascade;--SQL Sever中不支持cascade参数[例题12]若表上建有视图,选择restrict时表不能删除;cascade时可以删除表,视图也自动被删除。
--本例在SQL Server上不能通过测试/*Student表上建立视图*/create view IS_StudentASselect Sno,Sname,SageFrom StudentWhere Sdept='IS';/*删除Student表*/drop table Student restrict;--error XXX/*删除Student表*/drop table Student cascade;--success XXXselect*from IS_Student;--error[例题13]创建聚簇索引create cluster index Stusname ON Student(Sname); --XXXcreate clustered index Stusname ON Student(Sname);[例题14]创建unique索引create unique index Stusno ON Student(Sno);create unique index Coucno ON Course(Cno);create unique index SCno ON SC(Sno asc,Cno desc);[例题15]删除索引--drop index Stusname;--XXXdrop index Course.Coucno;在SQL Server中需要指定索引的表名称3.4 数据查询/*3.4 数据查询* 查询示例需预先录入的数据*/INSERT INTO [myDB].[dbo].[Student]([Sno],[Sname],[Ssex],[Sage],[Sdept]) VALUES(200215121,'李勇','男',20,'CS'); INSERT INTO [myDB].[dbo].[Student]([Sno],[Sname],[Ssex],[Sage],[Sdept]) VALUES(200215122,'刘晨','女',19,'CS'); INSERT INTO [myDB].[dbo].[Student]([Sno],[Sname],[Ssex],[Sage],[Sdept]) VALUES(200215123,'王敏','女',19,'MA'); INSERT INTO [myDB].[dbo].[Student]([Sno],[Sname],[Ssex],[Sage],[Sdept]) VALUES(200215125,'张立','男',18,'IS');/*受参照关系影响,不能按课程号顺序插入数据*/INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Ccredit])VALUES(2,'数学',2);INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Ccredit])VALUES(6,'数据处理',2);INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Cpno],[Ccredit]) VALUES(4,'操作系统',6,3);INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Cpno],[Ccredit]) VALUES(7,'PASCAL语言',6,4);INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Cpno],[Ccredit]) VALUES(5,'数据结构',7,4);INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Cpno],[Ccredit]) VALUES(1,'数据库',5,4);INSERT INTO [myDB].[dbo].[Course]([Cno],[Cname],[Cpno],[Ccredit]) VALUES(3,'信息系统',1,4);INSERT INTO [myDB].[dbo].[SC]([Sno],[Cno],[Grade])VALUES(200215121,1,92);INSERT INTO [myDB].[dbo].[SC]([Sno],[Cno],[Grade])VALUES(200215121,2,85);INSERT INTO [myDB].[dbo].[SC]([Sno],[Cno],[Grade])VALUES(200215121,3,88);INSERT INTO [myDB].[dbo].[SC]([Sno],[Cno],[Grade])VALUES(200215122,2,90);INSERT INTO [myDB].[dbo].[SC]([Sno],[Cno],[Grade])VALUES(200215122,3,80);[例题1]查询全体学生的学号与姓名select Sno, SnameFrom Student;[例题2]查询全体学生的姓名、学号、所在系select Sname, Sno, SdeptFrom Student;[例题3]查询全体学生的详细记录select *From Student;[例题4]查询全体学生的姓名及其出生年份select Sname, 2004-SageFrom Student;[例题5]查询全体学生的姓名、出生年份和所在院系(小写表示)select Sname,'Year of Birth:', 2004-Sage,lower(Sdept)From Student;select Sname Name,'Year of Birth:'Birth,2004-Sage BirthDay,lower(Sdept) DeparymentFrom Student;[例题6]查询选修了课程的学生学号select SnoFrom SC;select distinct SnoFrom SC;[例题7]查询计算机系全体学生的名单select SnameFrom Studentwhere Sdept ='CS';[例题8]查询20岁以下的学生姓名及年龄select Sname,SageFrom Studentwhere Sage <20;[例题9]查询成绩不及格的学生的学号select distinct SnoFrom SCwhere Grade <60;[例题10]查询年龄在20-23之间select Sname,Sdept,SageFrom Studentwhere Sage between 20 and 23;[例题11]查询年龄不在20-23之间select Sname,Sdept,SageFrom Studentwhere Sage not between 20 and 23;[例题12]查询CS、MA、IS系的学生姓名和性别select Sname,Sdept,SageFrom Studentwhere Sdept in('CS','MA','IS');[例题13]查询非CS、MA系的学生姓名和性别select Sname,Sdept,SageFrom Studentwhere Sdept not in('CS','MA');[例题14]查询学号为200215121的学生详细情况select*From Studentwhere Sno like'200215121';select*From Studentwhere Sno='200215121';[例题15]查询刘姓学生详细情况select*From Studentwhere Sname like'刘%';[例题16]查询姓“欧阳”且命名为3个汉字的学生姓名INSERT INTO[myDB].[dbo].[Student]([Sno],[Sname],[Ssex],[Sage],[Sdept])VALUES(200215126,'欧阳天','男',18,'IS');INSERT INTO[myDB].[dbo].[Student]([Sno],[Sname],[Ssex],[Sage],[Sdept])VALUES(200215127,'欧阳天地','男',18,'IS');select SnameFrom Studentwhere Sname like'欧阳__';--SQL标准中,1个_代表一个汉字--2008版本中,'欧阳__'与'欧阳_'有差异,尤其是单个_可以代表一个汉字[例题17]查询第2个字是“阳”的学生姓名select Sname,SnoFrom Studentwhere Sname like'_阳%';--此处的_数量有不同结果[例题18]查询不姓“刘”的学生姓名select Sname,Sno,SsexFrom Studentwhere Sname not like'刘%';[例题19]查询DB_Design课程的课程号和学分INSERT INTO[myDB].[dbo].[Course]([Cno],[Cname],[Ccredit])VALUES(8,'DB_Design',2);select*From Coursewhere Cname like'DB\_Design'escape'\';--使用转义符[例题20]查询“DB_”开头,且倒数第3个字符为i的课程的课程号和学分INSERT INTO[myDB].[dbo].[Course]([Cno],[Cname],[Ccredit])VALUES(9,'DB_Intro',2);select*From Coursewhere Cname like'DB\_%i__'escape'\';--使用转义符[例题21]查没有成绩的学生INSERT INTO[myDB].[dbo].[SC]([Sno],[Cno])VALUES(200215122,1);select Sno,CnoFrom SCwhere Grade is null;[例题22]查所有有成绩的学生select Sno,CnoFrom SCwhere Grade is not null;select distinct SnoFrom SCwhere Grade is not null;[例题23]查计算机科学系年龄在20岁以下的学生select Sname,SageFrom Studentwhere Sdept='CS'and Sage< 20;[例题24]查询选修了3号课程的学生,按分数的降序排列select Sno,GradeFrom SCwhere Cno='3'order by grade desc;--asc/desc[例题25]查询所有学生,按系号升序,年龄降序排列select*From Studentorder by Sdept,Sage desc;--asc/desc[例题26]查询学生总人数select COUNT(*)From Student;[例题27]查询选修课程的学生总人数select COUNT(distinct Sno)From SC;[例题28]查询选修2号课程的学生平均成绩select Avg(Grade)From SCwhere Cno='2';[例题29]查询选修1号课程的学生最高分select Max(Grade)From SC;[例题30]查询200215121学生选修课程平均成绩select Sum(Grade)From SC,Coursewhere Sno='200215121'and o=o;[例题31]查询各个课程号及相应的选课人数select Cno,Count(Sno)'人数'From SCGroup by Cno;[例题32]查询选修了3门以上课程的学生学号select SnoFrom SCGroup by SnoHaving COUNT(*)> 3;[例题33]查询每个学生及其选修课程的情况select SnoFrom SCGroup by SnoHaving COUNT(*)> 3;[例题34]自然连接实现查询每个学生及其选修课程的情况select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFrom Student,SCwhere Student.Sno=Sc.Sno;[例题35]自身连接查询间接先修课程的情况select o,Second.CpnoFrom Course First,Course Secondwhere First.Cpno=o;/*取别名*/--select * From Student as First;--select * From Student as Second;--go[例题36]外连接(不兼容)/*out -> outer; left outer join = left join*/select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFrom Student left out Join SC On (Student.Sno=Sc.Sno);--outer /*也可以使用Using来去掉结果中的重复值*/--From Student left out Join SC Using(SC.Sno);select Student.Sno,Sname,Ssex,Sage,Sdept,o,Sc.GradeFrom Student left Join SC On (Student.Sno=Sc.Sno);[例题37]查询选修2号课程且成绩在90分以上的所有学生select Student.Sno,SnameFrom Student,SCwhere Student.Sno=Sc.Sno and/*连接谓词and*/o='2'and SC.Grade> 90 ;/*其他限定条件*/[例题38]查询每个学生的学号、姓名、选修的课程名及成绩select Student.Sno,Sname,Cname,GradeFrom Student,SC,Coursewhere Student.Sno=Sc.Sno and o=o;[例题39]查询与“刘晨”在同一个系学习的学生分步查询:Step1:确定“刘晨”所在的系select SdeptFrom Studentwhere Sname='刘晨';Step2:查找所有该系的学生select Sno,Sname, SdeptFrom Studentwhere Sdept ='CS';嵌套查询:(解法1)select Sno,Sname, SdeptFrom Studentwhere Sdept in(select SdeptFrom Studentwhere Sname='刘晨');自身连接:(解法2)select S1.Sno,S1.Sname,S1.SdeptFrom Student S1, Student S2where S1.Sdept=S2.Sdept and S1.Sname='刘晨';解法1、2表明,同一个查询可以有多个查询方法,其执行效率可能会有较大差别----这就是高水平开发人员所关心内容![例题40]查询选修了课程为“信息系统”的学生学号和姓名嵌套查询:(解法)select Sno,SnameFrom Studentwhere Sno In(select SnoFrom SCwhere Cno in(select CnoFrom Coursewhere Cname='信息系统'));连接查询:(解法)select Student.Sno,SnameFrom Student,SC,Coursewhere Student.Sno=SC.Sno Ando=o Andame='信息系统';[例题41]找出每个学生超过他选修课平均成绩的课程号select Sno,CnoFrom SC xWhere Grade>=(Select Avg(Grade)From SC yWhere y.Sno=x.Sno);[例题42]查询其他系中比计算机科学系某一学生年龄小的学生姓名和年龄解法:(any)select Sname,SageFrom StudentWhere Sage<Any(Select SageFrom StudentWhere Sdept='CS')And Sdept<>'CS';解法:(max)select Sname,SageFrom StudentWhere Sage<(Select Max(Sage)From StudentWhere Sdept='CS')And Sdept<>'CS';[例题43]查询其他系中比计算机科学系所有学生年龄都小的学生姓名和年龄解法:(all)select Sname,SageFrom StudentWhere Sage<All(Select SageFrom StudentWhere Sdept='CS')And Sdept<>'CS';解法:(min)select Sname,SageFrom StudentWhere Sage<(Select Min(Sage)From StudentWhere Sdept='CS')And Sdept<>'CS';[例题44]查询所有选修了1号课程的学生姓名select SnameFrom StudentWhere exists(Select*From SCWhere Sno=Student.Sno And Cno='1');[例题45]查询没有选修了1号课程的学生姓名select SnameFrom StudentWhere not Exists(Select*From SCWhere Sno=Student.Sno And Cno='1');[例题46]查询选修了全部课程的学生姓名select SnameFrom StudentWhere not Exists(Select*From CourseWhere not Exists(Select*From SCWhere Sno=Student.Sno And Cno=o));[例题47]查询至少选修了200215122选修的全部课程的学生姓名号码Select Distinct SnoFrom SC ScxWhere not Exists(Select*From SC ScyWhere Scy.Sno='200215122'andnot Exists(Select*From SC SczWhere Scz.Sno=Scx.Sno And o=o));[例题48]查询计算机科学系的学生及年龄不大于19岁的学生Select*From StudentWhere Sdept='CS'UnionSelect*From StudentWhere Sage<=19;[例题49]查询选修了课程1或者选修课程2的学生Select*From SCWhere Cno='1'UnionSelect*From SCWhere Cno='2';[例题50]查询计算机科学系的学生及年龄不大于19岁的学生的交集Select*From StudentWhere Sdept='CS'IntersectSelect*From StudentWhere Sage<=19另一种解法:Select*From StudentWhere Sdept='CS'and Sage<=19;[例题51]查询选修了课程1又选修课程2的学生Select SnoFrom SCWhere Cno='1'IntersectSelect SnoFrom SCWhere Cno='2';另一种解法:Select SnoFrom SCWhere Cno='1'and Sno In(Select SnoFrom SCWhere Cno='2');[例题52]查询计算机科学系的学生及年龄不大于19岁的学生的差集Select*From StudentWhere Sdept='CS'ExceptSelect*From StudentWhere Sage<=19;另一种解法:Select*From StudentWhere Sdept='CS'and Sage>19;3.5数据更新[例题1]将一个新学生元组插入到Student表中INSERTINTO Student([Sno],[Sname],[Ssex] ,[Sdept],[Sage])VALUES(200215128,'陈冬','男','IS',18);[例题2]将学生张成民的信息插入到Student表中/*没有属性名,插入的属性必需和定义表顺序一致!*/INSERTINTO StudentVALUES(200215126,'张成民','男',18,'CS');[例题3]插入一条选课记录INSERTINTO SC(Sno,Cno)VALUES(200215128,'1');或者:INSERTINTO SCVALUES(200215128,'1',NULL);[例题4]对每个系,求学生的平均年龄,并把结果存入数据库Create table Dept_age(Sdept Char(15),Avg_age Smallint);goINSERTINTO Dept_age (Sdept, Avg_age)Select Sdept, Avg(Sage)From StudentGroup by Sdept;[例题5]修改20215121学生的年龄Update studentSet Sage= 22Where Sno='20215121';[例题6]将所有学生的年龄加1岁Update studentSet Sage=Sage+1;[例题7]将计算机科学系全体学生的成绩置为0Update SCSet Grade= 0Where'CS'=(Select SdeptFrom StudentWhere Student.Sno=Sc.Sno);[例题8]删除学号为200215128的学生记录DeleteFrom StudentWhere Sno='200215128';[例题9]删除所有学生选课记录DeleteFrom SC;[例题10]删除计算机科学系所有学生选课记录DeleteFrom SCWhere'CS'=(Select SdeptFrom StudentWhere Student.Sno=Sc.Sno);3.6视图[例题1]建立信息系学生的视图Create view IS_StudentASSelect Sno,Sname,SageFrom StudentWhere Sdept='IS';[例题2]建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生Create view IS_StudentASSelect Sno,Sname,SageFrom StudentWhere Sdept='IS'With check option; --SQL Server有问题[例题3]建立信息系选修了1号课程的学生的视图Create view IS_S1(Sno,Sname,Grade)ASSelect Student.Sno,Sname,GradeFrom Student,SCWhere Sdept='IS'AndStudent.Sno=Sc.Sno ando='1';[例题4]建立信息系选修了1号课程且成绩在90分以上的学生的视图Create view IS_S2ASSelect Sno,Sname,GradeFrom IS_S1Where Grade>=90;[例题5]建立一个反映学生出生年份的视图Create view BT_S2(Sno,Sname,Sbirth)ASSelect Sno,Sname,2004-SageFrom Student;[例题6]将学生的学号和他的平均成绩定义为一个视图Create view S_G(Sno,Gavg)ASSelect Sno,Avg(Grade)From SCGroup by Sno;[例题7]将Student表中所有女生记录定义为一个视图Create view F_Student(F_Sno,name,sex,age,dept)ASSelect*From StudentWhere Ssex='女';[例题8]删除视图Drop view BT_S2;Drop view IS_S1;Drop view IS_S1Cascade;--xxx[例题9]在信息系学生视图中找出年龄小于20岁的学生Select Sno,SageFrom IS_StudentWhere Sage< 20;[例题10]查询选修了1号课程的信息系学生Select IS_Student.Sno,SnameFrom IS_Student,SCWhere IS_Student.Sno=SC.Sno and o='1';[例题11]在S_G(例6)视图中查询平均成绩在90分以上的学生学号和平均成绩Select*From S_GWhere Gavg>=90;[例题12]在视图中更改学生姓名Update IS_StudentSet Sname='刘辰'Where Sno='200215122';[例题13]向视图中插入记录insertinto IS_Studentvalues('200215129','赵新',20);--并没有更新Sdept的值为IS,实际为null--而且,当创建视图IS_Student带参数“With check option”时才能执行上面的操作;--否则就报错[例题14]删除视图中记录deletefrom IS_StudentWhere Sno='200215129';问题:1. 显示/不显示系统表SQL Sever2000:在Enterprise Manager 中右健单击服务器名,在弹出菜单中选择:编辑SQL Server 注册属性。