2.在aam数据库的student, course, teacher, sc 和tc五张表中完成以下查询:(1)查询所有课程的课程名,课程性质,学分和学时属性列,要求在查询结果中用中文重新命名属性列的列名。 (2)查询学生所在专业的专业名包含“大数据”三个字的所有学生学号,姓名、专业名和所在学院。 (3)查询“计算机科学与技术”专业学生的姓名和年龄。( 年龄属性列需要计算得到) (4)查询“软件工程”专业1995年出生的学生信息,查询结果按学生出生的时间先后排序。 (5)查询每门课程的修课人数和考试最高分,列出课程号,选修课程人数和该课程的最高成绩。 (6)查询课程性质是选修,并且选修人数在60人以上的课程名、课程学时和开设学期。 (7)统计每个学院的学生人数。 (8)查询信息工程学院所有学生已修课程的总学分,要求列出学号、姓名和总学分。 (9)查询同时选修了“中间件技术”和“Java EE技术”两门选修课的学生学号。(10)查询1994年1月1日以前出生的学生的姓名和专业。 (11) 查询总共修了20门以上课程(包括必修课和选修课)的学生学号和姓名。(12)查询比本院学生平均年龄小的学生信息,要求列出姓名与年龄。 (13)查询一门课也没有带的教师姓名。 (14) 查询比所有“计算机科学与技术”专业学生年龄都大的学生。
用户的问题共有14个,每个都涉及不同的查询条件和操作。我要逐一分析每个查询,考虑表之间的关联、需要的字段、过滤条件以及可能的聚合函数或连接操作。
首先看第一个查询:(1)查询所有课程的课程名,课程性质,学分和学时属性列,并用中文重命名列名。这里应该使用AS关键字来为列设置别名,直接从course表中选择对应字段,并赋予中文别名,比如cname AS 课程名,这样结果列名就会是中文的。
接下来是第二个查询:(2)专业名包含“大数据”的学生学号、姓名等。这里需要使用LIKE操作符,注意是否区分大小写,通常数据库默认不区分,所以'%大数据%'应该可以匹配到任何位置包含这三个字的专业名。可能需要检查字段名称是否正确,比如专业名是否在student表中。
第三个问题:(3)“计算机科学与技术”专业学生的姓名和年龄。年龄需要计算,可能需要使用当前日期减去出生日期,不同数据库的函数可能不同,比如在MySQL中是YEAR(NOW())-YEAR(birthdate),但需要考虑月份的影响。用户可能需要更精确的计算,比如使用DATEDIFF然后除以365,但这里可能需要简化处理,或者假设有年龄字段,但题目说需要计算,所以必须用日期函数。
第四个查询:(4)“软件工程”专业1995年出生的学生,按出生时间排序。这里需要提取年份,可以用YEAR(birthdate)=1995,但注意是否有时间部分。排序使用ORDER BY birthdate ASC,因为ASC是默认的,但用户要求按时间先后,可能出生早的在前。
第五个问题:(5)每门课程的修课人数和最高分,需要用到COUNT和MAX聚合函数,按课程号分组。这里要注意考试可能有成绩为NULL的情况,是否需要排除?题目没说,所以假设sc表中的记录都有效,COUNT(*)即可。
第六个查询:(6)课程性质是选修,选修人数60人以上。这里可能需要子查询或者HAVING子句,因为选修人数是聚合结果。需要连接course和sc表,筛选课程性质为选修,然后按课程分组,HAVING COUNT(*) >60。
第七题:(7)统计每个学院的学生人数,用GROUP BY学院,COUNT(学号)。注意学院字段可能存在student表中,且名称可能为college或department,需要确认。
第八题:(8)信息工程学院学生的总学分,需要计算已修课程的总学分,可能涉及sc和course表连接,SUM(course.credit),但要注意课程是否通过,比如是否有成绩条件,题目没提,所以假设所有选修的课程都计入学分。
第九题:(9)同时选修两门选修课的学生学号。可以使用自连接或IN子查询,或者使用INTERSECT。但有些数据库不支持INTERSECT,可能需要用INNER JOIN sc两次,分别对应两门课程,然后找共同的学号。
第十题:(10)1994年1月1日前出生的学生,条件birthdate < '1994-01-01',注意日期格式是否正确。
第十一题:(11)修课超过20门的学生,需要sc表中按学号分组,COUNT(course_id) >20,注意是否包括必修和选修,题目说包括,所以所有课程都算。
第十二题:(12)比本院平均年龄小的学生,需要用到窗口函数或子查询计算每个学院的平均年龄,然后比较。例如,使用子查询获取学院的平均年龄,然后学生年龄小于该值。
第十三题:(13)没带课的教师姓名,可能需要teacher和tc表左连接,然后筛选tc.teacher_id IS NULL。
第十四题:(14)比所有“计算机”专业学生年龄大的学生。这里需要年龄大于计算机专业学生的最大年龄,可以用子查询找到该最大年龄,然后筛选年龄更大的学生。
在编写每个查询时,需要注意表别名是否正确,字段是否存在,特别是连接条件是否正确。例如,sc表可能关联学生和课程,而tc表关联教师和课程。还要确保聚合函数正确使用,尤其是GROUP BY的字段是否匹配。
另外,用户可能对某些函数或语法不熟悉,比如计算年龄的方式,可能需要根据具体数据库调整。例如,SQL Server使用DATEDIFF,而MySQL可能不同。但用户没有指定数据库类型,所以尽量使用通用语法。
最后,检查每个查询是否符合要求,特别是列名是否重命名为中文,排序是否正确,条件是否覆盖所有情况。需要确保每个步骤逻辑正确,避免遗漏连接条件或错误的分组。以下是针对 aam数据库 中 student
, course
, teacher
, sc
, tc
五张表的查询实现,按题目顺序逐条解答:
(1) 查询所有课程的课程名、课程性质、学分和学时,并用中文重命名列名
SELECT
cname AS 课程名,
ctype AS 课程性质,
credit AS 学分,
chour AS 学时
FROM course;
(2) 查询专业名包含“大数据”的学生学号、姓名、专业名和学院
SELECT
sno AS 学号,
sname AS 姓名,
major AS 专业名,
college AS 所在学院
FROM student
WHERE major LIKE '%大数据%';
(3) 查询“计算机科学与技术”专业学生的姓名和年龄(需计算年龄)
SELECT
sname AS 姓名,
YEAR(CURRENT_DATE) - YEAR(birthdate) AS 年龄
FROM student
WHERE major = '计算机科学与技术';
(4) 查询“软件工程”专业1995年出生的学生,按出生时间排序
SELECT *
FROM student
WHERE
major = '软件工程'
AND YEAR(birthdate) = 1995
ORDER BY birthdate ASC;
(5) 查询每门课程的修课人数和最高分
SELECT
cno AS 课程号,
COUNT(*) AS 选修人数,
MAX(grade) AS 最高成绩
FROM sc
GROUP BY cno;
(6) 查询选修人数超过60人的选修课
SELECT
c.cname AS 课程名,
c.chour AS 学时,
c.term AS 开设学期
FROM course c
JOIN sc ON c.cno = sc.cno
WHERE
c.ctype = '选修'
GROUP BY c.cno
HAVING COUNT(*) > 60;
(7) 统计每个学院的学生人数
SELECT
college AS 学院,
COUNT(*) AS 学生人数
FROM student
GROUP BY college;
(8) 查询信息工程学院学生的总学分
SELECT
s.sno AS 学号,
s.sname AS 姓名,
SUM(c.credit) AS 总学分
FROM student s
JOIN sc ON s.sno = sc.sno
JOIN course c ON sc.cno = c.cno
WHERE
s.college = '信息工程学院'
GROUP BY s.sno, s.sname;
(9) 查询同时选修“中间件技术”和“Java EE技术”的学生学号
SELECT sno
FROM sc
WHERE cno IN (
SELECT cno FROM course
WHERE cname = '中间件技术'
)
INTERSECT
SELECT sno
FROM sc
WHERE cno IN (
SELECT cno FROM course
WHERE cname = 'Java EE技术'
);
(10) 查询1994年1月1日前出生的学生
SELECT
sname AS 姓名,
major AS 专业
FROM student
WHERE birthdate < '1994-01-01';
(11) 查询修课超过20门的学生
SELECT
sno AS 学号,
sname AS 姓名
FROM student
WHERE sno IN (
SELECT sno
FROM sc
GROUP BY sno
HAVING COUNT(*) > 20
);
(12) 查询比本院平均年龄小的学生
SELECT
sname AS 姓名,
YEAR(CURRENT_DATE) - YEAR(birthdate) AS 年龄
FROM student s1
WHERE YEAR(CURRENT_DATE) - YEAR(birthdate) < (
SELECT AVG(YEAR(CURRENT_DATE) - YEAR(birthdate))
FROM student s2
WHERE s1.college = s2.college
GROUP BY college
);
(13) 查询未带课的教师姓名
SELECT tname AS 教师姓名
FROM teacher
WHERE tno NOT IN (
SELECT DISTINCT tno
FROM tc
);
(14) 查询比所有“计算机科学与技术”学生年龄大的学生
SELECT *
FROM student
WHERE YEAR(birthdate) < (
SELECT MIN(YEAR(birthdate))
FROM student
WHERE major = '计算机科学与技术'
);
关键说明
- 表关联:涉及多表时使用
JOIN
明确关联条件(如sc
和course
通过cno
关联)。 - 聚合函数:
COUNT
,MAX
,SUM
需配合GROUP BY
使用。 - 日期处理:
YEAR()
提取年份,CURRENT_DATE
获取当前日期。 - 性能优化:复杂查询可拆分验证,逐步调试。
如果需要具体字段名或表结构调整,请提供表结构详情!
相关推荐



















