数据库实验报告【数据库的简单查询和连接查询】

一、 实验目的及实验环境

数据查询是数据库中最基本的操作,也是使用最频繁的操作,因此必须掌握SQL的查询语句(SELECT语句)的使用方法。
本实验要求掌握:①简单表的数据查询时数据连接查询的操作方法
②简单表的数据排序时数据连接查询的操作方法
③简单表的多表操作时数据连接查询的操作方法

二、 实验内容及结果

任务1 在数据库JWGL中的学生表Student、课程表Course、学生选课表SC完成第3章例3.10~例3.28中例题的查询操作
TSQL语句的查询操作——投影
例3.10 关系代数中的投影就相当于是查询表中的若干列。核心语句为SELECT<*/目标列> FROM <表名>。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
【在这里只展示对Course表查询操作的执行结果】
在这里插入图片描述

实际上在Course表中含有共有6个属性的列,而这里我们通过SELECT<目标列>这样的格式对列的展示做了个筛选,所以只会展示该表中我们需要它展示的列。

例3.11 若需要展示该表中所有的列,则可以通过用SELECT<>这样格式的语句。用代替所有目标列的列名而非通过输入所有列名,可以极大地使我们的操作更便捷。
在这里插入图片描述

【在这里只展示对Course表查询操作的执行结果】
在这里插入图片描述

例3.12 SELECT语句中的<目标列>也可以是表达式,这样可以增添用户对结果集的可读性。为目标列命一个其他的名字,这个名字可以是新开辟的一列也可以是直接更改表达式这一列的属性名。

核心语句1:SELECT <列名>|<表达式>空格<别名>
在这里插入图片描述
如若单纯对按照书上操作则会显示如右所示结果 ,会发现这是一个“无列名的”的状态,也就是我们的<表达式>并未充当别名。在我询问老师后,更改了这一格式,我在<表达式>后面增加了空格<别名>这一子句的补充,空格后面的就作为了别名。
空格后的别名也有所要求:这个别名不能有空格,短语间单词的连接如同PYTHON需要加入连接符,或者是用大小写来区分(以增加可读性)。
【执行语句结果展示】
在这里插入图片描述
例3.13&例3.14 核心语句2:SELECT<列名>|<别名>|<表达式>
同样的,在这里也不能单纯按照书上的语句进行操作。我进行了多次的尝试和调整,终于投影出了书上所展示的结果,语句如下:
在这里插入图片描述

若(1)要增添新的一列作为补充说明并对这一列所有行值进行添加并且这一增添的对象是个短语有空格的存在。其格式是:‘填充值’空格‘别名’这里的单引号如同python对字符串的定义方式,格外要注意单引号! 

(2)要增添一列,并且这一列的列名是表达式且填充的为该表达式计算出的结果。其格式为:表达式空格‘别名’(即表达式)。
【执行语句结果展示】
在这里插入图片描述

总结:别名放在之后,前面放置需要补充的列值。

例3.15 若需要将列值全部小写输出,核心语句为:SELECT LOWER(列名)
在这里插入图片描述

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

对比着来看,会发现学生所在系的那一列都按照小写输出了。但是我们所有用SELECT的语句都不会对原表的值进行更改,它只是一个投影。
例3.16 若要查询所有选了课程的学生学号,并消除重复的学号。核心语句为:SELECT DISTINCT<目标列>。
在这里插入图片描述

TSQL语句的查询操作——选择条件表达
查询满足条件的元组通过使用WHERE子句实现,WHERE子句常用的查询条件我们通过例题一一学习。
例3.17 介绍WHERE中=的用法
查询计算机系的所有学生的学号和姓名。这里需要满足的条件是:所有计算机的学生,而其他的语句与前述一致。核心语句是:WHERE <目标列>=‘所需满足的条件’。
在这里插入图片描述

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

