SQL实验 连接查询和嵌套查询

一、实验目的

1.掌握Management Studio的使用。

2.掌握SQL中连接查询和嵌套查询的使用。

二、实验内容及要求(请同学们尝试每道题使用连接和嵌套两种方式来进行查询,如果可以的话)

1.找出所有任教“数据库”的教师的姓名。

--找出所有任教“数据库”的教师的姓名。

--连接

SELECT DISTINCT Teac_name ,Course_name

from Teacher,Course,CourseTeacher

WHERE Course.Course_name = '数据库原理'

and Course.Course_id=CourseTeacher.Course_id

and CourseTeacher.Teac_id= Teacher.Teac_id

--嵌套

SELECT DISTINCT Teac_name FROM Teacher

WHERE Teac_id IN (SELECT Teac_id

from CourseTeacher

WHERE Course_id IN

(SELECT Course_id

from Course

WHERE Course_name='数据库原理'

)

)

找出学号为“980101011”的学生选修的课程号和课程名。 

--找出学号为“980101011”的学生选修的课程号和课程名。 

--由于所提供数据并无学号为“980101011”,因此本题选用“140102006”作为查询对象

--连接

SELECT Stu_name,Course.Course_id,Course.Course_name

from Course,CourseTeacher,Student

WHERE Stu_id='140102006'

and Student.Class_id=CourseTeacher.Class_id

and CourseTeacher.Course_id=Course.Course_id

--嵌套

SELECT Course_id,Course_name from Course

WHERE Course_id IN(SELECT Course_id

from CourseTeacher

WHERE Class_id IN

(SELECT Class_id

from Student

WHERE Stu_id='140102006'

)

)

3.“涂杰杰”所选修的全部课程号及成绩。(注意:school中可能有同名,即可能有多名学生叫“涂杰杰”。) 

-- “涂杰杰”所选修的全部课程号及成绩。(注意:school中可能有同名,即可能有多名学生叫“涂杰杰”。)

--连接

SELECT DISTINCT Stu_name,Course_id,Grade

from Student,StudentGrade

WHERE Stu_name='涂杰杰'

and Student.Stu_id=StudentGrade.Stu_id

--嵌套

SELECT Course_id,Grade from StudentGrade

WHERE Stu_id IN (SELECT Stu_id

from Student

WHERE Stu_name='涂杰杰')

4. 找出“苏贤兴”同学所学课程的名称和成绩。 

--找出“苏贤兴”同学所学课程的名称和成绩。

--连接

SELECT Stu_name,Course_name,Grade

from StudentGrade,Course,Student

WHERE Stu_name='苏贤兴'

and Student.Stu_id=StudentGrade.Stu_id

and StudentGrade.Course_id=Course.Course_id

--嵌套

SELECT Course_name,Grade from StudentGrade

join Course on Course.Course_id = StudentGrade.Course_id

WHERE Stu_id IN(SELECT Stu_id

from Student

WHERE Stu_name='苏贤兴')

5.显示所有课程的选修情况(最终结果列包含课程号,课程名,选修人数)。(外连接)

--显示所有课程的选修情况(最终结果列包含课程号,课程名,选修人数)。

--外连接

SELECT Course.Course_id,Course_name,count(StudentGrade.Stu_id) as 选修人数

from Course join StudentGrade on Course.Course_id=StudentGrade.Course_id

Group by Course.Course_id,Course_name

--嵌套

--解析 用join操作符将 Course 表和 StudentGrade 表进行连接,关联条件为它们之间的 Course_Id 列。

--同样使用了子查询的方式来获取 StudentGrade 表中的 Course_id 和 Stu_id 列,因此在 JOIN 子句中使用了一个括号内嵌套的 SELECT 语句,并命名为 StudentGrade。

--根据 Course 表的 Course_id 列和 Course_name 列同时进行 GROUP BY 分组操作

SELECT Course.Course_id,Course_name,count(StudentGrade.Stu_id) as 选修人数

from Course join(SELECT Course_id,Stu_id from StudentGrade)

as StudentGrade on Course.Course_id=StudentGrade.Course_id

Group by Course.Course_id,Course_name

6.检索选修课程号为“0109”或“0111”的学生学号、姓名和所在班级编号。 

--检索选修课程号为“0109”或“0111”的学生学号、姓名和所在班级编号。

--由于提供的材料缺少“0109”和“0111”,因此本体选取“0101”和“0102”作为条件

--连接

SELECT Student.Stu_id,Stu_name,Class_id

from Student join StudentGrade on Student.Stu_id=StudentGrade.Stu_id

