数据库笔试题刘竹青

1. 新建学生-课程数据库的三个表:学生表:Student(Sno,Sname,Ssex,Sage,Sdept) Sno为主码;课程表:Course(Cno,Cname,Cpno,Credeit) Cno为主码;学生选修表:SC(Sno,Cno,Grade) Sno,Cno,为主码;

Student

Course:

SC:

数据库生成语句:

一:查询表中的列和行

1:查询全体学生的学号与姓名

select sno,sname from student

2:查询全体学生的姓名、学号、所在系。

select sno,sname,sdept from student

3:查询全体学生的详细记录

select * from student

4:查询全体学生的姓名及出生年份

select sname,DATEPART(yy, GETDATE()) - sage + 1 from student(SQLServer)

5:查询全体学生的姓名,出生年份及所在系,要用小写字母表示系名

select sname,DATEPART(yy, GETDATE()) - sage + 1,lower(sdept)from student

6:查询选修了课程的学生学号select sno,cno from sc

7:查询选修了课程的学生姓名

二:条件查询:

常用的查询条件查询条件谓词比较=,<,>,>=,<=,!=,<>,!>,!<;not+上述比较运算符确定范围Between and,Not between And,确定集合IN,not IN字符匹配Like,Not Like空值IsNull,ISNOTNULL多重条件AND,OR

1:查询计算机系全体学生的姓名

select sname from student where sdept=”CS”

2:查询所有年龄在20岁以下的学生姓名及其年龄

select sname,sage from student where sage<20

3:查询考试成绩有不及格的学生的学号

select sno from sc where grade<60

4:查询年龄在20到23间的学生的姓名,系别及年龄

select sname,sdept,sage from student where sage between 20 and23

5: 查询年龄不在20到23间的学生的姓名,系别及年龄

select sname,sdept,sage from student where sage not between 20 and23

6:查询信息系(IS),数学系(MA)和计算机系(CS)学生的姓名和性别

select sname,ssex from student where sdept in("IS","MA","CS")

7:查询不是信息系(IS),数学系(MA)和计算机系(CS)学生的姓名和性别

select sname,ssex from student where sdept notin("IS","MA","CS")

8:查询学号为”95001”的学生详细情况

select * from student where sno=95001

9:查询所有姓刘的学生的姓名,学号和性别(where name like ‘刘%’)

select sname,sno,ssex from student where sname like '刘%'

10:查询姓”欧阳”且命名为三个汉字的学生的姓名

select sname from student where sname like '欧阳_'

11:查询名字中第2个字为”阳”字的学生姓名和学号(where sname like '_阳%')

select sname,sno from student where sname like '_阳%'

12:查询所有不姓刘的学生姓名

select sname from student where sname not like '刘%'

13:查询DB_Design课程的课程号和学分(where cname like 'Db\_Design'Escape'\')

select cno,gredit from course where cname like 'Db\_Design' Escape'\'

14:查询以”DB_”开头,且倒数第3个字符为i的课程的详细情况(where cname like‘DB\_%i__’escape’\’)‘DB\_%i__’escape’\’)

select cno,gredit from course where cname like‘Db\_%i__’escape’\’

15:查询缺少成绩的学生的学号和相应的课程号(where grade is not null)

select sno,cno from sc where grade is null

16:查询有成绩的学生学号和课程号

select sno,cno from sc where grade is not null

17:查询计算机系年龄在20岁以下的学生姓名

select sname from student where sdept=”CS” and sage<20

18:查询选修了3号课程的学生的学号及其成绩,分数降序排列

19:查询全体学生情况,结果按所在系的号升序排列,同一系中的学生按年龄降序

select * from student order by sdept,sage desc

三:使用集函数

count,sum,avg,max,min

1:查询学生的总人数

select count(sno) from student

2:查询选修了课程的学生人数(select count(distinct sno))

select count(distinct sno) from SC

3:计算1号课程的学生平均成绩

select avg(grade) from SC where cno='1'

4:查询选修1号课程的学生最高分数

select max(grade) from SC where cno='1'

5:求各个课程号及相应的选课人数

select cno,count (sno) from sc group by cno

6:查询选修了3门以上的课程的学生学号

select snofrom scgroup by sno

having count(*)>3

四:连接查询:

<1>等值与非等值的连接查询在连接查询中用来连接两个有的条件称为连接条件或连接谓词,,当连接运算符号为”=”时,称为等值连接,使用如,=,<,>,<=,>=,!=连接时称非等值连接

1:查询每个学生及其选修课程的情况

<2>自身连接

连接操作在同一个表中进行连接查询

2:查询每一门课的间接先修课(即先修课的先修课)

五:复合条件连接

1:查询选修2号课程且成绩在90分以上的所有学生。

六:嵌套查询

1:带有谓词in的子查询

