数据库实验报告

数据库实验报告,第1张

表建得不合理,不符合数据库规范化要求,课程并不是由学号所决定了,课程可作为一个独立的表,还有,成绩是有学号和课程号共同决定的,因此成绩表也应该列出来作为一个独立的表。

应该分为3个表来建立数据库

1、学生信息表(学号,姓名,性别,出生日期,联系电话)

2、课表(课程号,课程名)

3、成绩表(学号,课程号,成绩)

期中学号是学生表的主键,课程号是课表的主键,学号和课程号组合是成绩表的主键,两者共同决定成绩。

拆分出来后,避免了数据冗余的问题,消除专递依赖!

完整性参照很简单,你自己解决吧。

*****系实验(上机)报告

课程名称 数据库系统基础

实验名称 数据查询与存储过程

学号 33

学生姓名 嘻习喜戏

成绩

年 月 日

序号 5 实验名称 SQL数据查询

实验目的:

熟练掌握SQL SELECT 语句,能够运用该语句完成各种查询。

实验内容:

用SQL SELECT 语句完成下列查询:

1. 查询客户表中的所有记录。

2. 从订购单表中查询客户号信息(哪些客户有订购单)。

3. 查询单价在20元以上(含)的产品信息。

4. 查询单价在20元以上(不含)的产品名称为牛奶的产品信息。

5. 查询单价在20元以上(不含)的产品名称为牛奶或德国奶酪的产品信息。

6. 查询有2003年7月订购单的客户名称、联系人、电话号码和订单号信息。

7. 查询有德国奶酪订货的客户的名称、联系人和电话号码信息。

8. 查询有德国奶酪订购需求的订单名细记录。

9. 查询所有订购数量(即订单名细中每个订购项目的数量)都在10个以上的订购单的信息。

10. 找出和德国奶酪同等价位的所有产品信息。

11. 查询单价范围在10元到30元范围内的产品信息(使用BETWEEN…AND)。

12. 从客户表中查询出客户名称中有“公司”二字的客户信息(使用LIKE运算符)。

13. 从客户表中查询出客户名称中没有“公司”二字的客户信息(使用NOT LIKE运算符)。

14. 按产品的单价升序列出全部产品信息。

15. 先按产品名称排序,再按单价排序列出全部产品信息。

16. 从产品表中查询共有几种产品。

17. 从订购名细表中查询德国奶酪的订购总数。

18. 计算德国奶酪所有订购的总金额。

19. 求所有订购单的平均金额,在查询结果中列出订购单的个数和平均金额。

20. 求每个订购单订购的项目数和总金额。

21. 求每个客户包含了德国奶酪订购的订单号及其最高金额和最低金额。

22. 求至少有两个订购项目的订购单的平均金额。

23. 找出尚未最后确定订购单(即订购日期为空值的记录)的有关客户信息(客户的名称、联系人和电话号码)和订单号。

24. 找出在2000年1月1日之后签订的订购单的客户信息(客户的名称、联系人和电话号码)、订单号和订购日期。

25. 列出每类产品(相同名称)具有最高单价的产品信息(产品号、名称、规格说明和单价,提示:使用内外层互相关嵌套查询)。

26. 确定哪些客户目前没有订购单(使用谓词NOT EXISTS)。

27. 查询目前有订购单的客户的信息(使用谓词EXISTS)。

28. 查询符合条件的产品信息,要求该产品的单价达到了任意一款产品名称为牛奶的单价的一半(使用ANY或SOME量词)。

29. 查询符合条件的产品信息,要求该产品的单价大于任何一款产品名称为牛奶的单价(使用ALL量词)。

30. 设计如下的连接 *** 作,并分析各自的特点:

•广义笛卡儿积

•内连接

•外连接

•左连接

•右连接

•全连接

掌握存储过程的创建命令,按照题目要求创建存储过程,理解存储过程的作用。

(1) 建立存储过程。查询单价范围在x元到y元范围内的产品信息。

(2) 建立存储过程。查询在某年某月某日之后签订的订购单的客户信息(客户的名称、联系人和电话号码)、订单号和订购日期。

