数据库复杂查询
### 数据库复杂查询知识点 #### 实验目的与背景 本次实验旨在通过具体操作,帮助学习者深入了解并掌握SQL Server查询分析器的使用方法,重点在于加深对SQL语言中连接查询的理解与应用。连接查询是数据库操作中非常重要的部分,它能够帮助用户整合不同表中的数据,从而满足更复杂的查询需求。 #### SQL Server查询分析器简介 SQL Server查询分析器是Microsoft SQL Server的一个集成开发环境,用于编写、调试和执行Transact-SQL语句、查询以及脚本。它是SQL Server的重要组成部分之一,广泛应用于数据库管理、维护和开发过程中。 #### 表格结构概览 根据实验内容,我们有四个主要的表格:`Student`、`Course`、`SC` 和 `Teacher`。 - **Student** 表格:包含学生的基本信息,如学号(Sno)、姓名(Sname)、性别(Ssex)、年龄(Sage)和所在系(Sdept)等。 - **Course** 表格:记录课程信息,包括课程号(Cno)、课程名(Cname)、先行课(Cpno)和学分(Ccredit)等。 - **SC** 表格:关联学生和课程的信息,包括学号(Sno)、课程号(Cno)和成绩(Grade)。 - **Teacher** 表格:记录教师信息,包括教师编号(Tno)、姓名(Tname)、性别(Tsex)、年龄(Tage)、所在系(Tdept)、职称(Ttitles)、工资(Twage)和系主任编号(Tdno)等。 #### 复杂查询示例解析 1. **求选课学生的基本情况以及他的选修情况** - **查询语句**: ```sql SELECT S.Sno, S.Sname, S.Ssex, S.Sage, S.Sdept, C.Cno, C.Cname, SC.Grade FROM Student S INNER JOIN SC ON S.Sno = SC.Sno INNER JOIN Course C ON SC.Cno = C.Cno; ``` - **解释**:通过`INNER JOIN`操作连接三个表格,展示选课学生的基本信息及其选修的课程和成绩。 2. **求学生的学号、姓名、选修的课程号及成绩** - **查询语句**: ```sql SELECT S.Sno, S.Sname, SC.Cno, SC.Grade FROM Student S INNER JOIN SC ON S.Sno = SC.Sno; ``` - **解释**:连接`Student`和`SC`表,获取学生的学号、姓名以及他们选修的课程号和成绩。 3. **求选修课程号为1且成绩在90以上的学生学号、姓名和成绩** - **查询语句**: ```sql SELECT S.Sno, S.Sname, SC.Grade FROM Student S INNER JOIN SC ON S.Sno = SC.Sno WHERE SC.Cno = 1 AND SC.Grade > 90; ``` - **解释**:筛选出选修了特定课程(本例中为课程号1)且成绩高于90分的学生信息。 4. **求每一门课程的间接先行课(即先行课的先行课)** - **查询语句**: ```sql SELECT C1.Cname AS CourseName, C2.Cname AS DirectPreRequisite, C3.Cname AS IndirectPreRequisite FROM Course C1 LEFT JOIN Course C2 ON C1.Cpno = C2.Cno LEFT JOIN Course C3 ON C2.Cpno = C3.Cno; ``` - **解释**:通过左外连接(`LEFT JOIN`),查找每门课程的直接先行课和间接先行课。 5. **求选修了数学课的学生的学号和姓名** - **查询语句**: ```sql SELECT S.Sno, S.Sname FROM Student S INNER JOIN SC ON S.Sno = SC.Sno INNER JOIN Course C ON SC.Cno = C.Cno WHERE C.Cname = '数学'; ``` - **解释**:找出所有选修了数学课程的学生。 6. **求学生李勇选修的总学分** - **查询语句**: ```sql SELECT SUM(C.Ccredit) AS TotalCredit FROM Student S INNER JOIN SC ON S.Sno = SC.Sno INNER JOIN Course C ON SC.Cno = C.Cno WHERE S.Sname = '李勇'; ``` - **解释**:计算学生“李勇”所选课程的总学分。 7. **求各学生选修的总学分** - **查询语句**: ```sql SELECT S.Sno, S.Sname, SUM(C.Ccredit) AS TotalCredit FROM Student S INNER JOIN SC ON S.Sno = SC.Sno INNER JOIN Course C ON SC.Cno = C.Cno GROUP BY S.Sno, S.Sname; ``` - **解释**:分组统计每位学生选修的所有课程的总学分。 8. **求课程“数据库”的平均成绩** - **查询语句**: ```sql SELECT AVG(SC.Grade) AS AverageGrade FROM SC INNER JOIN Course C ON SC.Cno = C.Cno WHERE C.Cname = '数据库'; ``` - **解释**:计算课程“数据库”的平均成绩。 9. **求计算机系学生的选课情况** - **查询语句**: ```sql SELECT S.Sno, S.Sname, C.Cname, SC.Grade FROM Student S INNER JOIN SC ON S.Sno = SC.Sno INNER JOIN Course C ON SC.Cno = C.Cno WHERE S.Sdept = 'CS'; ``` - **解释**:筛选出计算机系学生的选课情况。 10. **求和钟灵在同一个系的老师姓名** - **查询语句**: ```sql SELECT T.Tname FROM Teacher T WHERE T.Tdept = (SELECT Tdept FROM Teacher WHERE Tname = '钟灵'); ``` - **解释**:找到与教师“钟灵”同在一个系的其他教师。 11. **求吴娅所在系的教师人数** - **查询语句**: ```sql SELECT COUNT(*) AS TeacherCount FROM Teacher WHERE Tdept = (SELECT Tdept FROM Teacher WHERE Tname = '吴娅'); ``` - **解释**:统计教师“吴娅”所在系的教师总数。 12. **求和王小峰同一职称的教师姓名和所在系** - **查询语句**: ```sql SELECT Tname, Tdept FROM Teacher WHERE Ttitles = (SELECT Ttitles FROM Teacher WHERE Tname = '王小峰'); ``` - **解释**:列出与教师“王小峰”拥有相同职称的其他教师。 13. **求和邹佳羽工资相同的教师人数** - **查询语句**: ```sql SELECT COUNT(*) AS SameSalaryCount FROM Teacher WHERE Twage = (SELECT Twage FROM Teacher WHERE Tname = '邹佳羽'); ``` - **解释**:计算与教师“邹佳羽”工资相同的教师数量。 14. **求汪明所在系教师的平均工资和最高工资** - **查询语句**: ```sql SELECT AVG(Twage) AS AverageSalary, MAX(Twage) AS MaxSalary FROM Teacher WHERE Tdept = (SELECT Tdept FROM Teacher WHERE Tname = '汪明'); ``` - **解释**:找出教师“汪明”所在系的教师平均工资和最高工资。 15. **求至少选修了8个学分的学生学号** - **查询语句**: ```sql SELECT S.Sno FROM Student S INNER JOIN SC ON S.Sno = SC.Sno INNER JOIN Course C ON SC.Cno = C.Cno GROUP BY S.Sno HAVING SUM(C.Ccredit) >= 8; ``` - **解释**:筛选出选修课程总学分至少为8的学生学号。 通过以上查询示例,我们可以看到SQL Server查询分析器的强大功能以及连接查询在处理复杂数据时的应用。这些示例不仅有助于理解SQL语言的基础语法,还能帮助学习者掌握如何利用SQL来解决实际问题。