<1>查询与“刘晨”在同一个系学习的学生

select sno,sname,sdeptfrom studentwhere sdept in(select sdeptfrom studentwhere sname='刘晨')

或:

<2>查询选修了课程名为“信息系统”的学生学号和姓名

select sno,snamefrom studentwhere sno in( select snofrom scwhere cno in(select cnofrom coursewhere cname='信息系统')或:

2:带有Any 或all谓词的子查询

<1>查询其他系中比信息系中某一学生年龄小的学生姓名和年龄

select sname, sagefrom studentwhere sagefrom studentwhere sdept=’is’)and sdept<>’is’

或用集函数:

select sname, sagefrom studentwhere sage<<BR>(select max(sage)from studentwhere sdept=’is’)and sdept<>’is’

<2> 查询其他系中比信息系所有学生年龄都小的学生姓名及年龄

select sname, sagefrom studentwhere sage(select sagefrom studentwhere sdept=’is’)and sdept<>’is’

3 带有Exitst谓词的子查询<1>查询所有选修了1号课程的学生姓名

<2>查询选修所有全部课程的学生姓名

<3>查询只选修了学生95002选修的全部课程的一部分的学生号码

)二:

题一:表A数据如下:FYear FNum2006 12006 22006 32007 42007 52007 6按如下格式显示:年度 2006 2007汇总 6 15方案一:create table 表名(FID varchar(10), Field1 varchar(100))goinsert into 表名 select 1,'A'insert into 表名 select 1,'B'insert into 表名 select 1,'C'insert into 表名 select 2,'D'insert into 表名 select 2,'E'insert into 表名 select 2,'F'go--创建一个合并的函数create function f_merge(@name varchar(100))returns varchar(8000)asbegindeclare @str varchar(8000)set @str = ''select @str = @str + ',' + cast(Field1 as varchar(100)) from 表名where FID = @nameset @str = stuff(@str , 1,1,'')return(@str)Endgo--select * from 表名--调用自定义函数得到结果:select FID ,dbo.f_merge(FID) as tel from 表名 group by FIDdrop table 表名drop function f_merge方案二:select '汇总' as 年度,[2006],[2007]from(select fyear,fnum from T)as sourceTablepivot(sum(fnum)for fyear in ([2006],[2007]))as pivotTable回头发现可以用SQL2005 pivot 的方法很简单题二:表A数据如下:FID Field11 A1 B1 C2 D2 E2 F要求按如下格式显示:FID Field11 A,B,C2 D,E,F如何做到?create table 表名(FID varchar(10), Field1 varchar(100))goinsert into 表名 select 1,'A'insert into 表名 select 1,'B'insert into 表名 select 1,'C'insert into 表名 select 2,'D'insert into 表名 select 2,'E'insert into 表名 select 2,'F'go--创建一个合并的函数create function f_merge(@name varchar(100))returns varchar(8000)asbegindeclare @str varchar(8000)set @str = ''select @str = @str + ',' + cast(Field1 as varchar(100)) from 表名where FID = @nameset @str = stuff(@str , 1,1,'')return(@str)Endgo--select * from 表名--调用自定义函数得到结果:select FID ,dbo.f_merge(FID) as tel from 表名 group by FID

