数据库实验三(SQL 查询语句实践与总结)

一、实验目的

  1. 掌握涉及一个以上数据表的查询方法。
  2. 深入理解多表之间的连接,包括等值连接、自然连接、非等值连接、自身连接、外连接和复合条件连接等多种连接方式。
  3. 熟练运用嵌套查询,通过多个简单查询构建复杂查询,以此增强 SQL 的查询能力。

二、各类查询 SQL 语句及分析

(一)查询特定班级学生选课情况

  1. 问题描述:查询 20161151 班的学生在大学一年级选修的课程情况,查询结果要显示学号 (Sno)、姓名 (Sname)、专业名 (Mname)、学年 (Racademicyear)、学期 (Rterm)、选课的课程号 (Cno)、选课的课程名称 (Cname) 及成绩(Grade),并按照学号、学年、学期升序排序。
  2. 我的答案 SQL 语句
SELECT 
    S.Sno AS 学号,
    S.Sname AS 姓名,
    M.Mname AS 专业名,
    R.Racademicyear AS 学年,
    R.Rterm AS 学期,
    R.Cno AS 选课的课程号,
    C.Cname AS 选课的课程名称,
    R.Grade AS 成绩
FROM 
    Students42 S
JOIN 
    Reports42 R ON S.Sno = R.Sno
JOIN 
    Courses42 C ON R.Cno = C.Cno
JOIN 
    Major42 M ON S.Mno = M.Mno
WHERE 
    S.Sclass = '20161151'
    AND R.Racademicyear = 2017  -- 假设大学一年级对应学年为 2017
ORDER BY 
    S.Sno, R.Racademicyear, R.Rterm;
  1. 正确答案 SQL 语句

-- MySQL 语句(3 分)
SELECT S.Sno, Sname, Mname, Racademicyear, Rterm, C.Cno, Cname, Grade
FROM Students S, Major M, Courses C, Reports R
WHERE S.Sno=R.Sno AND S.Mno=M.Mno AND C.Cno=R.Cno
AND Sclass='20161151' AND Racademicyear=2016
ORDER BY S.Sno,Racademicyear, Rterm;

-- 或者
SELECT S.Sno, Sname, Mname, Racademicyear, Rterm, C.Cno, Cname, Grade
FROM Students S INNER JOIN Major M ON S.Mno=M.Mno 
           INNER JOIN Reports R ON S.Sno=R.Sno 
           INNER JOIN Courses C ON C.Cno=R.Cno
WHERE Sclass='20161151' AND Racademicyear=2016
ORDER BY S.Sno,Racademicyear, Rterm;

(二)查询教师授课信息

  1. 问题描述:查询教师张雪的授课信息,查询结果显示教师编号 (Tno)、姓名 (Tname)、授课学年 (Tacademicyear)、授课学期 (Tterm)、授课的课程编号 (Cno)、课程名 (Cname) 以及授课班级 (Sclass),结果按授课学年、授课学期升序排序。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 姓名,
    Tu.Tacademicyear AS 授课学年,
    Tu.Tterm AS 授课学期,
    Tu.Cno AS 课程编号,
    C.Cname AS 课程名,
    Tu.Sclass AS 授课班级
FROM 
    Teachers42 T
JOIN 
    Tutors42 Tu ON T.Tno = Tu.Tno
JOIN 
    Courses42 C ON Tu.Cno = C.Cno
WHERE 
    T.Tname = '张雪'
ORDER BY 
    Tu.Tacademicyear, Tu.Tterm;

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(3 分)
SELECT T.Tno, Tname,Tacademicyear,Tterm,C.Cno,Cname,Sclass
FROM Teachers T, Tutors Tut, Courses C
WHERE T.Tno=Tut.Tno AND Tut.Cno=C.Cno
AND Tname='张雪'
ORDER BY Tacademicyear,Tterm;