例3.18 介绍WHERE中<(<=)或>(>=)的用法 介绍WHERE NOT的用法
查询考试成绩不合格的学生的学号。这里所需要满足的条件是:学生成绩小于60分,而其他的语句与前述一致。核心语句是:WHERE [目标列] < ‘所需满足的条件’。
在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】
在这里插入图片描述

 若要取上述的补集,利用WHERE NOT [目标列] >= ‘所需满足的条件’,(相当于离散中“取否”这个条件,这样NOT放在目标列及其所需要满足的条件就很好理解了)。

在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】
在这里插入图片描述

例3.19 介绍WHERE中BETWEEN的用法
查询年龄在20~23岁之间的学生的姓名,所在系和年龄。核心语句为:WHERE <目标列> BETWEEN (条件) AND (条件)
在这里插入图片描述
这里的BETWEEN…AND…是包含满足AND左右两个条件的个体,所以上述语句也就等价于如下语句。
在这里插入图片描述

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

例3.20&例3.21 介绍WHERE中IN的用法 介绍WHERE中OR的用法
查询计算机系、数学系和信息系的学生姓名和性别。使用IN可以查询属性值属于指定集合的元组。核心语句:WHERE <目标列> IN(‘列名’,‘列名’)
在这里插入图片描述

上述条件等价于用OR连接的<目标列>=‘列名’,如下图所示。
在这里插入图片描述

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

查询既不是计算机系,也不是数学系的学生姓名和性别,类似于上述WHERE NOT的用法。核心语句:WHERE <目标列> NOT IN (‘列名’,‘列名’)。

在这里插入图片描述

【执行语句结果展示】
在这里插入图片描述
例3.22&例3.23 介绍WHERE中LIKE的用法,从而实现模糊匹配
在这里LIKE我们翻译成“好像,类似”的意思,尤其是当此目标列需要满足的字符串条件是模糊的我们就用LIKE语句来显示所有类似于“含有通配符的该字符串”。在这里顺便引入“含有通配符字符串”的知识。
显示数学系所有学生的情况:
(1)“_”代表任意单个字符。如: a_b表示以a开头,b结尾的长度为3的字符串。
在这里插入图片描述

(2)“%”代表任意长度(长度甚至可以为0)的字符串。如:a%b表示以a开头、以b结尾的任意长度的字符串。
在这里插入图片描述

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

例3.24 介绍ESCAPE换码字符的用法
查询DB_Design课程的课程号及学分。当所需要匹配的目标列字符串含有与通配符(如“”,“%”)一致的字符,此时的符号并不是代表通配符所有要表达的意思,而是取原本的字符,我们在“”或“%”前加\,并且在目标列后添加语句ESCAPE ‘\’。在这里我们把ESCAPE理解成跳过,也就是不去转码\和通配符的组合。代码如下图。
在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】
在这里插入图片描述

例3.25 介绍NULL的用法
查询没有考试成绩的学生的学号及相应的课程号,相当于判断该学生的成绩是否为空即可。NULL相当于空值的含义。
在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】
在这里插入图片描述

例3.26 介绍AND和OR的用法,从而实现多个条件的查询
查询计算机系年龄在25岁以下的学生的学号、姓名和性别。这里需要匹配的条件有多个,分别是:系别为计算机系已经年龄在25岁以下。这里可以用逻辑语句AND和OR将多个条件连接起来。
在这里插入图片描述

注意,AND优先级高于OR,如需要改变优先级可以通过使用括号。

简单查询操作——数据排序
通常情况下,查询结果中元组的顺序是按照他们存放在表中的存放顺序。如需要按照指定顺序显示我们可以通过使用ORDER BY 子句来实现,常用的查询条件我们通过例题一一学习。
例3.27 介绍ORDER BY中按单个列排序的用法
查询选修了02号课程的学生的学号以及成绩,查询结果按成绩的降序排序。
在这里插入图片描述
语句格式为:ORDER BY <列名> [ASC/DESC]。ASC为升序,DESC为降序,默认为升序。
【执行语句结果展示】
在这里插入图片描述
例3.28 介绍ORDER BY中按多个列排序的用法
查询全体学生情况,查询结果按所在系的升序排序,同一系中的学生按年龄降序排序。
在这里插入图片描述