THE END
0.数据库第二章找出有间接先行课的所有课程的课程号课程名称。6、 查询“CS”系所有学生的平均年龄。 7、 查询课程名是以“系统”结尾的课程信息。 8、 查询先行课为“6”号课程的课程信息。 9、 查询间接先行课为“5”号课程的课程号及课程名。 10、 查询没有先行课的课程名。 11、 对student及sc表做等值连接。 jvzquC41dnuh0lxfp0tfv8r2a876;?=691gsvrhng1jfvjnnu1733=7793>
1.复杂查询查询每一门课的间接先行课(即先行课的先行课)(2) 查询每一门课的间接先行课(即先行课的先行课),显示课程编号和该门课程的间接先行课编号。 select c1.cno,c2.precno from courses c1 left join courses c2 ON c1.precno=c2.cno where c2.precno is not null (3) 查询学生的学号、姓名、选修课程的名称和成绩。 select students.sno,sname,cname,jvzquC41dnuh0lxfp0tfv8kzzmni1jwvkerf1mjvckrt1:7653=95:
2.SQL实验高级查询(二)查询所有学生的学号、姓名,所选课程的课程号、课程名和成绩信息 SELECT student.sno,student.sname,course.cno,course.cname,sc.grade FROM student JOIN sc ON student.sno=sc.sno JOIN course ON sc.cno=course.cno; 查询每一门课的间接先修课(先修课的先修课),显示信息包括课程号、间接先修课课程号。 jvzquC41cxujf7txgtljv7hp1rutv8:e94>b9l;32f:g7@=g47>bg>i47:i26A
3.间接先修课为离散数学的课程名称;(6)查询所有没有先修课的课程或者,可能用户的问题中的先修课信息存储在其他表中?比如,可能存在一个Prerequisite表,包含Cno(课程号)和PreCno(先修课号)。但根据用户的问题,例如问题2到6,用户可能假设Course表中有一个直接指向先修课的字段。否则,如何查询先修课? 例如,问题2:“查询‘形式语言与自动机’先修课的课程名称”,这需要知道该课程jvzquC41ygtlw7hufp4og}4cpu}ft8:jr2>29spt
4.本科生第二次选课通知(20242020级学生起,学生成绩单中的形势与政策成绩在成绩单中将于毕业时体现为《形势与政策教育》(课程号:IPT009,学分:2学分),成绩来源为《形势与政策(1)—(8)(成绩单中不显示)》。务必注意《形势与政策(1)—(8)》缺任何一门或任何一门课程小于60分将无法合成成绩,无合成成绩的学生将无法毕业。 jvzquC41iumm0ƒoiuw4ff~3ep1814=42;2=0e<>93c78;<551rghg7mvo
5.SQL查询实践:学生选课数据库复杂查询(1)查询选修了数据库这门课的学生的学号和姓名 (2)查询选修了3号课程并且成绩在85分以上的学生的学号和姓名 (3)查询信息系统这门课的间接先行课的课程号 (4)查询所有学生选课的情况(包括没有选课的学生) (5)查询选修了2号课程的学生的学号、姓名、课程名称和成绩 jvzquC41dnuh0lxfp0tfv8hh88<78?;1ctzjeuj1fgzbkux134689<993
6.数据库——新建查询,select查询5. 查询每一门课的间接先行课的课程名称 Select first.cname From course first,course second Where first.cpno=second.cno 6.查询所在系部为“MA”且选修了高等数学课程的学生姓名,年龄,性别 Select student.sname,ssex,sage From student,course,sc jvzquC41dnuh0lxfp0tfv8mon8<7:A=1ctzjeuj1fgzbkux1:2<98?9:
7.选修的全部课程的学生号码。(10)用联合查询进行查询选修了课程第三个问题,查询每一门课的间接先修课,即先修课的先修课。这可能需要自连接,课程表自连接两次。假设课程表Course有课程号Cno和先修课Cpno。例如,如果课程A的先修课是B,而B的先修课是C,那么A的间接先修课是C。因此,需要将Course表自连接两次,第一次连接得到直接先修课,第二次连接得到间接先修课。例如,CojvzquC41ygtlw7hufp4og}4cpu}ft8733es1fA;z
8.SQL中的连接查询与嵌套查询左外连接:根据左表的记录,在被连接的右表中找出符合条件的记录与之匹配,找不到匹配的,用null填充 右连接:根据右表的记录,在被连接的左表中找出符合条件的记录与之匹配,找不到匹配的,用null填充 例3:查询缺少成绩的的学生号和课程号: SELECT Student.Sno,Cno jvzquC41dnuh0lxfp0tfv8HEUW^X\8ftvkimg8igvcomu8<237=:3:
9.数据库实验二数据查询茶飘香~SQL>selectdistinct student.sname,student.snofromstudent,scwherestudent.sno=sc.sno and (sc.cno=1or sc.cno=2); iv. 查询每一门课程的间接先行课的课程号。 SQL>selectfirst.cno,second.cpnofromcourse first,course secondwherefirst.cpno=second.cno; v. 查询与’刘晨’在同一个系学习的学生。 SQL>selejvzquC41yy}/ewgnqiy/exr1ejko;>621r572;=4:84ivvq
10.学生姓名和成绩2.查询每门课程的间接先行课(即先行6)查询缺少了成绩的学生的学号和课程号。 2、连接查询 在学生选课库中实现其数据连接查询操作。 1) 查询学生的学号、姓名、选修的课程名称及成绩。 2) 查询数计学院学生选修的课程学分大于 2 的课程详细信息。 3) 查询所有学生的信息以及他(她)所选课的课程编号和成绩(要求查询结果也显示出没有 选修课程的学生jvzquC41dnuh0lxfp0tfv87524e8:;=244:0c{ykenk0fnyckny03<=544>28
11.实验六6-10 找出有间接先行课的所有课程的课程号、课程名称。 Tips:所谓间接先行课:某一门课程 A 的先行课 B 的先行课 C,因此 C 就是 A 的间接先行课; 思路: 利用存在性检测 exists 即可; where 条件中均为 fcid 和 cid 的比较; createviewtest6_10asselectcid,namefrompub.course t0whereexists(selectcidfrojvzquC41dnuh0lxfp0tfv8vsa7953<<7;1gsvrhng1jfvjnnu1732>=6478