(三)查询学院各专业学生数

  1. 问题描述:查询计算机与信息工程学院的各个专业的学生数,查询结果显示专业号 (Mno)、专业名称 (Mname)、学生人数,按专业号升序排序,并用中文名显示属性列。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    M.Mno AS 专业号,
    M.Mname AS 专业名称,
    COUNT(S.Sno) AS 学生人数
FROM 
    Major42 M
LEFT JOIN 
    Students42 S ON M.Mno = S.Mno
WHERE 
    M.Dno = (SELECT Dno FROM Department42 WHERE Dname = '计算机与信息工程学院')
GROUP BY 
    M.Mno, M.Mname
ORDER BY 
    M.Mno ASC;

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(3 分)
SELECT M.Mno 专业号, Mname 专业名称, COUNT(*) 学生人数 
FROM Students S, Department D, Major M
WHERE S.Dno=D.Dno AND S.Mno=M.Mno
AND Dname='计算机与信息工程学院'
GROUP BY M.Mno, Mname
ORDER BY M.Mno;

(四)自身连接查询教师信息

  1. 问题描述:用自身连接查询和 “王一凡” 在同一个学院,且总工资(基本工资 Tsal + 岗位津贴 Tcomm)比 “王一凡” 高的教师的信息,结果显示教师编号 (Tno)、姓名 (Tname) 和总工资,并用中文显示属性列名。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    T1.Tno AS 教师编号,
    T1.Tname AS 姓名,
    (T1.Tsal + T1.Tcomm) AS 总工资
FROM 
    Teachers42 T1
JOIN 
    Teachers42 T2 ON T1.Dno = T2.Dno
WHERE 
    T2.Tname = '王一凡'
    AND (T1.Tsal + T1.Tcomm) > (T2.Tsal + T2.Tcomm);

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(3 分)(若未使用自身连接,但语句正确,则扣 1 分)
SELECT T1.Tno AS "教师编号", T1.Tname AS "教师姓名", T1.Tsal+t1.Tcomm AS "总工资"
FROM Teachers T1, Teachers T2
WHERE T1.Dno=T2.Dno AND T2.Tname='王一凡'
AND (T1.Tsal+T1.Tcomm)>(T2.Tsal+T2.Tcomm);

(五)自身连接查询课程信息

  1. 问题描述:用自身连接查询前序课程是数据结构的课程的信息,查询结果显示课程编号(Cno)、课程名称(Cname)和学分(Ccredit)。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    C1.Cno AS 课程编号,
    C1.Cname AS 课程名称,
    C1.Ccredit AS 学分
FROM 
    Courses42 C1
JOIN 
    Courses42 C2 ON C1.Pre_Cno = C2.Cno
WHERE 
    C2.Cname = '数据结构';

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(3 分)(若未使用自身连接,但语句正确,则扣 1 分)
SELECT C1.Cno, C1.Cname, C1.Ccredit
FROM Courses C1, Courses C2
WHERE C1.Pre_Cno=C2.Cno AND C2.Cname='数据结构';

(六)自身连接查询教师授课班级情况

  1. 问题描述:用自身连接查询既给 20161121 班上过课,也给 20161151 班上过课的教师信息,查询结果显示教师编号 (Tno)、教师姓名 (Tname)。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 教师姓名
FROM 
    Tutors42 Tu
JOIN 
    Teachers42 T ON Tu.Tno = T.Tno
WHERE 
    Tu.Sclass IN ('20161121', '20161151')
GROUP BY 
    T.Tno, T.Tname
HAVING 
    COUNT(DISTINCT Tu.Sclass) = 2;

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(4 分)(若未使用自身连接,但语句正确,则扣 1 分)
SELECT DISTINCT Tut1.Tno, Tname
FROM Tutors Tut1, Tutors Tut2, Teachers T
WHERE Tut1.Tno=Tut2.Tno AND Tut1.Tno=T.Tno
AND Tut1.Sclass='20161121' AND Tut2.Sclass='20161151';

