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'
如有错误欢迎大家评论区批评指正