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;
-- 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;
收起
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;
收起
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;
收起
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;
收起
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;
收起
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);
收起
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);
收起
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 = '数据结构';
收起
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='数据结构';
收起
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;
收起
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';
收起
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;
收起
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;
收起
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;
收起
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='数学与统计学院';
收起
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 分以下
);
收起
sql
-- MySQL 语句(3 分)(若未使用谓词 IN 的嵌套查询,但结果正确,则扣 1 分)
SELECT Sno,Sname,Sclass
FROM Students
WHERE Sno IN
( SELECT Sno FROM Reports
WHERE Grade<60);
收起
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
);
-- MySQL 语句(3 分)(若未使用谓词 IN 嵌套查询,但结果正确,则扣 1 分)
SELECT Tno, Tname, Tprof
FROM Teachers
WHERE Tno IN
( SELECT Tno
FROM Tutors
WHERE Tacademicyear=2014);
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
);
-- 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='计算机与信息工程学院'
)
);
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
);
-- 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
);
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
);
-- 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
);
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'
);
-- 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');
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'
)
);
-- 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)
);
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;
-- 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;
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 = '刘伟';
-- 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='刘伟';
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)
);
-- 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 查询语句的学习和实践中有所帮助,如有错误或不足之处,欢迎大家批评指正。