SQL数据查询——综合练习(二)

S,SC,C关系表

实验中要使用包括如下三个表的“教学管理”数据库JXGL:
(1)学生表Student,由学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)、所在系(Sdept)五个属性组成,
记作:Student(Sno,Sname,Ssex,Sage,Sdept),其中主码为Sno。
(2)课程表Course,由课程号(Cno)、课程名(Cname)、先修课号(Cpno)、学分(Ccredit)四个属性组成,
记作:Course(Cno,Cname,Cpno,Ccredit),其中主码为Cno。
(3)学生选课SC,由学号(Sno)、课程号(Cno)、成绩(Grade)三个属性组成,
记作:SC(Sno,Cno,Grade),其中主码为(SNO,CNO)。

基于“教学管理”数据库JXGL,试用SQL的查询语句表达下列查询:
(1)检索至少选修一门课程的女学生姓名。

SELECT Sname
FROM Student
WHERE Ssex='女' AND Sno IN
	(SELECT Sno
 	FROM SC
 	GROUP BY Sno
 	HAVING COUNT(Cno)>=1)

(2)检索王同学不学的课程的课程号。

SELECT Cno
FROM Course
WHERE Cno NOT IN
	(SELECT Cno
 	FROM SC
 	WHERE Sno IN
 		(SELECT Sno
  		FROM Student
  		WHERE Sname LIKE '王%'))

(3)检索选修了所有3学分课程的学生学号。

#本题用exists更方便一些
SELECT DISTINCT Sno
FROM SC X
WHERE NOT EXISTS
	(SELECT *
 	FROM Course
 	WHERE Ccredit=3 AND NOT EXISTS
 		(SELECT *
  		FROM SC Y
  		WHERE X.Sno=Y.Sno AND Course.Cno=Y.Cno))

(4)统计所有学生选修的课程门数。

SELECT Student.Sno,COUNT(Cno)
FROM Student LEFT OUTER JOIN SC ON Student.Sno=SC.Sno  --也可能存在学生不选修任何课的情况
GROUP BY Student.Sno

(5)求选修4号课程的学生的平均年龄。

SELECT AVG(Sage)
FROM Student
WHERE Sno IN
	(SELECT DISTINCT Sno
 	FROM SC
 	WHERE Cno='4')

(6)求学分为3的每门课程的学生平均成绩。

SELECT SC.Cno,AVG(Grade)
FROM Course INNER JOIN SC ON Course.Cno=SC.Cno
WHERE Ccredit=3
GROUP BY SC.Cno

(7)检索学号比王非同学大,而年龄比他小的学生姓名。

SELECT Sname
FROM Student
WHERE Sno>(SELECT Sno FROM Student WHERE Sname='王非') AND Sage<(SELECT Sage FROM Student WHERE Sname='王非')

(8)求年龄大于女同学平均年龄的男学生姓名和年龄。

SELECT Y.Sname,Y.Sage
FROM Student AS Y
WHERE Y.Ssex='男' AND Y.Sage>
	(SELECT AVG(X.Sage)
 	FROM Student AS X
 	WHERE X.Ssex='女')

(9)求年龄大于所有女同学年龄的男学生姓名和年龄。

SELECT Sname,Sage
FROM Student
WHERE Sage>ALL
	(SELECT Sage
 	FROM Student
 	WHERE Ssex='女')

(10)检索所有比“王华”年龄大的学生姓名、年龄和性别。

SELECT Sname,Sage,Ssex
FROM Student
WHERE Sage>
	(SELECT Sage
 	FROM Student
 	WHERE Sname='王华')

(11)检索选修4门以上课程的学生总成绩(不统计不及格的课程),并要求按总成绩的降序排列出来。

#题目的意思是检索选修4门以上课程,但是统计学生总成绩只统计及格的
SELECT Sno,SUM(Grade)
FROM SC
WHERE Sno IN
	(SELECT Sno
 	FROM SC
 	GROUP BY Sno
 	HAVING COUNT(Cno)>4) AND Grade>=60
GROUP BY Sno

STUDENT,COURSE,TEACHER,SC关系表

设有如下四个基本表:
(1)学生表STUDENT,由学号(SNO)、姓名(SNAME)、性别(SEX)、年龄(AGE)、所在班级(CLASS)五个属性组成,
记作:STUDENT(SNO,SNAME,SEX,AGE,CLASS),其中主码为SNO;
(2)课程表COURSE,由课程号(CNO)、课程名(CNAME)、教师号(TNO)三个属性组成,
记作:COURSE(CNO,CNAME,TNO),其中主码为CNO;
(3)教师表TEACHER,由教师编号(TNO)、姓名(TNAME)、性别(SEX)、年龄(AGE)、职称(PROF)、所在系(DEPT)六个属性组成,
记作:TEACHER(TNO,TNAME,SEX,AGE,PROF,DEPT),其中主码为TNO;
(3)学生选课SC,由学号(SNO)、课程号(CNO)、成绩(GRADE)三个属性组成,
记作:SC(SNO,CNO,GRADE),其中主码为(SNO,CNO)。