(七)查询课程选课情况

  1. 问题描述:查询课程表中的所有课程在每个学期的选课情况,查询结果以中文名显示课程编号 (Cno)、课程名称 (Cname)、选课学年 (Racademicyear)、选课学期 (Rterm) 及该学年该学期的选课人数 (SelNumber),按课程编号、选课学年、选课学期升序排序。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    C.Cno AS 课程编号,
    C.Cname AS 课程名称,
    R.Racademicyear AS 选课学年,
    R.Rterm AS 选课学期,
    COUNT(R.Sno) AS 选课人数
FROM 
    Courses42 C
LEFT JOIN 
    Reports42 R ON C.Cno = R.Cno
GROUP BY 
    C.Cno, C.Cname, R.Racademicyear, R.Rterm
ORDER BY 
    C.Cno ASC, R.Racademicyear ASC, R.Rterm ASC;

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(4 分)
SELECT C.Cno AS "课程编号", Cname AS "课程名称", Racademicyear AS "选课学年", Rterm AS "选课学期", COUNT(*) AS "选课人数"
FROM Courses C
LEFT JOIN Reports R ON C.Cno=R.Cno
GROUP BY C.Cno, Cname, Racademicyear, Rterm
ORDER BY C.Cno, Racademicyear,Rterm;

(八)查询学院教师授课情况

  1. 问题描述:查询教师表中的每一位数学与统计学院的教师的授课课情况,查询结果显示教师编号 (Tno)、教师姓名 (Tname)、授课学年 (Tacademicyear)、授课学期 (Tterm)、课程编号 (Cno) 及课程名称 (Cname),按教师编号、开课学年、授课学期升序排序。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 教师姓名,
    Tu.Tacademicyear AS 授课学年,
    Tu.Tterm AS 授课学期,
    Tu.Cno AS 课程编号,
    C.Cname AS 课程名称
FROM 
    Teachers42 T
JOIN 
    Tutors42 Tu ON T.Tno = Tu.Tno
JOIN 
    Courses42 C ON Tu.Cno = C.Cno
WHERE 
    T.Dno = (SELECT Dno FROM Department42 WHERE Dname = '数学与统计学院')
ORDER BY 
    T.Tno ASC, Tu.Tacademicyear ASC, Tu.Tterm ASC;

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(4 分)
SELECT T.Tno, Tname,Tacademicyear, Tterm, Tut.Cno, Cname
FROM Department D
INNER JOIN Teachers T ON T.Dno=D.Dno
LEFT JOIN Tutors Tut ON T.Tno=Tut.Tno
LEFT JOIN Courses C ON Tut.Cno=C.Cno
WHERE Dname='数学与统计学院';

(九)谓词 IN 嵌套查询学生信息

  1. 问题描述:使用谓词 IN 嵌套查询,查询有课程成绩不及格的学生的信息,结果显示学号 (Sno)、姓名 (Sname) 及所在班级 (Sclass)。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    S.Sno AS 学号,
    S.Sname AS 姓名,
    S.Sclass AS 所在班级
FROM 
    Students42 S
WHERE 
    S.Sno IN (
        SELECT R.Sno 
        FROM Reports42 R 
        WHERE R.Grade < 60  -- 假设不及格的成绩为 60 分以下
    );

  1. 正确答案 SQL 语句

收起

sql

-- MySQL 语句(3 分)(若未使用谓词 IN 的嵌套查询,但结果正确,则扣 1 分)
SELECT Sno,Sname,Sclass 
FROM Students 
WHERE Sno IN
( SELECT Sno FROM Reports
  WHERE Grade<60);

(十)谓词 IN 嵌套查询教师信息

  1. 问题描述:使用谓词 IN 嵌套查询,查询在 2014 学年有授课的教师的信息,结果显示教师编号 (Tno)、教师姓名 (Tname) 及职称 (Tprof)。
  2. 我的答案 SQL 语句

收起

sql

SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 教师姓名,
    T.Tprof AS 职称
FROM 
    Teachers42 T