WHERE Course_id='0101' or Course_id='0102'

--嵌套

SELECT Stu_id,Stu_name,Class_id from Student

WHERE Stu_id IN (SELECT Stu_id

from StudentGrade

WHERE Course_id='0101' or Course_id='0102')

7.检索既选修课程“数据结构”又选修了“C语言”的学生学号。

--检索既选修课程“数据结构”又选修了“C语言”的学生学号。

--由于材料未提供“C语言”,因此将其替换为“数据库原理”

--内部查询使用 OR 运算符查找出符合条件的课程编号,并使用聚合函数 COUNT 和 HAVING 子句确保每个学生都选修了这两门课

--连接

SELECT Stu_id

from StudentGrade join Course on StudentGrade.Course_id=Course.Course_id

WHERE Course_name='数据库原理' or Course_name='数据结构'

GROUP By Stu_id

HAVING COUNT(*) = 2

--嵌套

SELECT Stu_id from StudentGrade

WHERE Course_id IN (SELECT Course_id

from Course

WHERE Course_name='数据库原理' or Course_name='数据结构'

)

GROUP By Stu_id

HAVING COUNT(*) = 2

 

8.检索选修了课程“数据结构”和“C语言”两门课程并且“数据结构”分数高于“C语言”的学生学号和姓名。

--检索选修了课程“数据结构”和“C语言”两门课程并且“数据结构”分数高于“C语言”的学生学号和姓名。

--由于材料未提供“C语言”,因此将其替换为“数据库原理”

--该查询语句使用了 JOIN 操作符将 Student 表和 StudentGrade 表进行连接,其中又对 StudentGrade 表使用了两次JOIN操作符。第一次是将 StudentGrade 表自联接为一个别名为 DSID (代表数据结构),关联条件是 StudentGrade 表中的 Stu_id 列与 Student 表中的 Stu_id 列相等。第二次是再次将 StudentGrade 表自联接为一个别名为 CLID(代表数据库原理),关联条件是 StudentGrade 表中的 Stu_id 列与 Student 表中的 Stu_id 列相等并且 DSID 表中的 Course_id 列不等于 CLID 表中的 Course_id 列。

--接着,在 JOIN 子句中分别使用了两个括号内嵌套的 SELECT 语句,并命名为 DS 和 CL,以获取对应课程名称的 Course 记录,同时关联各自的 Course_id 列。

--最后,在 WHERE 子句中设置了筛选条件,即要求 DSID 表中的 Grade 列大于 CLID 表中的 Grade 列。

SELECT Student.Stu_id,Student.Stu_name

from Student

join StudentGrade as DSID

on DSID.Stu_id = Student.Stu_id

join StudentGrade as CLID

on CLID.Stu_id = Student.Stu_id and DSID.Course_id <> CLID.Course_id

join Course as DS

on DSID.Course_id = DS.Course_id and DS.Course_name = '数据结构'

join Course as CL

on CLID.Course_id = CL.Course_id and CL.Course_name = '数据库原理'

where DSID.Grade > CLID.Grade

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-05 19:38:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-05 19:38:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-05 19:38:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-05 19:38:06       20 阅读

热门阅读

  1. 代码随想录算法训练营第20天|二叉树

    2024-06-05 19:38:06       8 阅读
  2. ORACLE 查询SQL优化

    2024-06-05 19:38:06       9 阅读
  3. 在Spring Boot中集成H2数据库:完整指南

    2024-06-05 19:38:06       9 阅读
  4. 注册windows系统服务

    2024-06-05 19:38:06       9 阅读
  5. [蓝桥杯 2021 省 AB2] 负载均衡

    2024-06-05 19:38:06       8 阅读
  6. 低代码开发:企业OA低成本数字化转型的新引擎

    2024-06-05 19:38:06       9 阅读
  7. Docker - Kafka

    2024-06-05 19:38:06       6 阅读
  8. Ubuntu 22.04 .NET8 程序 环境安装和运行

    2024-06-05 19:38:06       10 阅读
  9. Docker

    2024-06-05 19:38:06       8 阅读
  10. 通过SDKMan来安装各种版本的JDK

    2024-06-05 19:38:06       11 阅读
  11. 【深度学习】contorlnet Pixel Perfect

    2024-06-05 19:38:06       7 阅读
  12. VsCode SSH远程设置不用重复输入密码

    2024-06-05 19:38:06       7 阅读
  13. Lua与Python:深度解析两者之间的核心差异

    2024-06-05 19:38:06       10 阅读