使用多个列进行排序,则首先按照写在前面的列名进行排序,排序后如果遇到写在前面的列名相同列值的学生信息,对相同记录根据写在第二个位置列名所对应的列值进行排序,以此类堆。

【执行语句结果展示】
① 按照写在前面的Sdept进行降序排序,遇到char型则按照字母表的顺序排序。
在这里插入图片描述

② 遇到相同的系别,则根据写在第二个位置的列名Age进行降序排序。如在相同系别ACT的两个人Warrior和C,接着我们对他们的年龄Age进行降序排序。
在这里插入图片描述
任务2 在数据库JWGL中的学生表Student、课程表Course、学生选课表SC中完成第3章例3.35~例3.39中例题的查询操作。
连接查询查询的WHERE子句中用以连接两个表的条件称为连接条件或连接谓词。
语句格式为:[表名1].<列名1> <比较运算符> [表名2] .<列名2>。基本比较运算符有:=、>、<、>=、<=、!=。
连接查询操作——等值连接
例3.35 查询每个学生及其选课情况
学生的所有信息存放在Student表中,学生选课情况存放在SC中,因此该查询涉及Student表和SC表。由于这两个表中具有相同的属性Sno,通过属性列Sno将两个表连接起来。代码如下。
在这里插入图片描述

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

连接查询操作——自然连接
例3.36 介绍等值连接和自然连接的主要区别
对例3.35用自然连接完成。从上图可以看出(着重看红框里的部分),等值连接查询的结果中存在重复的属性列Sno,把重复的列去掉就是自然连接。代码如下。
在这里插入图片描述

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

连接查询操作——自身连接
当连接操作在同一个表内进行时,称为自身连接。我们可以看成是一个表的两个副本之间的连接,所以在自身连接中必须为该表指定两个别名,使之在逻辑上成为两个表。
例3.37 介绍自身连接的用法
查询每门课的间接先修课(即先修课的先修课)。在这里我们把这个Course表指定两个别名,分别是First和Second。实现自身连接的代码如下。
在这里插入图片描述

对上述TSQL语句解读:

(实现简单投影)SELECT [表1(别名1)]. <目标列名(Cno)>,[表2(别名2)]<目标列名(Pcno)>
(给表指定两个命名)FROM <表1> <别名1>,<表2> <别名2>
(实现等值连接)WHERE [表1(别名1)]. <目标列名(Cno)> = [表2(别名2)]<目标列名(Pcno)>
【执行语句结果展示并展示原表用于验证结果】
在这里插入图片描述

连接查询操作——外连接
在例3.36中,Student表中的某些元组由于SC表中没有找到匹配的,所以在连接匹配时全部舍弃了,如若想展示以Student表为主体从而列出每个学生的基本情况以及选课情况,即使是没有选课(即Cno=NULL)的学生也希望能输出其基本信息,这时候需要外连接来实现。
外连接中TSQL语句格式为:
SELECT <目标列1>,<…>
FROM[表1] (LEFT/RIGHT/FULL)OUTER JOIN [表2]
ON [表1].<目标列1> = [表2].<目标列2>
连接查询操作——左外连接
例3.38 介绍外连接中左外连接的用法
将3.36改成左外连接。代码如下。
在这里插入图片描述

【执行语句结果展示并展示3.36结果用于对比】
在这里插入图片描述
在这里插入图片描述

连接查询操作——右外连接
介绍外连接中左外连接的用法 将3.36改成右外连接。代码如下。
在这里插入图片描述

【执行语句结果展示并展示3.36结果用于对比】
在这里插入图片描述在这里插入图片描述

在这里会发现此时的右外连接和3.36中自然连接是一样的,是Student表右外连接SC表,所以此时主体是SC表,那么没有选课的同学也就不会显示出来了。

连接查询操作——全部外连接
介绍外连接中全外连接的用法 将3.36改成全外连接。代码如下。
在这里插入图片描述

【执行语句结果展示并展示3.36结果用于对比】
在这里插入图片描述

在这里会发现此时的全外连接和3.37中左外连接是一样的,Student表和SC表都需要显示,那么没有选课的同学当然也可以显示。