(3) 建立存储过程。将某产品的订购日期统一修改为一个指定日期。

(4) 建立存储过程。删除没有签订单的客户信息。

实验要求:

用SELECT语句完成本次实验,并提交上机报告。

(1) 掌握存储过程的创建命令,按照实验内容的要求创建存储过程,理解存储过程的作用。

(2) 用CREATE PROCEDURE和EXECUTE 语句完成本次实验,并提交上机报告。

实验准备(本实验预备知识和为完成本实验所做的准备):

仔细阅读课本第五章关于SQL的数据查询功能的内容

实验过程(实验的 *** 作过程、遇到的问题及其解决办法或未能解决的问题):

用SQL SELECT 语句完成以上30题查询

实验总结(总结本次实验的收获、未解决的问题以及体会和建议等):

熟练掌握SQL SELECT 语句,能够运用该语句完成各种查询

附录(SQL语句):

--1. 查询客户表中的所有记录。

select * from 客户

--2. 从订购单表中查询客户号信息(哪些客户有订购单)

select 客户号from 订单where 订单号!=null

--3. 查询单价在元以上(含)的产品信息。

select *from 产品where 单价>20 or 单价=20

--4. 查询单价在元以上(不含)的产品名称为牛奶的产品信息。

select *from 产品where 单价>20 and 产品名称='牛奶'

--. 查询单价在元以上(不含)的产品名称为牛奶或德国奶酪的产品信息

select *from 产品where 单价>20 and (产品名称='牛奶'or 产品名称='德国奶酪')

--6. 查询有年月订购单的客户名称、联系人、电话号码和订单号信息

select 客户名称,联系人, 电话,订单号from 客户,订单where (year(订购日期)=2003 and month (订购日期)=7)and (订单.客户号=客户.客户号)

--7. 查询有德国奶酪订货的客户的名称、联系人和电话号码信息。

select 客户名称,联系人, 电话from 客户

where

(客户号= (select 客户号from 订单where(订单号 =(select 订单号from 订单明细

where 产品号= ( select 产品号from 产品where 产品名称= ' 德国奶酪' )))))

--8. 查询有德国奶酪订购需求的订单名细记录。

select * from 订单明细where (数量!=null and 产品号=(select 产品号from 产品where 产品名称= '德国奶酪'))

--9. 查询所有订购数量(即订单名细中每个订购项目的数量)都在个以上的订购单的信息。

select * from 订单where (订单号in (select 订单号from 订单明细where (数量>10)))

--10. 找出和德国奶酪同等价位的所有产品信息。

