[TUST]数据库原理作业(一)

数据库原理作业(一)

1、查询每个同学的学号,姓名,课程号,课程名,分数。(不包括没选课的同学)

select Sname ,Student.Sno,Course.Cno,Cname,Grade From student 
	join sc on student.Sno = sc.Sno
	join course on course.Cno = sc. Cno  /*把三个表连在一起,直接查询上述信息。*/
	where Grade is not null	/*不包括没选课的同学*/

2、查询选修了‘VB’课程并且年龄不等于20岁的男同学的学号,姓名。

select Sname ,Sno From student 
	where Sno in(select sno from course where cname = 'VB') 	/*先选出“选修VB”的Sno,再用这个Sno去筛选男同学*/
		AND Ssex = '男' AND Sage != 20

3、查询选修了‘C01’课程,并且年龄在18-20岁之间的计算机系的同学的学号,姓名。

SELECT Sno, Sname  FROM Student 
	where Sno in(SELECT Sno FROM Course where Cno = 'c01')
		AND Sage between 18 and 20	/*同上一题*/

4、查询计算机系,所有姓‘张’‘王’‘李’的同学的学号和姓名。

SELECT Sno,Sname From Student
	where rtrim(Sname) like '[张王李]%'	/*trim是去除数据中的空格,这里rtrim代表去除右边的空格,意味着只要开头词是张王李之一,就满足条件。*/
	AND Sdept = '计算机系'

5、查询计算机系每个同学所选的课程门数和已经考试的课程门数。

SELECT Sname 姓名 , COUNT(*) 选课门数, COUNT(Grade) 已考试门数
	from sc join student on sc.sno = student.sno
	GROUP BY student.Sname	/*分组,指的是名字相同的人就count。*/

6、查询选修了3门以上课程的同学的学号和选课门数。

SELECT Sno, count(*) 选课门数 FROM SC
	GROUP BY Sno
	HAVING COUNT(*) > 3 	/*语法having count,只有大于3的才会被记录*/

7、查询计算机系,没有选课同学的学号和姓名(要求用外连接实现)。

SELECT student.Sno,Sname 
	FROM student left join sc on student.sno = sc.sno /*student左接sc*/
	Where Sdept = '计算机系' AND sc.sno is NULL

8、查询与刘晨在同一系学习的学生的姓名和所在的系。(要求用自链接实现)

SELECT S2.Sname , S2.Sdept FROM Student S1 join Student S2
	on S1.Sdept = S2.Sdept
	WHERE S1.Sname = '刘晨'
	AND S2.Sname != '刘晨'

9、查询没有选'c01'课程的同学的学号和姓名。(要求用not in实现)

SELECT Student.Sno,Sname FROM Student
	join SC on Student.Sno = SC.Sno
	WHERE Cno not in ('c01')	/*没选c01的*/
	GROUP BY Student.Sno, Sname

10、查询VB课程考试成绩前3名的同学学号和VB成绩。(不包含并列)

SELECT TOP 3 Sno,Grade From SC
	join Course on Course.Cno = SC.Cno
	WHERE Cname = 'VB' ORDER BY Grade DESC  	/*order by desc降序排列*/

11、查询计算机系男同学的学号,性别和年龄,按年龄从大到小排序。

SELECT Sno,Ssex,Sage FROM Student
	WHERE Ssex = '男' and Sdept = '计算机系'
	ORDER BY Sage DESC		/*同上*/

12、把‘vb’课程不及格的同学分数改为60分。(用多表连接实现)

UPDATE SC SET Grade = 60	/*注意这里是UPDATE更新*/
	WHERE Cno in (SELECT Cno FROM Course WHERE Cname = 'VB')	/*先选出vb的cno,再用这个cno去查sc表。、*/
	and Grade < 60

13、删除‘vb’课程的选课记录。(用多表连接实现)

DELETE FROM SC 		/*DELETE删除数据*/
	WHERE Cno in (SELECT Cno FROM Course WHERE Cname = 'vb')	/*先选出vb的cno,再用这个cno去查sc表*/

14、创建视图,查询每个学生的选课门数,平均成绩。

CREATE view IS_STUDENT 
AS
	SELECT Sno,COUNT(Sno) 选课门数, AVG(Grade)平均成绩	/*以这个查询结果创建视图!!!!!*/
	FROM SC 
	GROUP BY Sno

15、统计指定学号同学的不及格课程的门数,统计结果用输出参数返回。

CREATE PROCEDURE Failed
@dept VARCHAR(20), @rs INT OUTPUT	/*设定变量dept(指定的学号),rs(输出值)*/
AS 
	SELECT @rs = COUNT(Grade) From SC
	WHERE Sno = @dept
	AND Grade < 60

16、用后触发型触发器实现。不能将不及格的同学的成绩改为及格。违反约束,给出提示“不能将不及格成绩改为及格”。

CREATE TRIGGER Tri_Grade
	ON SC AFTER UPDATE	/*后触发型trigger*/
AS
IF EXISTS(
	SELECT *FROM inserted a join deleted b	/*如果更改前和更改后,有小于60分的成绩被改成大于60分*/
	ON a.Sno =b.Sno and a.Cno=b.Cno
	WHERE
	b.Grade<60 AND a.Grade>=60
)
BEGIN
	ROLLBACK
	PRINT '不能将不及格成绩改为及格'	/*就rollback回溯,并且做出提示*/
END

17、 用标量函数实现。查询指定学号同学的不及格课程的门数。

CREATE FUNCTION dbo.F_count(@Sno CHAR(7))	/*设定函数,变量为sno。*/
RETURNS INT AS
BEGIN
	return (
		SELECT COUNT(*) FROM SC 	/*查询这个学号的内容。*/
		WHERE Sno=@Sno AND Grade<60
	)
END

18、用内联表值函数实现。查询指定学号同学的不及格课程的门数。

CREATE FUNCTION dbo.F_snoavg(@dept CHAR(20))
RETURNS TABLE AS	/*内联表*/

RETURN(
	SELECT Student.Sno,COUNT(*) 不及格门数
	FROM
	Student join SC on Student.Sno=Sc.Sno	/*多表链接*/
	WHERE
	Student.Sno=@dept AND Grade<60
	GROUP BY student.sno
)

image

posted @   晓梦ペ  阅读(868)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示