WHERE 
    T.Tno IN (
        SELECT Tu.Tno 
        FROM Tutors42 Tu 
        WHERE Tu.Tacademicyear = 2014
    );
  1. 正确答案 SQL 语句
-- MySQL 语句(3 分)(若未使用谓词 IN 嵌套查询,但结果正确,则扣 1 分)
SELECT Tno, Tname, Tprof
FROM Teachers
WHERE Tno IN
( SELECT Tno
  FROM Tutors
  WHERE Tacademicyear=2014);

(十一)嵌套查询教师工资信息

  1. 问题描述:使用嵌套查询,查询计算机与信息工程学院中总工资高于本学院的平均总工资的教师信息,结果以中文名称显示教师编号 (Tno)、教师姓名 (Tname)、职称(Tprof)及总工资。
  2. 我的答案 SQL 语句
SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 教师姓名,
    T.Tprof AS 职称,
    (T.Tsal + T.Tcomm) AS 总工资
FROM 
    Teachers42 T
WHERE 
    T.Dno = (SELECT Dno FROM Department42 WHERE Dname = '计算机与信息工程学院')
    AND (T.Tsal + T.Tcomm) > (
        SELECT AVG(T2.Tsal + T2.Tcomm) 
        FROM Teachers42 T2 
        WHERE T2.Dno = T.Dno
    );
  1. 正确答案 SQL 语句
-- MySQL 语句(4 分)
SELECT Tno AS "教师编号", Tname AS "教师姓名", Tprof AS "职称", Tsal+Tcomm AS "总工资"
FROM Teachers T, Department D
WHERE T.Dno=D.Dno AND Dname='计算机与信息工程学院'
AND (Tsal+Tcomm)>
( SELECT AVG(Tsal+Tcomm)
  FROM Teachers
  WHERE Dno=
( SELECT Dno
  FROM Department
  WHERE Dname='计算机与信息工程学院'
)
);

(十二)嵌套查询总工资高于所有学院平均工资的教师信息

  1. 问题描述:使用嵌套查询,查询总工资高于所有学院的平均总工资的教师信息,结果显示教师编号 (Tno)、教师姓名 (Tname)、学院名称 (Dname)、职称 (Tprof) 及总工资,并用中文显示属性列名。
  2. 我的答案 SQL 语句
SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 教师姓名,
    D.Dname AS 学院名称,
    T.Tprof AS 职称,
    (T.Tsal + T.Tcomm) AS 总工资
FROM 
    Teachers42 T
JOIN 
    Department42 D ON T.Dno = D.Dno
WHERE 
    (T.Tsal + T.Tcomm) > (
        SELECT AVG(T2.Tsal + T2.Tcomm) 
        FROM Teachers42 T2
    );
  1. 正确答案 SQL 语句
-- MySQL 语句(4 分)
SELECT Tno AS "教师编号", Tname AS "教师姓名", Dname AS "学院名称", Tprof AS "职称", Tsal+Tcomm AS "总工资"
FROM Teachers T, Department D
WHERE T.Dno=D.Dno 
AND (Tsal+Tcomm)> ALL
( SELECT AVG(Tsal+Tcomm)
  FROM Teachers
  GROUP BY Dno
);

(十三)嵌套查询学生学分信息

  1. 问题描述:使用嵌套查询,查询已获学分高于 2014 级所有计算机与信息工程学院的学生获得的学分的学生学号 (Sno)、姓名 (Sname) 及已获得的总学分,并用中文显示属性列名。
  2. 我的答案 SQL 语句
SELECT 
    S.Sno AS 学号,
    S.Sname AS 姓名,
    SUM(C.Ccredit) AS 已获学分
FROM 
    Students42 S
JOIN 
    Reports42 R ON S.Sno = R.Sno
JOIN 
    Courses42 C ON R.Cno = C.Cno
