数据库实验报告【数据库的复杂查询】

一、 实验目的及实验环境
进一步掌握SELECT语句的使用方法,通过实验能够熟练地使用SELECT语句。
(1) 本实验要求掌握嵌套查询的操作方法。
(2) 本实验要求掌握统计查询的操作方法。

二、 实验内容及结果
任务1 在数据库JWGL的学生表Student、课程表Course、学生选课表SC中完成第3章例3.40~例3.47中的查询操作。
数据库的复杂查询——嵌套查询
这里先介绍嵌套查询,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌入到另一个查询块的WHERE子句或者是HAVING短语中的查询称为嵌套查询。
嵌套之后,形成外层的查询块(也称为上层查询或父查询),内层的查询块(也称为下层查询或子查询)。
注意:SELECT语句中不能使用ORDER BY子句,它只能对最终的结果进行操作。
嵌套查询——不相关子查询
不相关子查询:内层查询不依赖于外层的查询。
执行过程:执行内查询→(不显示内查询结果得到的结果集)→传递给外查询→外查询 把结果集当成条件去使用→执行外层查询→显示查询结果
例3.40 查询选修了02号课程的学生的姓名
该查询涉及了Student表和SC表,首先可以在SC表中查询出选修02号课程的所有学生的学号形成一个结果集(内层查询),接着在Student表中用学号对应刚刚得到的结果集含有的学号以查询学生的姓名(外层查询)。核心语句:外层查询块[WHERE <目标列> IN (内层查询块)]。嵌套查询代码如下图。
在这里插入图片描述

连接查询代码如下图。

在这里插入图片描述

对比上述两种查询我们可以发现,嵌套查询比连接查询要复杂,但是嵌套查询的可读性更强。实际上嵌套查询真正体现了SQL的“结构化”含义。
【执行语句结果展示并展示原表用于验证结果】
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/eae9609955fa4f09aebfe80f76e9c6f5.png)

例3.41 查询和Cathy同学在一个系学习的学生学号和姓名
分析:内层嵌套查询是在Student表中查询Cathy同学的所在系别将此作结果集,传递给外层嵌套查询,外层查询在Student表中与Cathy同学系别相同的同学(与刚刚的结果集对应着来),锁定这类同学并查询他们的姓名和学号,最后输出结果。
在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】

在这里插入图片描述
例3.42 查询其他系中比计算机系某一学生年龄小的学生姓名和年龄
分析:内层查询为查询计算机系学生的年龄,将此作为结果集,传递给外层查询,外层查询不属于计算机系学生并且将他们的年龄与结果集比较,若该同学小于计算机某一学生的年龄,输出该同学的姓名和年龄。代码如下。
在这里插入图片描述

上述代码还有另外一种表示方法。
分析:内层查询为查询计算机系学生的年龄的最大值,将此作为结果集,传递给外层查询,外层查询不属于计算机系学生并且将他们的年龄与结果集比较,若该同学小于计算机系最大年龄,输出该同学的姓名和年龄。代码如下。

在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】

在这里插入图片描述

嵌套查询——相关子查询
相关子查询:内层查询依赖于外层查询。在内层查询的WHERE子句中引用外查询的表。
执行过程:外层查询的每一个元组其内层查询都要执行一次,执行时内层查询引用外层查询的列值。
例3.43 查询每个学生超过他所选课的平均成绩的课程号,并展示该学生学号
分析:外层查询是取在SC表中的成绩判断其是否大于等于内层查询出来的对应的该学生选择的课程的平均成绩,若满足上述条件,则输出该学生的学号和课程号。
在这里插入图片描述

【执行语句结果展示】
在这里插入图片描述

例3.44 查询所有选修了02号课程的学生的姓名
分析:本次查询涉及到了两个表,分别为SC和Student表,在Student表中依次取每个元组的Sno值,若在SC关系里存在有Sno值=此Student.Sno,且Cno=‘02’,将此元组传递入外层循环,以输出该学生的姓名。重复这一操作,直到把外层的Student表中所有元组全部处理完。代码如下。
在这里插入图片描述

注意:EXISTS引出的子查询,一般都是用*表示,因为它的子查询只返回真或假,这个时候给出目标列是没有意义的。内层子查询非空为真,若为空则为假。

【执行语句结果展示】
在这里插入图片描述