连接查询操作——复合条件连接
WHERE子句中有多个连接条件,称为复合条件连接。
例3.39 介绍复合条件连接的用法
查询选修了database课程且成绩在90分以上的学生的学号和姓名。
由于Student表中包含学生的基本信息,SC表中包含课程号和成绩的信息,而课程名的信息包含在Course表中,所以涉及到了三个表的查询,需要运用WHERE建立多个连接条件。代码如下:
在这里插入图片描述

【执行语句结果展示并展示原表用于验证结果】
在这里插入图片描述

原表为:
在这里插入图片描述
在这里插入图片描述

三、 非正常运行结果及原因
① 在查询结果时,运用表达式对年龄操作时,一开始只是单纯按照书上的语句编写, 则在还没执行时就出现红色波浪线。
在这里插入图片描述

这里出现的错误是,我们的Student表中对年龄的定义是Age而非Sage,若对Sage更改程序无法找到对应列,一定要根据定义表的年龄列名进行操作更改。
② 这是我的突发奇想。在例3.27,如若更改WHERE子句和ORDER BY子句的顺序,还能执行成功吗?于是我进行了如下操作。
在这里插入图片描述

答案正如我所料,是否定的。报错结果如下图。

在这里插入图片描述

四、 对设计及调试过程的心得体会
这一次实验多多练习操作了很多子句,如SELECT,WHERE,ORDER BY子句。他们有着各自的规则和用法,每一步都如同C语言编译操作,合乎逻辑。在遇到的每一个例题,它介绍了很多特殊的用例,这时候我会对我原来建的表进行信息补充。看着自己建的表,输入TSQL语句,执行出结果真的十分有成就感。

  • 5
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是数据库连接实验报告: 实验目的: 掌握 Java 语言中 JDBC(Java Database Connectivity)的使用方法,实现 Java 与数据库之间的连接。 实验环境: 操作系统:Windows 10 开发工具:Eclipse Oxygen.3a Release (4.7.3a) 数据库:MySQL 8.0.16 实验步骤: 1. 下载 MySQL 数据库,并安装; 2. 在 Eclipse 中新建 Java 项目,并添加 MySQL JDBC 驱动包(mysql-connector-java-8.0.16.jar)到项目的 Build Path; 3. 编写 Java 代码实现与 MySQL 数据库连接; 4. 在 MySQL 数据库中创建一个名为 test 的数据库,并在该数据库中创建一个名为 student 的表; 5. 运行 Java 代码,测试与 MySQL 数据库连接是否成功; 6. 在 student 表中插入一些数据,并查询并输出这些数据; 7. 关闭数据库连接。 实验代码如下: ``` import java.sql.*; public class DBConnectionTest { public static void main(String[] args) { Connection conn = null; Statement stmt = null; ResultSet rs = null; String url = "jdbc:mysql://localhost:3306/test"; String user = "root"; String password = "123456"; try { // 加载驱动程序 Class.forName("com.mysql.cj.jdbc.Driver"); // 获取数据库连接 conn = DriverManager.getConnection(url, user, password); // 执行 SQL 语句 stmt = conn.createStatement(); rs = stmt.executeQuery("SELECT * FROM student"); // 输出查询结果 while (rs.next()) { System.out.println(rs.getString("id") + "\t" + rs.getString("name") + "\t" + rs.getString("age") + "\t" + rs.getString("gender")); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 try { if (rs != null) rs.close(); if (stmt != null) stmt.close(); if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ``` 实验结果: 在 Eclipse 中运行 Java 代码,输出结果如下: ``` 1 张三 20 male 2 李四 22 female 3 王五 21 male ``` 实验结论: 通过实验,我们成功地实现了 Java 与 MySQL 数据库连接,并且能够执行 SQL 语句,进行数据查询、插入、删除等操作。JDBC 是 Java 语言中与数据库交互的标准 API,它为 Java 开发者提供了一种简单、标准、通用的访问数据库的方式,使得开发者可以通过 Java 语言方便地访问各种关系型数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值