WHERE 
    R.Grade >= 60 
    AND S.Sno IN (
        SELECT 
            S2.Sno 
        FROM 
            Students42 S2
        JOIN 
            Reports42 R2 ON S2.Sno = R2.Sno
        JOIN 
            Courses42 C2 ON R2.Cno = C2.Cno
        WHERE 
            R2.Grade >= 60 
            AND S2.Dno = (SELECT Dno FROM Department42 WHERE Dname = '计算机与信息工程学院')
            AND S2.Sno IN (SELECT Sno FROM Students42 WHERE Sno LIKE '2014%')
        GROUP BY 
            S2.Sno
    )
GROUP BY 
    S.Sno, S.Sname
HAVING 
    SUM(C.Ccredit) > (
        SELECT AVG(TotalCredits)
        FROM (
            SELECT 
                SUM(C2.Ccredit) AS TotalCredits
            FROM 
                Students42 S2
            JOIN 
                Reports42 R2 ON S2.Sno = R2.Sno
            JOIN 
                Courses42 C2 ON R2.Cno = C2.Cno
            WHERE 
                R2.Grade >= 60 
                AND S2.Dno = (SELECT Dno FROM Department42 WHERE Dname = '计算机与信息工程学院')
                AND S2.Sno IN (SELECT Sno FROM Students42 WHERE Sno LIKE '2014%')
            GROUP BY 
                S2.Sno
        ) AS SubQuery
    );

  1. 正确答案 SQL 语句
-- MySQL 语句(6 分)
SELECT S.Sno,Sname,SUM(Ccredit) TotalCredit
FROM Students S, Reports R, Courses C
WHERE S.Sno=R.Sno AND R.Cno=C.Cno AND R.Grade>=60
GROUP BY S.Sno,Sname
HAVING SUM(Ccredit) >ALL
(SELECT SUM(Ccredit)
FROM Students Stu, Reports Rep, Courses Cou
WHERE Stu.Sno=Rep.Sno AND Cou.Cno=Rep.Cno
AND LEFT(Stu.Sno,4)='2014' AND Rep.Grade>=60
AND Dno=
(SELECT Dno FROM Department WHERE Dname='计算机与信息工程学院') 
GROUP BY Rep.Sno
);

(十四)EXISTS 谓词查询教师信息

  1. 问题描述:使用 EXISTS 谓词查询计算机与信息工程学院中没有讲授过课程号为 112p0054 课程的教师编号 (Tno)、姓名 (Tname) 和职称 (Tprof)。
  2. 我的答案 SQL 语句
SELECT 
    T.Tno AS 教师编号,
    T.Tname AS 教师姓名,
    T.Tprof AS 职称
FROM 
    Teachers42 T
WHERE 
    T.Dno = (SELECT Dno FROM Department42 WHERE Dname = '计算机与信息工程学院')
    AND NOT EXISTS (
        SELECT 1
        FROM Tutors42 Tu
        WHERE Tu.Tno = T.Tno 
        AND Tu.Cno = '112P0054'
    );

  1. 正确答案 SQL 语句
-- MySQL 语句(4 分)
SELECT Tno, Tname, Tprof 
FROM Teachers T
WHERE Dno=
( SELECT Dno FROM Department
  WHERE Dname='计算机与信息工程学院')
AND NOT EXISTS
(SELECT * FROM Tutors Tut 
WHERE Tut.Tno=T.Tno AND Tut.Cno='112p0054');

(十五)EXISTS 谓语查询学生信息

  1. 问题描述:使用 EXISTS 谓语查询至少选修了学生 2014112104 选修的全部课程的学生的学号 (Sno)、姓名 (Sname)。
  2. 我的答案 SQL 语句
SELECT 
    S.Sno AS 学号,
    S.Sname AS 姓名
FROM 
    Students42 S
WHERE 
    EXISTS (
        SELECT 1
        FROM Reports42 R
        WHERE R.Sno = '2014112104'
    ) AND NOT EXISTS (
        SELECT 1
        FROM Reports42 R2
        WHERE R2.Sno = S.Sno
        AND R2.Cno NOT IN (
            SELECT R3.Cno
            FROM Reports42 R3
            WHERE R3.Sno = '2014112104'
        )
    );

  1. 正确答案 SQL 语句