select * from 产品where (

--11. 查询单价范围在元到元范围内的产品信息(使用BETWEEN…AND)。

select * from 产品where (单价between 10 and 30)

--12. 从客户表中查询出客户名称中有“公司”二字的客户信息(使用LIKE运算符)

select * from 客户where 客户名称like '%公司%'

--13. 从客户表中查询出客户名称中没有“公司”二字的客户信息(使用NOT LIKE运算符)。

select * from 客户where 客户名称not like '%公司%'

--14. 按产品的单价升序列出全部产品信息。

select *from 产品order by 单价

--15. 先按产品名称排序,再按单价排序列出全部产品信息。

select * from 产品order by 产品名称,单价

--16. 从产品表中查询共有几种产品。

select count ( distinct 产品名称) as 产品总数from 产品

--17. 从订购名细表中查询德国奶酪的订购总数

select sum (数量) as '订购奶酪数量'

from 订单明细

where 产品号in(select 产品号from 产品where 产品名称='德国奶酪')

--18. 计算德国奶酪所有订购的总金额

declare @a money

select @a=(select 单价from 产品where 产品名称='德国奶酪')

declare @b int

select @b=(select sum (数量) as '订购奶酪数量'

from 订单明细

where 产品号in(select 产品号from 产品where 产品名称='德国奶酪'))

declare @c int

select @c=@a*@b

select @c as 总金额

--19. 求所有订购单的平均金额,在查询结果中列出订购单的个数和平均金额。

select 订单均值= avg(单价*数量) ,订单个数=count ( 订单号)

from 订单明细,产品

where 产品.产品号=订单明细.产品号

--20. 求每个订购单订购的项目数和总金额。

select 订单号, count (产品.产品号) as 项目数,sum(数量*单价) as 总金额

from 产品,订单明细

where (产品.产品号=订单明细.产品号)

group by 订单号

--21.求每个客户包含了德国奶酪订购的订单号及其最高金额和最低金额

select 客户.客户号,产品.产品号,数量*单价as 总金额

from 客户,订单,订单明细,产品

where 客户.客户号=订单.客户号and 订单.订单号=订单明细.订单号and 订单明细.产品号=产品.产品号and

产品名称='德国奶酪'

order by 客户号

compute max(数量*单价),min (数量*单价) by 客户号

--22.求至少有两个订购项目的订购单的平均金额

select 订单号,avg(数量*单价),count(产品.产品号)

from 订单明细,产品

where 订单明细.产品号=产品.产品号

group by 订单号

having count(产品.产品号)>=2

--23.找出尚未最后确定订购单(即订购日期为空值的记录)的有关客户信息

-- (客户的名称、联系人和电话号码)和订单号

select 客户名称,联系人,电话,订单明细.订单号

from 客户, 订单明细,订单

where(客户.客户号= 订单.客户号) and 订购日期=null

--24.找出在年月日之后签订的订购单的客户信息

--(客户的名称、联系人和电话号码)、订单号和订购日期

select 客户名称,联系人,电话,订单号,订购日期

from 客户,订单

where 客户.客户号=订单.客户号

and year(订购日期)>1996 and month(订购日期)>4 and day(订购日期)>2

--25.列出每类产品(相同名称)具有最高单价的产品信息

--(产品号、名称、规格说明和单价,提示:使用内外层互相关嵌套查询)

select A.产品号, A.产品名称, A.规格说明, A.单价

from 产品A

where 单价= (SELECT MAX(单价)

FROM 产品B

WHERE A.规格说明= B.规格说明)

--26.确定哪些客户目前没有订购单(使用谓词NOT EXISTS)

select *

from 客户

where not exists (select* from 订单where 客户号=订单.客户号)

--27.查询目前有订购单的客户的信息(使用谓词EXISTS)

select *

from 客户

where exists (select* from 订单where 客户号=订单.客户号)

--28.查询符合条件的产品信息,要求该产品的单价达到了任

--意一款产品名称为牛奶的单价的一半(使用ANY或SOME量词)

select *

from 产品a

where(单价>any(select 单价/2 from 产品b where b.产品名称='牛奶'))

--29.查询符合条件的产品信息,要求该产品的单价大于任何

--一款产品名称为牛奶的单价(使用ALL量词)

select *

from 产品a

where(单价>all(select 单价from 产品b where b.产品名称='牛奶'))

--30.设计如下的连接 *** 作,并分析各自的特点:

--•广义笛卡儿积

SELECT *

FROM 客户CROSS JOIN 订购单

WHERE 客户.客户号= 订购单.客户号

--•内连接

SELECT *

FROM 客户INNER JOIN 订购单

ON 客户.客户号= 订购单.客户号

--•外连接

--•左连接

SELECT *

FROM 客户LEFT JOIN 订购单

ON 客户.客户号= 订购单.客户号

--•右连接

SELECT *

FROM 客户RIGHT JOIN 订购单

ON 客户.客户号= 订购单.客户号

--•全连接

SELECT *

FROM 客户FULL JOIN 订购单

ON 客户.客户号= 订购单.客户号

说明:

1. 上机报告上传到211.68.36.251的数据库文件夹中的上传目录

2. 文件名的命名规则为:学号+姓名+实验+序号。如:9724101汪伟的第二次上机报告名为:9724101汪伟实验2

3. 封面由学生填写;

4. 正文的实验名称、实验目的、实验内容、实验要求已经由教师指定;

5. 实验准备由学生在实验或上机之前填写;

6. 实验过程由学生记录实验的过程,包括 *** 作过程、遇到哪些问题以及如何解决等;

7. 实验总结由学生在实验后填写,总结本次实验的收获、未解决的问题以及体会和建议等;

8. 将相关的语句粘贴到附录中。

你自己改改吧。想要word原版的话再说一声。

你可以做一个下拉框,选项有教师和学生,不过这个的话,一般是通过权限来控制的,这样教师和学生登录之后,看到的菜单就不一样了。

JDBC连接数据库

•创建一个以JDBC连接数据库的程序,包含7个步骤:

1、加载JDBC驱动程序:

在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),