例3.45 查询选修了全部课程的学生的姓名=查询这样一个学生,没有一个课是他不选的
注意:SQL是没有全称量词的,所以我们根据数理逻辑所学的知识,我们把:所有x满足P这个条件,转换成是:不存在一个是x不满足P这个条件的。代码如下。
在这里插入图片描述

分析:这里涉及到了三个表分别是Student,Course和SC表,我们先确定最外层表和最内层表。最外层是用来输出结果的,我们最后要得到的是学生的姓名所以最外层是Student表。最内层是用来判断传入进来的这一元组对应的学生有没有选课,所以在最内层需要放置SC.Sno=Student.Sno AND SC.Cno=Course.Cno这样的语句。中间一层自然也就是用来再向最内侧传递Course表中查出来的信息了。

例3.46 查询至少选修了学生980012选修的全部课程的学生的学号
运用数理逻辑里的知识,上述查询可以转化成,没有这样的课程y,学生980012选了而学生x没有选修。代码如下。
在这里插入图片描述

分析:最外层在SC表一个个传递学生信息元组所含有的Sno值进入内层查询。
【执行语句结果展示】
在这里插入图片描述

数据库的复杂查询——集合查询
介绍UNION语句用法:
在SQL语句中,可以用UNION语句把两个以上的查询结果合并为一个结果。
语句格式为:SELECT …
UNION (/ALL) 【默认从最后结果中删除重复元组,用ALL则保留】
SELECT …
注意:①UNION运算的各查询结果列数必须相同且对应列的数据类型也相同
②最后结果列名来自第一个SELECT语句
③ORDER BY子句只能出现在最后,对最后的结果集排序
例3.47 查询选修02号或05号课程的所有学生的学号
代码如下。(该查询也可以使用复合条件查询来完成)
在这里插入图片描述

【执行语句结果展示】
在这里插入图片描述

三、 非正常运行结果及原因
在刚开始完成本实验时,输入完第一个查询操作TSQL语句执行完后,报错结果:
“消息 208,级别 16,状态 1,第 1 行”。如下图。
在这里插入图片描述

  在询问老师后发现是因为没有对具体的数据库进行筛选。

【改正操作如下图】
在这里插入图片描述

四、 对设计及调试过程的心得体会
在这次实验中我们学习里更为复杂的查询方法,分别是嵌套查询与集合查询。这次实验
后使用的方法更加能够体现TSQL语句的结构特性,实际上每一步都是非常有逻辑可循的。在结合了离散数学中数理逻辑的知识后,熟练运用逻辑等级,让查询变得更

  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我并不是一个可以接收并处理实验报告的程序。但是,我可以为您提供一些关于 JSP 访问数据库的基本知识和指导。 首先,JSP(Java Server Pages)是一种用于创建动态Web页面的Java技术。它允许在页面中嵌入Java代码,以及使用标签库和表达式语言来简化页面开发。 要在JSP中访问数据库,您需要使用JDBC(Java Database Connectivity)API。这个API提供了一组Java类和接口,用于连接和操作各种类型的数据库。 下面是一个简单的JSP页面,演示如何使用JDBC API连接到MySQL数据库,并查询其中的数据: ``` <%@ page language="java" %> <%@ page import="java.sql.*" %> <!DOCTYPE html> <html> <head> <title>JSP Database Example</title> </head> <body> <% // Connect to the database Connection conn = null; Class.forName("com.mysql.jdbc.Driver"); String url = "jdbc:mysql://localhost/mydatabase"; String username = "root"; String password = "password"; conn = DriverManager.getConnection(url, username, password); // Query the database Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); // Display the results while (rs.next()) { out.println(rs.getString("name") + " " + rs.getInt("age")); } // Close the database connection rs.close(); stmt.close(); conn.close(); %> </body> </html> ``` 在这个例子中,我们首先使用Class.forName方法加载MySQL驱动程序,然后使用DriverManager.getConnection方法连接到MySQL数据库。接下来,我们使用Statement.executeQuery方法查询数据库,并使用ResultSet.next方法依次遍历查询结果。最后,我们关闭了ResultSet、Statement和Connection对象,以释放资源。 当然,上面的例子只是一个简单的示例,实际情况可能更加复杂。如果您想了解更多关于JSP访问数据库的知识,请参考相关的教程和文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值