-- MySQL 语句(5 分)
SELECT S.Sno, Sname
FROM Students S
WHERE S.Sno<>'2014112104'
AND NOT EXISTS
(SELECT * FROM Reports Rep
WHERE Sno='2014112104'
AND NOT EXISTS
(SELECT * FROM Reports
WHERE S.Sno=Sno AND Rep.Cno=Cno)
);

(十六)嵌套子关系查询课程选课情况

  1. 问题描述:使用嵌套子关系查询,查询课程表中每一门课程的选课情况,查询结果要显示课程编号 (Cno)、课程名称 (Cname)、选课人数、平均分、最高分、最低分。若某门课程还没有被选,则要选课人数显示为‘尚无人选’, 平均分等显示为 NULL;若某门课程有人选,但平均分等结果为 NULL,则显示为’尚无成绩’;非空的数据结果保留两位小数。结果按课程编号升序排序,并用中文显示属性列名。
  2. 我的答案 SQL 语句

SELECT 
    C.Cno AS 课程编号,
    C.Cname AS 课程名称,
    COALESCE(CountR.SelNumber, '尚无人选') AS 选课人数,
    CASE 
        WHEN CountR.AvgGrade IS NULL THEN '尚无成绩'
        ELSE FORMAT(CountR.AvgGrade, 2)
    END AS 平均分,
    CASE 
        WHEN CountR.MaxGrade IS NULL THEN '尚无成绩'
        ELSE FORMAT(CountR.MaxGrade, 2)
    END AS 最高分,
    CASE 
        WHEN CountR.MinGrade IS NULL THEN '尚无成绩'
        ELSE FORMAT(CountR.MinGrade, 2)
    END AS 最低分
FROM 
    Courses42 C
LEFT JOIN (
    SELECT 
        R.Cno,
        COUNT(R.Sno) AS SelNumber,
        AVG(R.Grade) AS AvgGrade,
        MAX(R.Grade) AS MaxGrade,
        MIN(R.Grade) AS MinGrade
    FROM 
        Reports42 R
    GROUP BY 
        R.Cno
) CountR ON C.Cno = CountR.Cno
ORDER BY 
    C.Cno ASC;

  1. 正确答案 SQL 语句

-- MySQL 语句(8 分)
SELECT C.Cno '课程号', Cname '课程名',
(CASE WHEN SelNum IS NULL THEN '尚未选'
ELSE CAST(SelNum AS CHAR)
END) '选课人数',
(COALESCE(CAST(FORMAT(AvgGrd,2) AS CHAR),'尚无成绩')) '平均分',
(COALESCE(CAST(FORMAT(MaxGrd,2) AS CHAR),'尚无成绩')) '最高分',
(COALESCE(CAST(FORMAT(MinGrd,2) AS CHAR),'尚无成绩')) '最低分'
FROM Courses C LEFT JOIN
(SELECT Cno, COUNT(*) 'SelNum', AVG(Grade) 'AvgGrd',
MAX(Grade) 'MaxGrd', MIN(Grade) 'MinGrd'
FROM Reports
GROUP BY Cno) R
ON C.Cno=R.Cno
ORDER BY C.Cno;

(十七)嵌套子关系查询学生选课信息

  1. 问题描述:使用嵌套子关系查询,查询在 2015 学年的第 1 学期,选修了刘伟老师上的计算机科学概论课程的学生的基本信息,查询结果显示所在班级 (Sclass)、学号 (Sno)、姓名 (Sname)、选修的课程编号 (Cno)、课程名 (Cname) 以及授课的教师 (Tname)。
  2. 我的答案 SQL 语句
SELECT 
    S.Sclass AS 所在班级,
    S.Sno AS 学号,
    S.Sname AS 姓名,
    R.Cno AS 选修课程编号,
    C.Cname AS 课程名,
    T.Tname AS 授课教师
FROM 
    Students42 S