请先创建数据库及根据表内容创建表结构,并添加表记录,实践以下SQL命令操作:

(12)查询选修’8105’课程的成绩高于’980302’号同学成绩的所有同学的记录(学号和成绩)。

SELECT SNO,GRADE
FROM SC
WHERE CNO='8105' AND GRADE>(SELECT GRADE FROM SC WHERE SNO='980302' AND CNO='8105')

(13)查询与学号为980103的同学同岁的所有学生的SNO、SNAME和AGE。

SELECT SNO,SNAME,AGE
FROM STUDENT
WHERE AGE=(SELECT AGE FROM STUDENT WHERE SNO='980103')

(14)查询“钱军”教师任课的课程号,选修其课程学生的学号和成绩。

SELECT SC.CNO,SNO,GRADE
FROM COURSE,SC,TEACHER
WHERE TNAME='钱军' AND TEACHER.TNO=COURSE.TNO AND SC.CNO=COURSE.CNO

(15)查询选修某课程的学生人数多于20人的教师姓名。

SELECT DISTINCT TNAME
FROM TEACHER,SC,COURSE
WHERE TEACHER.TNO=COURSE.TNO AND SC.CNO=COURSE.CNO
GROUP BY SC.CNO,TNAME
HAVING COUNT(SNO)>20

(16)查询同学选修编号为“8105”课程且成绩至少高于其选修编号为“8245”课程的同学的SNO及“8105”课程成绩,并按成绩从高到低次序排列。

SELECT X.SNO,X.GRADE AS '8105课程成绩'
FROM SC X
WHERE X.CNO='8105' AND X.GRADE>
	(SELECT Y.GRADE
 	FROM SC Y
 	WHERE Y.CNO='8245' AND Y.SNO=X.SNO)
ORDER BY 2 DESC

(17)查询选修编号为“8105”课程且成绩高于所有选修编号为“8245”课程成绩的同学的CNO、SNO、GRADE。

SELECT CNO,SNO,GRADE
FROM SC
WHERE CNO='8105' AND GRADE>ALL
	(SELECT GRADE
	FROM SC
	WHERE CNO='8245')

(18)查询成绩比该课程平均成绩高的学生的成绩表。

SELECT X.SNO,X.CNO,X.GRADE
FROM SC X
WHERE X.GRADE>
	(SELECT AVG(Y.GRADE) 
  	FROM SC Y 
  	WHERE X.CNO=Y.CNO
  	GROUP BY Y.CNO)

(19)列出所有未讲课教师的TNAME和DEPT。

SELECT TNAME,DEPT
FROM TEACHER
EXCEPT
SELECT TNAME,DEPT
FROM TEACHER INNER JOIN COURSE ON TEACHER.TNO=COURSE.TNO

(20)查询每门课最高分的学生的SNO、CNO、GRADE。

SELECT X.SNO,X.CNO,X.GRADE
FROM SC X
WHERE X.GRADE=
	(SELECT MAX(Y.GRADE) 
  	FROM SC Y 
  	WHERE Y.CNO=X.CNO
  	GROUP BY Y.CNO)

(21)查询与“李华”同性别并同班的同学SNAME。

SELECT DISTINCT SNAME
FROM STUDENT
WHERE SEX=(SELECT SEX FROM STUDENT WHERE SNAME='李华')
AND CLASS=(SELECT CLASS FROM STUDENT WHERE SNAME='李华')
EXCEPT
SELECT SNAME
FROM STUDENT
WHERE SNAME='李华'

(22)查询“女”教师及其所上的课程。(女教师所有信息,以及所授课程的课号和课程名)

SELECT TEACHER.TNO,TNAME,SEX,AGE,PROF,DEPT,CNO,CNAME
FROM TEACHER INNER JOIN COURSE ON TEACHER.TNO=COURSE.TNO
WHERE SEX='女'

(23)查询选修“数据库系统”课程的“男”同学的成绩表。

SELECT SC.SNO,SNAME,GRADE
FROM SC,STUDENT,COURSE
WHERE SC.SNO=STUDENT.SNO AND SC.CNO=COURSE.CNO AND SEX='男' AND CNAME='数据库系统'

(24)查询所有比刘涛年龄大的教师姓名、年龄和刘涛的年龄。

SELECT X.TNAME,X.AGE,Y.AGE
FROM TEACHER X,TEACHER Y
WHERE X.AGE>Y.AGE AND Y.TNAME='刘涛'

(25)查询不讲授“8104”号课程的教师姓名。

SELECT TNAME
FROM TEACHER
EXCEPT
SELECT TNAME
FROM TEACHER INNER JOIN COURSE ON TEACHER.TNO=COURSE.TNO
WHERE CNO='8104'

如有错误欢迎大家评论区批评指正

发布了21 篇原创文章 · 获赞 16 · 访问量 1418

猜你喜欢

转载自blog.csdn.net/SAMSARS/article/details/105595394