这通过java.lang.Class类的静态方法forName(String className)实现。

例如:

try{

//加载MySql的驱动类

Class.forName("com.mysql.jdbc.Driver")

}catch(ClassNotFoundException e){

System.out.println("找不到驱动程序类 ,加载驱动失败!")

e.printStackTrace()

}

成功加载后,会将Driver类的实例注册到DriverManager类中。

2、提供JDBC连接的URL

•连接URL定义了连接数据库时的协议、子协议、数据源标识。

•书写形式:协议:子协议:数据源标识

协议:在JDBC中总是以jdbc开始

子协议:是桥连接的驱动程序或是数据库管理系统名称。

数据源标识:标记找到数据库来源的地址与连接端口。

例如:(MySql的连接URL)

jdbc:mysql:

//localhost:3306/test?useUnicode=true&characterEncoding=gbk

useUnicode=true:表示使用Unicode字符集。如果characterEncoding设置为

gb2312或GBK,本参数必须设置为true 。characterEncoding=gbk:字符编码方式。

3、创建数据库的连接

•要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,

该对象就代表一个数据库的连接。

•使用DriverManager的getConnectin(String url , String username ,

String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和

密码来获得。

例如:

//连接MySql数据库,用户名和密码都是root

String url = "jdbc:mysql://localhost:3306/test"

String username = "root"

String password = "root"

try{

Connection con =

DriverManager.getConnection(url , username , password )

}catch(SQLException se){

System.out.println("数据库连接失败!")

se.printStackTrace()

}

4、创建一个Statement

•要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3

种类型:

1、执行静态SQL语句。通常通过Statement实例实现。

2、执行动态SQL语句。通常通过PreparedStatement实例实现。

3、执行数据库存储过程。通常通过CallableStatement实例实现。

具体的实现方式:

Statement stmt = con.createStatement()

PreparedStatement pstmt = con.prepareStatement(sql)

CallableStatement cstmt =

con.prepareCall("{CALL demoSp(? , ?)}")

5、执行SQL语句

Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate

和execute

1、ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句

,返回一个结果集(ResultSet)对象。

2、int executeUpdate(String sqlString):用于执行INSERT、UPDATE或

DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等

3、execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的

语句。

具体实现的代码:

ResultSet rs = stmt.executeQuery("SELECT * FROM ...") 法长瘁短诓的搭痊但花

int rows = stmt.executeUpdate("INSERT INTO ...")

boolean flag = stmt.execute(String sql)

6、处理结果

两种情况:

1、执行更新返回的是本次 *** 作影响到的记录数。

2、执行查询返回的结果是一个ResultSet对象。

• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些

行中数据的访问。

• 使用结果集(ResultSet)对象的访问方法获取数据:

while(rs.next()){

String name = rs.getString("name")

String pass = rs.getString(1) // 此方法比较高效

}

(列是从左到右编号的,并且从列1开始)

7、关闭JDBC对象

*** 作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声

明顺序相反:

1、关闭记录集

2、关闭声明

3、关闭连接对象

if(rs != null){ // 关闭记录集

try{

rs.close()

}catch(SQLException e){

e.printStackTrace()

}

}

if(stmt != null){ // 关闭声明

try{

stmt.close()

}catch(SQLException e){

e.printStackTrace()

}

}

if(conn != null){ // 关闭连接对象

try{

conn.close()

}catch(SQLException e){

e.printStackTrace()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6918708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-30
下一篇 2023-03-30

发表评论

登录后才能评论

评论列表(0条)

保存