JOIN 
    Reports42 R ON S.Sno = R.Sno
JOIN 
    Courses42 C ON R.Cno = C.Cno
JOIN 
    Tutors42 Tu ON C.Cno = Tu.Cno
JOIN 
    Teachers42 T ON Tu.Tno = T.Tno
WHERE 
    R.Racademicyear = 2015
    AND R.Rterm = '1'
    AND C.Cname = '计算机科学概论'
    AND T.Tname = '刘伟';

  1. 正确答案 SQL 语句
-- MySQL 语句(8 分)
SELECT Tut.Sclass, Sno, Sname, T.Tno, Tname
FROM Tutors Tut, Teachers T, Courses C,
( SELECT S.Sno, Sname, Sclass 
  FROM Reports R, Courses C, Students S
  WHERE R.Cno=C.Cno AND R.Sno=S.Sno
AND Racademicyear=2015 AND Rterm=1
AND Cname='计算机科学概论'
) R
WHERE Tut.Tno=T.Tno AND Tut.Cno=C.Cno AND R.Sclass=Tut.Sclass
AND Tacademicyear=2015 AND Tterm=1
AND Cname='计算机科学概论' AND Tname='刘伟';

(十八)嵌套子关系查询学生课程成绩信息

  1. 问题描述:使用嵌套子关系查询,查询选修了数据结构,且其成绩不低于本年级所有选修了该门课程的学生的平均成绩的学生信息,查询结果以中文名称显示学生所在年级、学号 (Sno)、姓名 (Sname) 及其选修的该门课程的成绩 (Grade)。
  2. 我的答案 SQL 语句
SELECT 
    S.Sclass AS 所在年级,
    S.Sno AS 学号,
    S.Sname AS 姓名,
    R.Grade AS 成绩
FROM 
    Students42 S
JOIN 
    Reports42 R ON S.Sno = R.Sno
WHERE 
    R.Cno = (SELECT Cno FROM Courses42 WHERE Cname = '数据结构')
    AND R.Grade >= (
        SELECT AVG(R2.Grade)
        FROM Reports42 R2
        WHERE R2.Cno = R.Cno
        AND S.Sclass = (SELECT Sclass FROM Students42 WHERE Sno = S.Sno)
    );

  1. 正确答案 SQL 语句
-- MySQL 语句(8 分)
SELECT LEFT(S.Sno,4) '年级', S.Sno '学号', Sname '姓名', Grade '成绩'
FROM Students S, Reports R
WHERE S.Sno=R.Sno
AND Cno=
(SELECT Cno
FROM Courses
WHERE Cname='数据结构')
AND S.Sno IN
(SELECT R1.Sno
FROM Reports R1 INNER JOIN
(SELECT LEFT(Sno,4) NJ,AVG(Grade) AvgGrd
FROM Reports
WHERE Cno=
(SELECT Cno
FROM Courses
WHERE Cname='数据结构') 
GROUP BY LEFT(Sno,4)) R2
ON LEFT(R1.Sno,4)=R2.NJ
WHERE R1.Grade>=R2.AvgGrd
AND R1.Cno=
(SELECT Cno
FROM Courses
WHERE Cname='数据结构')
);

        通过以上对各种 SQL 查询语句的实践与分析,我们可以看到在处理涉及多表的数据查询时,需要根据具体的需求灵活运用连接、嵌套查询、谓词等多种 SQL 技术,以准确获取所需的数据信息。同时,在编写查询语句过程中,要注意语法规范以及对数据逻辑关系的准确把握,这样才能高效地完成复杂的数据查询任务。在实际应用中,这些查询技术可广泛应用于各类数据库管理系统,如企业的员工信息管理、学校的教学管理系统等,帮助我们从海量数据中快速提取有价值的信息,为决策提供有力支持。

        希望以上内容对大家在 SQL 查询语句的学习和实践中有所帮助,如有错误或不足之处,欢迎大家批评指正。

你可能感兴趣的:(数据库,数据库,sql,oracle,mysql)