补充作业一
设有三个关系:
S(SNO, SNAME, AGE, SEX,Sdept)
SC(SNO, CNO, GRADE)
C(CNO, CNAME, TEACHER)
使用关系代数表达式表示下列查询:
1、查询学号为S3学生所学课程的课程名与任课教师名。
2、查询至少选修LIU老师所教课程中一门课的女生姓名。
3、查询WANG同学不学的课程的课程号。
4、查询至少选修两门课程的学生学号。
5、查询选修课程中包含LIU老师所教全部课程的学生学号。
补充作业二
三个关系同上,使用SQL语言表示下列查询:
1、 查询门门课程都及格的学生的学号
方法1:
提示:根据学号分组,就得到每个学生所有的课程成绩,在某个学生这一组成绩里,如果他所有的课程成绩都大于60分则输出该组学生的学号
Select sno frome sc group by sno having(min(grade)>=60)
2、查询既有课程大于90分又有课程不及格的学生的学号
自身连接:
Select sno from sc where grade >90 and sno in (select sno from sc where grade<60)
3、查询平均分不及格的课程号和平均成绩
Select cno , avg(GRADE) from sc group by cno having avg(grade)<60
查询平均分及格的课程号和课程名
Select C.cno , Cname from SC,C where C.cno=SC.cno group by C.cno having avg(grade)>=60
4、找出至少选修了2号学生选修过的全部课程的学生
提示:不存在这样的课程y,学生2选修了y,而学生x没有选。
SELECT DISTINCT Sno
FROM SC as SCX
WHERE NOT EXISTS
(SELECT *
FROM SC as SCY
WHERE SCY.Sno =‘2’AND NOT EXISTS
(SELECT *
FROM SC SCZ
WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno))
5、求各门课程去掉一个最高分和最低分后的平均分
第一步,求所有成绩的平均分(去掉一个最高分和最低分)
select avg(GRADE) from SC
where GRADE not in (select top 1 GRADE from SC order by GRADE)
and GRADE not in (select top 1 GRADE from SC order by GRADE desc)
第二步,将所有成绩按各门课程的课程号CNO分组
SELECT CNO avg(GRADE) from SC
where GRADE not in (select top 1 GRADE from SC order by GRADE)
and GRADE not in (select top 1 GRADE from SC order by GRADE desc) group by CNO
1、查询7号课程没有考试成绩的学生学号。
Select sno fromsc where cno='7' and grade is null
2、查询7号课程成绩在90分以上或60分以下的学生学号。
Select sno from sc where cno='7' and grade not between 60and 9
3、查询课程名以“数据”两个字开头的所有课程的课程号和课程名。
Select cno,cname from c where cname like '数据%'
4、查询每个学生所有课程的平均成绩,输出学生学号和平均成绩。
Select sno,avg(grade)from sc group by sno
5、查询每门课程的选修人数,输出课程号和选修人数。
Selectcno,count(*) from sc group by cno
6、查询选修7号课程的学生的学号、姓名、性别。
Selects.sno,sname,ssex from s,sc where s.sno=sc.sno and cno='7'
或:
Select sno,sname,ssex from s where sno in
( Select sno from sc where cno='7' )
7、查询选修7号课程的学生的平均年龄。
Selectavg(sage) from s,sc where s.sno=sc.sno and cno='7'
或:
Select avg(sage) from s where sno in
(Select sno from sc where cno='7' )
8、查询有30名以上学生选修的课程号。
Select cno fromsc group by cno having count(*)>30
9、查询至今没有考试不及格的学生学号。
Select distinctsno from sc where sno not in
( Select sno from sc where grade<60 )
或:
Select sno from sc group by sno havingmin(grade)>=60
补充三
1、找出选修课程号为C2的学生学号与成绩。
Select sno,grade from sc where cno='C2'
2、找出选修课程号为C4的学生学号与姓名。
Selects.sno,sname from s,sc where s.sno=sc.sno and cno='C4'
注意本题也可以用嵌套做
思考本题改为“找出选修课程号为C4的学生学号、姓名与成绩”后还能用嵌套做吗?
3、找出选修课程名为 Maths 的学生学号与姓名。
Selects.sno,sname from s,sc,c
where s.sno=sc.sno and c.cno=sc.cno andcname='Maths'
注意本题也可以用嵌套做
4、找出选修课程号为C2或C4的学生学号。
Select distinctsno from sc where cno in ('C2','C4')
或:
Select distinct sno from sc where cno='C2' or cno='C4'
5、找出选修课程号为C2和C4的学生学号。
Select sno fromsc where cno='C2' and sno in
( Select sno from sc where cno='C4' )
注意本题也可以用连接做
思考:
Select distinct sno from sc where cno='C2' andcno='C4'正确吗?
6、找出不学C2课程的学生姓名和年龄。
Selectsname,sage from s where sno not in
( Selectsno from sc where cno='C2'
或:
Select sname,sage from s where not exists
(Select * from sc where sno=s.sno and cno='C2' )
7、找出选修了数据库课程的所有学生姓名。(同3)
Select snamefrom s,sc,c
where s.sno=sc.snoand c.cno=sc.cno and cname='数据库'
8、找出数据库课程不及格的女生姓名。
连接:Select sname from s,sc,c
where s.sno=sc.sno andc.cno=sc.cno and cname='数据库'
and grade<60 and ssex='女'
嵌套:Select sname from s where ssex='女' and sno in
(Select sno from sc where grade<60 and cno in
( Select cno from c where cname='数据库' )
)
9、找出各门课程的平均成绩,输出课程名和平均成绩。
Selectcname,avg(grade) from sc,c
wherec.cno=sc.cno group by c.cno,cname
思考本题也可以用嵌套做吗?
10、找出各个学生的平均成绩,输出学生姓名和平均成绩。
Selectsname,avg(grade) from s,sc
wheres.sno=sc.sno group by s.sno,sname
思考本题也可以用嵌套做吗?
11、找出至少有30个学生选修的课程名。
Select cnamefrom c where cno in
( Selectcno from sc group by cno having count(*)>=30 )
注意本题也可以用连接做
12、找出选修了不少于3门课程的学生姓名。
Select snamefrom s where sno in
( Selectsno from sc group by sno having count(*)>=3 )
注意本题也可以用连接做
13、找出各门课程的成绩均不低于90分的学生姓名。
Select snamefrom s,sc where s.sno=sc.sno
group bys.sno,sname having min(grade)>=90
方法二:
Select sname from s where sno not in
( Selectsno from sc where grade<90 )
只要有一门不小于90分就会输出该学生学号
14、找出数据库课程成绩不低于该门课程平均分的学生姓名。
Select snamefrom s,sc,c
where s.sno=sc.sno and sc.cno=c.cno and cname='数据库' and grade>
( Selectavg(grade) from sc,c
where sc.cno=c.cnoand cname='数据库'
)
15、找出各个系科男女学生的平均年龄和人数。
Selectsdept,ssex,avg(sage),count(*) from s group by sdept,ssex
16、找出计算机系(JSJ)课程平均分最高的学生学号和姓名。
Selects.sno,sname from s,sc where s.sno=sc.sno and sdept='JSJ'
group bys.sno,sname
havingavg(grade) >=ALL
( Selectavg(grade) from s,sc
wheres.sno=sc.sno and sdept='JSJ'
group bys.sno
)
17、(补充)查询每门课程的及格率。
本题可以分三步做:
第1步:得到每门课的选修人数
createview v_all(cno,cnt)
as selectcno, count(*) from sc group by cno
第2步:得到每门课及格人数
createview v_pass(cno,cnt_pass)
as selectcno, count(*) from sc where grade>=60 group by cno
第3步:每门课的及格人数/每门课选修人数
selectv_all.cno, cnt_pass*100/cnt from v_all, v_pass
where v_all.cno = v_pass.cno
18、查询平均分不及格的学生的学号,姓名,平均分。
Selectsc.sno,sname,avg(grade) from student,sc
wherestudent.sno=sc.sno
group bysc.sno,sname
havingavg(grade)<60
思考本题也可以用嵌套做吗?
19、查询平均分不及格的学生人数。
Select count(*)from student
where sno in
( selectsno from sc group by sno having avg(grade)<60 )
下面是一个典型的错误
Select count(*) from sc group by sno havingavg(grade)<60
这是每个学生有几门不及格的数目
补充四
1、查询工资在1000到3000元之间的男性业务员的姓名和办公室编号。
SelectYname,Ono from YWY
where Salarybetween 1000 and 3000 and Ysex='男'
2、查询各个办公室的业务员人数,输出办公室编号和对应的人数。
SelectOno,count(*) from YWY group by Ono
3、查询每个客户在2002年5月购买的总金额,输出客户号和相应的总金额。
SelectKno,sum(Fmoney) from FP
where Fdatebetween '2002.5.1' and '2002.5.31'
group by Kno
4、查询2002年5月购买次数超过5次的所有客户号,且按客户号升序排序。
Select Kno fromFP
where Fdatebetween '2002.5.1' and '2002.5.31'
group by Kno
havingcount(*)>5
order by KnoASC
5、查询各办公室男性和女性业务员的平均工资。
SelectOno,Ysex,avg(Salary) from YWY group by Ono,Ysex
6、查询2002年5月曾经在王海亮业务员手中购买过商品的客户号、 客户姓名和联系电话。
SelectKno,Kname,Phone from KH where Kno in
( SelectKno from FP
whereFdate between '2002.5.1' and '2002.5.31' and Yno in
( Select Yno from YWY where Yname='王海亮' )
)
注意本题也可以用连接做
7、查询所有工资比1538号业务员高的业务员的编号、姓名和工资。
SelectYno,Yname,Salary from YWY where Salary >
( SelectSalary from YWY where Yno='1538' )
8、查询所有与1538号业务员在同一个办公室的其他业务员的编号和姓名。
SelectYno,Yname from YWY where Yno!='1538' and Ono in
( SelectOno from YWY where Yno='1538' )
9、查询销售总金额最高的业务员的编号。
Select Yno fromFP group by Yno having sum(Fmoney) >=ALL
( Selectsum(Fmoney) from FP group by Yno )
10、查询所有业务员的编号、姓名、工资以及工资比他高的其他业务员的平均工资。
利用自连接
SelectY1.Yno,Y1.Yname,Y1.Salary,avg(Y2.Salary)
from YWY Y1, YWY Y2
where Y1.Salary < Y2.Salary
group by Y1.Yno
补充五
1、找出每个班级的班级代码、学生人数、平均成绩。
SelectBJDM,count(*),avg(CJ) from SC group by BJDM
2、找出每个学生的班级代码、学生姓名、考试科目数、总成绩。
SelectBJDM,XSXM,count(*),sum(CJ) from SC
group byBJDM,BNXH,XSXM
3、输出一张表格,每位学生对应一条记录,包括字段:班级代码、学生姓名、语文成绩、数学成绩、外语成绩。
SelectSC1.BJDM,SC1.XSXM,SC1.CJ,SC2.CJ,SC3.CJ
from SC SC1, SC SC2, SC SC3
whereSC1.BJDM=SC2.BJDM and SC1.BNXH=SC2.BNXH and
SC2.BJDM=SC3.BJDM and SC2.BNXH=SC3.BNXH and
SC1.KM='语文' and SC2.KM='数学' and SC3.KM='外语'
4、输出一张表格,有成绩低于60分的每位学生对应一条记录,包括字段:班级代码、学生姓名、最低成绩。
SelectBJDM,XSXM,min(CJ) from SC
where CJ<60 group by BJDM,BNXH,XSXM
或:SelectBJDM,XSXM,min(CJ) from SC
group byBJDM,BNXH,XSXM
havingmin(CJ)<60
5、输出一张表格,有成绩低于60分的每位学生对应一条记录,包括字段: 班级代码、学生姓名、最高成绩、平均成绩。
SelectBJDM,XSXM,max(CJ) from SC
group byBJDM,BNXH,XSXM
havingmin(CJ)<60
请思考下列做法是否正确:
SelectBJDM,XSXM,max(CJ),avg(CJ) from SC
where CJ<60 group byBJDM,BNXH,XSXM
6、输出一张表格,所有成绩都不低于60分的每位学生对应一条记录,包括字段:班级代码、学生姓名、平均成绩。
SelectBJDM,XSXM,avg(CJ) from SC
group by BJDM,BNXH,XSXM
havingmin(CJ)>=60
7、输出一张表格,每一位学生对应一条记录,包括字段:班级代码、学生姓名、去掉一个最低分后的平均成绩。
SelectBJDM,XSXM,(sum(CJ)-min(CJ))/(count(*)-1) from SC
group byBJDM,BNXH,XSXM
8、输出一张表格,每门科目对应一条记录,包括字段: 科目、去掉一个最低分后的平均成绩。
Select KM,(sum(CJ)-min(CJ))/(count(*)-1)from SC
group by KM
补充六
1、查询年龄在19至21岁之间的女生的学号,姓名,年龄,按年龄从大到小排列。
Selectsno,sname,sage from student
where sagebetween 19 and 21 and ssex='女'
order by sagedesc
2、查询姓名中有“明”字的学生人数。
Select count(*)from student
where snamelike "%明%"
3、查询1001课程没有成绩的学生的学号。
Select sno fromsc where cno='1001' and grade is null
4、查询JSJ、SX、WL系的学生学号,姓名,结果按系及学号排列。
Selectsno,sname,sdept from student
where sdept in( 'JSJ', 'SX', 'WL' )
order bysdept,sno
5、计算每一门课的总分、平均分,最高分、最低分。
Selectcno,sum(grade),avg(grade),max(grade),min(grade)
from sc
group by cno
6、查询平均分大于90分的男学生学号及平均分。
连接:
selectsc.sno,avg(grade) from student,sc
wherestudent.sno=sc.sno and ssex=’男’
group by sc.sno
havingavg(grade)>90
嵌套:
selectsno,avg(grade) from sc
where sno in (select sno from student where ssex='男')
group by sno
havingavg(grade)>90
7、查询选修课程超过2门的学生姓名。
select snamefrom student,sc
where student.sno=sc.sno
group bysc.sno,sname
havingcount(*)>2
本题也可以用嵌套做
8、查询 JSJ 系的学生选修的课程号。
Select distinctcno from student,sc
where student.sno=sc.sno and sdept='JSJ'
本题也可以用嵌套做
9、查询选修1002课程的学生的学生姓名(用连接和嵌套2种方法)
连接:Select sname from student,sc
wherestudent.sno=sc.sno and cno='1002'
嵌套:Select sname from student where sno in
(select sno from sc where cno='1002' )
10、查询学生姓名以及他选修课程的课程号及成绩。
Selectsname,cno,grade from student,sc
wherestudent.sno=sc.sno
思考本题也可以用嵌套做吗?
3.6 使用SQL查询语句表达下列对教学数据库中三个基本表S、SC、C的查询:
(1)统计有学生选修的课程门数。
SELECT COUNT(DISTINCT C#) FROM SC
(2)求选修C4课程的学生的平均年龄。
SELECT AVG(AGE)
FROM S
WHERE S# IN
(SELECT S#
FROM SC
WHERE C#='C4')
或者
SELECT AVG(AGE)
FROM S,SC
WHERE S.S#=SC.S# AND C#='004'
(3)求LIU老师所授课程的每门课程的学生平均成绩。
SELECT CNAME,AVG(GRADE)
FROM SC ,C
WHERE SC.C#=C.C# ANDTEACHER='LIU'
GROUP BY C#
(4)统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列。
SELECT DISTINCT C#,COUNT(S#)
FROM SC
GROUP BY C#
HAVING COUNT(S#)>10
ORDER BY 2 DESC, C# ASC
(5)检索学号比WANG同学大,而年龄比他小的学生姓名。
SELECT X.SNAME
FROM S AS X, S AS Y
WHERE Y.SNAME='WANG' AND X.S#>Y.S# AND X.AGE<y.age< span>
(6)检索姓名以WANG打头的所有学生的姓名和年龄。
SELECT SNAME,AGE
FROM S
WHERE SNAME LIKE 'WANG%'
(7)在SC中检索成绩为空值的学生学号和课程号。
SELECT S#,C#
FROM SC
WHERE GRADE IS NULL
(8)求年龄大于女同学平均年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE X.SEX='男' AND X.AGE>(SELECT AVG(AGE)FROM S AS Y WHERE Y.SEX='女')
(9)求年龄大于所有女同学年龄的男学生姓名和年龄。
SELECT SNAME,AGE
FROM S AS X
WHERE X.SEX='男' AND X.AGE>ALL (SELECT AGE FROM S AS Y WHERE Y.SEX='女')
除法运算
3.7 使用SQL更新语句表达对教学数据库中三个基本表S、SC、C的各个更新操作:
(1)往基本表S中插入一个学生元组(‘S9’,‘WU’,18)。
INSERT INTO S(S#,SNAME,AGE) VALUES('59','WU',18)
(2)在基本表S中检索每一门课程成绩都大于等于80分的学生学号、姓名和性别,并把检索到的值送往另一个已存在的基本表STUDENT(S#,SANME,SEX)。
INSERT INTO STUDENT(S#,SNAME,SEX)
SELECT S#,SNAME,SEX
FROM S WHERE NOT EXISTS
(SELECT * FROM SC WHERE
GRADE<80 AND S.S#=SC.S#)
(3)在基本表SC中删除尚无成绩的选课元组。
DELETE FROM SC
WHERE GRADE IS NULL
(4)把WANG同学的学习选课和成绩全部删去。
DELETE FROM SC
WHERE S# IN
(SELECT S#
FROM S
WHERE SNAME='WANG')
(5)把选修MATHS课不及格的成绩全改为空值。
UPDATE SC
SET GRADE=NULL
WHERE GRADE<60 AND C# IN
(SELECT C#
FROM C
WHERE CNAME='MATHS')
(6)把低于总平均成绩的女同学成绩提高5%。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE GRADE<(SELECT AVG(GRADE) FROM SC) AND S# IN (SELECT S# FROM SWHERE SEX='F')
(7)在基本表SC中修改C4课程的成绩,若成绩小于等于75分时提高5%,若成绩大于75分时提高4%(用两个UPDATE语句实现)。
UPDATE SC
SET GRADE=GRADE*1.05
WHERE C#='C4' AND GRADE<=75
UPDATE SC
SET GRADE=GRADE*1.04
WHERE C#='C4' AND GRADE>75
3.8 “仓库管理”关系模型有五个关系模式:
零件 PART(P#,PNAME,COLOR,WEIGHT)
项目 PROJECT(J#,JNAME,DATE)
供应商 SUPPLIER(S#,SNAME,SADDR)
供应 P_P(J#,P#,TOTOAL)
采购 P_S(P#,S#,QUANTITY)
(1)使用SQLDDL语句定义上述五个基本表,并说明主键和外键。
CREATE TABLE PART
(P# CHAR(4) NOT NULL,PNAME CHAR(12) NOT NULL,
COLOR CHAR(10),WEIGHT REAL,
PRIMARY KEY(P#))
CREATE TABLE PROJECT
(J# CHAR(4) NOT NULL,JNAME CHAR(12) NOT NULL,
DATE DATE,
PRIMARY KEY(J#))
CREATE TABLE SUPLIER
(S# CHAR(4) NOT NULL,SNAME CHAR(12),SADDR VARCHAR(20),
PRIMARY KEY(S#))
CREATE TABLE P_P
(J# CHAR(4),P# CHAR(4),TOTAL INTEGER,
PRIMARY KEY(J#,P#),
FOREIGN KEY(J#) REFERENCE PROJECT(J#),
FOREIGN KEY(P#) REFERENCE PART(P#))
CREATE TABLE P_S
(P# CHAR(4),S# CHAR(4),QUANTITY INTEGER,
PRIMARY KEY(P#,S#),
FOREIGN KEY(P#) REFERENCE PART(P#),
FOREIGN KEY(S#) REFERENCE SUPLIER(S#))
(2)试将PROGECT、P_P、PART三个基本表的自然联接定义为一个视图VIEW1,PART、P_S、SUPPLIER 三个基本表的自然联接定义为一个视图VIEW2。
CREATE VIEW VIEW1(J#,JNAME,DATE,P#,PNAME,COLOR,WEIGHT,TOTAL)
AS SELECT PROJECT.J#,JNAME,DATE,PART.P#,PNAME,COLOR,WEIGHT,TOTAL
FROM PROJECT,PART,P_P
WHERE PART.P#=P_P.P# AND P_P.J#=PROJECT.J#
CREATE VIEW VIEW2(P#,PNAME,COLOR,WEIGHT,S#,SNAME,SADDR,QUANTITY)
AS SELECT PART.P#,PNAME,COLOR,WEIGHT,SUPPLIER.S#,SNAME,SADDR,QUANTITY
FROM PART,P_S,SUPPLIER
WHERE PART.P#=P_S.P# AND P_S.S#=SUPPLIER.S#
(3)试在上述两个视图的基础上进行数据查询:
1)检索上海的供应商所供应的零件的编号和名字。
SELECT P#,PNAME FROM VIEW2 WHERE SADDR='SHANGHAI'
2)检索项目J4所用零件的供应商编号和名字。
SELECT S#,SNAME FROM VIEW2 WHERE P# IN(SELECT P# FROM VIEW1 WHERE J#='J4')
3.9 对于教学数据库中基本表SC,已建立下列视图:
CREATEVIEWS_GRADE(S#,C_NUM,AVG_GRADE)
ASSELECTS#,COUNT(C#),AVG(GRADE)
FROMSC
GROUPBYS#
试判断下列查询和更新是否允许执行。若允许,写出转换到基本表SC上的相应操作。
(1)
SELECT*
FROMS_GRADE
允许
SELECT S#,COUNT(C#),AVG(GRADE)FROM SC GROUP BY S#
(2)
SELECTS#,C_NUM
FROMS_GRADE
WHEREAVG_GRADE>80
允许
SELECT S#,COUNT(C#) FROM SC WHEREAVG(GRADE)>80
(3)
SELECTS#,AVG_GRADE
FROMS_GRADE
WHEREC_NUM>(SELECTC_NUM
FROMS_GRADE
WHERES#=‘S4’)
允许
SELECT S#,AVG(GRADE)
FROM SC AS X
WHERE COUNT(X.C#)>(SELECTCOUNT(Y.C#) FROM SC AS Y WHERE Y.S#='S4')
GROUP BY S#
(4)
UPDATES_GRADE
SETC_NUM=C_NUM+1
WHERES#=‘S4’
不允许
(5)
DELETEFROMS_GRADE
WHEREC_NUM>4
不允许
3.10 预处理方式对于嵌入式SQL的实现有什么重要意义?
预处理方式是先用预处理程序对源程序进行扫描,识别出SQL语句,并处理成宿主语言的函数调用形式; 然后再用宿主语言的编译程序把源程序编译成目标程序。这样,不用扩充宿主语言的编译程序, 就能处理SQL语句。
下面是一份配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
这些都可以以在公众号:伤心的辣条 ! 免费领取,还有一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中资料包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
学习不要孤军奋战,最好是能抱团取暖,相互成就一起成长,群众效应的效果是非常强大的,大家一起学习,一起打卡,会更有学习动力,也更能坚持下去。你可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!
好文推荐
转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!