实验报告:图书销售管理系统数据库SQL应用编程

实验报告:图书销售管理系统数据库SQL应用编程实验目的针对图书销售管理数据库开发,了解SQL语言DDL、DML、DQL类型语句在数据库操作访问中的应用方法,培养数据库SQL编程访问能力。同时也掌握基本的数据库触发器、存储过程SQL编程方法,培养数据库后端编程能力。本实验完成图书销售管理系统数据库的SQL数据操作访问和后端数据处理功能。实验原理首先对图书销售管理系统进行数据需求分析,定义组成系统数据结构的实体、实体属性以及实体之间的关系。采用实体关系图(E-R模型图)方法来展示图书销售管理系统的概念数据模型与逻辑数据模型。利用PowerDes

大家好,又见面了,我是你们的朋友全栈君。

实验目的

针对图书销售管理数据库开发,了解SQL语言DDL、DML、DQL类型语句在数据库操作访问中的应用方法,培养数据库SQL编程访问能力。同时也掌握基本的数据库触发器、存储过程SQL编程方法,培养数据库后端编程能力。本实验完成图书销售管理系统数据库的SQL数据操作访问和后端数据处理功能。


实验原理

首先对图书销售管理系统进行数据需求分析,定义组成系统数据结构的实体、实体属性以及实体之间的关系。采用实体关系图(E-R模型图)方法来展示图书销售管理系统的概念数据模型与逻辑数据模型。利用PowerDesigner数据库软件系统进行系统物理数据模型设计,对设计的图书销售管理系统数据库模型进行检验与完善,并对系统进行数据库设计,给出设计方案。

基于数据库设计方案,通过SQL编程执行来完成对数据库的创建与数据访问操作以及相应的后端编程操作。在本实验中,使用SQL语句完成对数据库、关系表、索引、视图、触发器、存储过程的创建,并编写SQL语句对数据库表进行数据的增删查改操作,以及利用视图、存储过程、触发器实现业务数据处理。

数据库基本操作数据:

创建数据库:Create database <数据库名>;
创建数据库表:Create table <表名>;
插入数据:Insert into <基本表>[<列名表>] values(v1,v2,v3,.);
删除数据:Delete from <表名> [where <条件表达式>];
更新数据:Update <基本表> set <列名 1> = <表达式 1>,[<列名 2> = <表达式 2>] [where <条件表达式>];
Add修改方式:Alter table <表名> add <新列名称><数据类型>[完整性约束];

视图是一种从基础数据库表中获取数据所组成的虚拟表,在数据库中只需存储视图结构定义,而不存储视图所包含的数据,使用视图可以简化复杂的SQL查询,提高数据访问安全性,提供一定的数据逻辑独立性,可以集中展示用户所感兴趣的特定数据。

创建视图:Create view <视图名>[(列名 1), (列名 2),] as <SELECT 查询>;
查看视图:Select * from <视图名>;
删除视图:Drop view <视图名>;

索引是一种针对表中指定列的值进行排序的数据结构,使用它可以加快表中数据的查询。在数据表中建立类似于图书目录的索引结构,并将索引列的值及索引指针操作保存在索引结构中。此后在对数据表进行数据查询时,首先在索引结构中查找符合条件的索引指针值, 然后再根据索引指针快速找到对应的数据记录,这样可实现快速检索元组数据的目的。

创建索引:Create unique index <索引名> on <表名><(列名[,])>;
修改索引:Alter index <索引名> rename to <新索引名>;
删除索引:Drop index <索引名>;

存储过程是由一组能完成特定功能的SQL语句构成,它把经常会反复使用的SQL语句逻辑块封装起来,经编译后,存储在数据库服务端,当再次调用时,不需再次编译,用户连接到数据库服务端时,用户通过指定存储过程的名称并给出参数,数据库就可以找到相应的存储过程并予以调用。

创建存储过程:
Create [or replace] function
name ( [ [ argmode ] [ argname ] argtype [{ default | =} default_expr ] [,] ] ) [returns retype | returns table ( column_name column_type [,] ) ]
As $$ Declare
--声明段
Begin
--函数体语句End;
$$ language lang_name;
调用存储过程:
Select function_name;

触发器与存储过程不同,存储过程通过其他程序启动运行或直接启动运行,而触发器由一个事件触发启动运行,也就是触发器在某个事件发生时自动隐式运行。Postgresql触发器在系统执行某种特定类型的操作时,数据库将自动执行指定的特殊函数。触发器常用于定义逻辑计较复杂的完整性约束,或某种业务规则的约束。

创建触发器:
Create [constraint] Trigger name
{ before | after |instead of}{event[or]}
On table_name
[ from referenced_table_name] [ for [each ]{ row | statement } ] [when (condition ) ]
Execute procedure function_name ( arguments )

实验内容

使用pgAdmin4数据库管理工具对图书销售管理系统数据库进行SQL编程操作,并完成触发器、存储过程后端编程,具体实验内容如下:
(1)图书销售管理系统数据库BookSale创建操作。
(2)在图书销售管理系统数据库BookSale中创建数据库表、视图、索引等对象。
(3)对图书销售管理系统数据库表进行数据增、删、查、改SQL操作。
(4)编写存储过程Pro_CurrentSale,实现当日图书销售量及销售金额汇总统计。
(5)编写过程语句块,实现对存储过程Pro_CurrentSale的调用,并输出统计结果。
(6)编写图书销售表Insert触发器Tri_InsertSale,实现图书库存数据同步修改处理。
(7)对图书销售表Insert触发器Tri_InsertSale程序进行功能验证。

在实验计算机上,利用pgAdmin4数据库管理工具及SQL语句,完成图书销售管理系统数据库SQL应用编程操作,同时记录实验过程的步骤、操作、运行结果界面等数据,为撰写实验报告提供素材。


实验器材

管理工具:pgAdmin 4
DBMS系统:PostgreSQL 11


实验步骤

(1)图书销售管理系统数据库BookSale创建操作。
采用SQL语句执行方式,创建图书销售管理系统数据库BookSale。

(2)在图书销售管理系统数据库BookSale中创建数据库表、视图、索引等对象。
采用SQL语句执行方式,创建图书表Book、作者表Author、出版社表Publisher、库存流水表Bookstock、客户表Customer、销售表Sale,以及各表主键和外键的创建,并为各表创建索引。

(3)对图书销售管理系统数据库表进行数据增、删、查、改SQL操作。
为 Book、Author、Publisher、Customer表准备样本数据,采用SQL语句执行方式,将样本数据插入到表中。
对各表进行数据修改、删除、查询、统计等访问操作。

(4)编写存储过程Pro_CurrentSale,实现当日图书销售量及销售金额汇总统计。

(5)编写过程语句块,实现对存储过程Pro_CurrentSale的调用,并输出统计结果。

(6)编写图书销售表Insert触发器Tri_InsertSale,实现图书库存数据同步修改处理。
编写图书销售表Insert触发器Tri_InsertSale,实现在Sale表数据插入时,级联操作 Bookstock表,将图书的库存流水进行记录,同时级联更新Book表中对应图书的库存数据。

(7)对图书销售表Insert触发器Tri_InsertSale程序进行功能验证。
为 Sale表准备样本数据,将样本数据插入到表中之后查看Bookstock表是否有对应的更新,并对比插入数据前后Bookstock表中对应数据的修改情况。


实验结果

(1)图书销售管理系统数据库BookSale创建操作。

SQL程序代码:

create database BookSale;

运行操作界面:
请添加图片描述
在目录处刷新,查看语句运行结果:
请添加图片描述
结果说明:
成功创建了BookSale数据库。

(2)在图书销售管理系统数据库BookSale中创建数据库表、视图、索引等对象。

SQL程序代码:

create table Author
(
	Author_ID		char(18)	not null,
	Author_Name		varchar(20)	not null,
	Author_Gender	char(2)		not null,
	constraint Author_PK primary key(Author_ID)
);
create table Publisher
(
	Publisher_ID	char(11)	not null,
	Publisher_Name	varchar(20)	not null,
	Publisher_phone	varchar(15)	not null,
	constraint Publisher_PK primary key(Publisher_ID)
);
create table Book
(
	Book_ISBN		char(13)	not null,
	Book_Name		varchar(50)	not null,
	Book_Pubdate	date		not null,
	Book_Price		money		not null,
	Book_Stock		int4		not null,
	Author_ID		char(18)	null,
	Publisher_ID	char(11)	null,
	constraint Book_PK primary key(Book_ISBN)
);
create table Customer
(
	Customer_ID		char(18)	not null,
	Customer_Name	varchar(20)	not null,
	Customer_phone	varchar(15)	not null,
	constraint Customer_PK primary key(Customer_ID)
);
create table Sale
(
	Sale_ID			varchar(11)	not null,
	Sale_Date		date		not null,
	Sale_Number		int4		not null,
	Sale_Amount		money		not null,
	Book_ISBN		char(13)	null,
	Customer_ID		char(18)	null,
	constraint Sale_PK primary key(Sale_ID)
);
create table Bookstock
(
	Stock_ID		varchar(10)	not null,
	Stock_Date		date		not null,
	Stock_Operation	char(4)		not null,
	Stock_Change	int4		not null,
	Book_ISBN		char(13)	null,
	constraint Stock_PK primary key(Stock_ID)
);
alter table Book add constraint Book_Author_FK foreign key(Author_ID)
references Author(Author_ID) on delete restrict on update restrict;
alter table Book add constraint Book_Publisher_FK foreign key(Publisher_ID)
references Publisher(Publisher_ID) on delete restrict on update restrict;
alter table Sale add constraint Sale_Book_FK foreign key(Book_ISBN)
references Book(Book_ISBN) on delete restrict on update restrict;
alter table Sale add constraint Sale_Customer_FK foreign key(Customer_ID)
references Customer(Customer_ID) on delete restrict on update restrict;
alter table Bookstock add constraint Stock_Book_FK foreign key(Book_ISBN)
references Book(Book_ISBN) on delete restrict on update restrict;

运行操作界面:
请添加图片描述
结果说明:
成功创建了数据库表对象。

SQL程序代码:

create index Author_Name_Idx on Author(Author_Name);
create index Publisher_Name_Idx on Publisher(Publisher_Name);
create index Book_Name_Idx on Book(Book_Name);
create index Customer_ID_Idx on Customer(Customer_ID);
create index Sale_Date_Idx on Sale(Sale_Date);
create index Stock_ID_Idx on Bookstock(Stock_ID);

运行操作界面:
请添加图片描述
结果说明:
成功创建了各个数据库表对应的索引。

(3)对图书销售管理系统数据库表进行数据增、删、查、改SQL操作。

SQL程序代码:

insert into Author values('130126199904080314','小明','男');
insert into Author values('120857198811123587','小红','女');
insert into Author values('310109199803143088','小刚','男');
insert into Publisher values('PUB00000001','高等教育出版社','010-65321854');
insert into Publisher values('PUB00000002','电子工业出版社','010-65329857');
insert into Publisher values('PUB00000003','人民邮电出版社','010-65325987');
insert into Book values('9787115502742','Web前端开发实践','2016-01-01','50','80','130126199904080314','PUB00000001');
insert into Book values('9783253213434','计算思维导论','2014-02-02','45','100','120857198811123587','PUB00000002');
insert into Book values('9641543566465','数据库原理','2015-03-03','42','120','120857198811123587','PUB00000002');
insert into Book values('9865365975234','编译原理','2016-07-07','55','150','310109199803143088','PUB00000003');
insert into Customer values('330172199203042748','李华','13344556677');
insert into Customer values('365211199311084214','张亮','13321234234');
insert into Customer values('231332199603283242','陈斌','13363635451');
select * from Publisher;

运行操作界面:
请添加图片描述
样本数据插入完成后,对出版社表内的数据进行查询操作,查看插入操作是否正确:
请添加图片描述
结果说明:
成功在各个数据库表中插入了样本数据,经过查询结果验证,插入操作无误。

SQL程序代码:

insert into Publisher values('PUB00000004','清华大学出版社','010-65323169');
select * from Publisher;

运行操作界面:
请添加图片描述
结果说明:
成功在Publisher表中增加了新的一行数据,经过查询输出后证明增加数据操作无误。

SQL程序代码:

update Publisher set Publisher_Phone = '010-61234414' where Publisher_ID = 'PUB00000004';
select * from Publisher;

运行操作界面:
请添加图片描述
结果说明:
成功在Publisher表中实现了修改数据的操作,经过查询输出后证明修改操作无误。

SQL程序代码:

delete from Publisher where Publisher_ID = 'PUB00000004';
select * from Publisher;

运行操作界面:
请添加图片描述
结果说明:
成功在Publisher表中删除了新添加的一行数据,经过查询输出后证明删除操作无误。

(4)编写存储过程Pro_CurrentSale,实现当日图书销售量及销售金额汇总统计。

SQL程序代码:

create or replace function Pro_CurrentSale(out amount int4, out allmoney money) as $count$
	begin
		select sum(Sale_Number) into amount from Sale where Sale_Date = '2018-02-23';
		select sum(Sale_Amount) into allmoney from Sale where Sale_Date = '2018-02-23';
	end;
$count$ LANGUAGE plpgsql;

运行操作界面:
请添加图片描述
结果说明:
成功创建了Pro_CurrentSale存储过程。

(5)编写过程语句块,实现对存储过程Pro_CurrentSale的调用,并输出统计结果。

SQL程序代码:

select * from Pro_CurrentSale();

运行操作界面:
请添加图片描述
结果说明:
调用存储过程后输出数据符合实际情况,输出的总销售量和总金额数据正确,创建存储过程Pro_CurrentSale正确。

(6)编写图书销售表Insert触发器Tri_InsertSale,实现图书库存数据同步修改处理。

SQL程序代码:

create or replace function InsertSale()
	returns trigger as $$
	begin
		insert into Bookstock values(new.Sale_ID,new.Sale_Date,'出库',new.Sale_Number,new.Book_ISBN);
		update Book set Book_Stock = Book_Stock - new.Sale_Number where Book.Book_ISBN = new.Book_ISBN;
		return new;
	end;
$$ language plpgsql;

运行操作界面:
请添加图片描述
结果说明:
成功创建了InsertSale()触发器函数。

SQL程序代码:

create trigger Tri_InsertSale after insert on Sale
for each row execute procedure InsertSale();

运行操作界面:
请添加图片描述
结果说明:
成功创建了Tri_InsertSale触发器。

(7)对图书销售表Insert触发器Tri_InsertSale程序进行功能验证。

SQL程序代码:

insert into Sale
values('SA00001','2018-02-22','10','500','9787115502742','330172199203042748');
insert into Sale
values('SA00002','2018-02-23','5','250','9787115502742','365211199311084214');
insert into Sale
values('SA00003','2018-02-23','10','450','9783253213434','365211199311084214');
insert into Sale
values('SA00004','2018-02-23','20','900','9783253213434','231332199603283242');
insert into Sale
values('SA00005','2018-02-24','30','1260','9641543566465','231332199603283242');
insert into Sale
values('SA00006','2018-02-24','10','550','9865365975234','231332199603283242');
select * from Bookstock;
select * from Book;

运行操作界面:
请添加图片描述
查看Bookstock表的数据:
请添加图片描述
对比Book表的数据:
请添加图片描述
结果说明:
Bookstock表中本来没有数据,在Sale表插入数据之后,将库存数据进行记录,记录数据正确,同时发现 Book表中库存量都发生了变化,分别减少了与销售表中记录的销售件数相应值的大小,更新数据正确,可以证明触发器的功能都实现了,触发器功能正确。


数据库原理及应用实验:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/137631.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • RPC协议及其python实例[通俗易懂]

    RPC协议及其python实例[通俗易懂]RPC协议在OpenStack中广泛使用,那么什么是RPC协议?做什么用的那?搜索了一阵,有了一个大概的印象。RPC是一个应用层的协议,分为client端和server端,server端写好了具体的函数实现,client端远程调用该函数,返回函数的结果。好处是很明显的:首先是可以直接利用别的程序的部分功能,这是最基础的。更重要的,利用rpc可以实现系统的分布式架构,一方面有些功能比

    2022年5月19日
    46
  • 关于pdb文件

    关于pdb文件关于pdb文件当程序在VS上编译时,程序所依赖的所有动态链接库(dll文件)也会被编译,编译过程中每个dll都会产生一个pdb文件,又称为“符号文件”,是一个存储数据的信息文件,其包含dll库在编译过程的某些调试信息,例如程序中所用到的全局变量、局部变量、函数名以及他们的入口地址等。当使用VS调试程序时,会默认加载你的程序以及程序依赖的dll库产生的所有pdb文件,但是结…

    2022年6月2日
    58
  • 阿里云配置二级域名

    阿里云配置二级域名阿里云配置二级域名打开https://www.aliyun.com/?utm_content=se_1000301881打开控制台找到域名列表—解析—添加记录记录类型A-主机记录:yy.xxx.cn//—-yy二级域名xxx一级域名解析线路:默认记录值:39.xx….

    2022年5月21日
    46
  • 指针函数到函数指针作为函数的返回值

    指针函数到函数指针作为函数的返回值转载自:https://www.cnblogs.com/yangjiquan/p/11465376.html首先说一下指针函数:1.指针函数的定义顾名思义,指针函数即返回指针的函数。其一般定义形式如下:类型名*函数名(函数参数表列);其中,后缀运算符括号”()”表示这是一个函数,其前缀运算符星号”*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个”指向返回值为…的指针(地址),”类型名”表示函数返回的指针指向的类…

    2022年6月22日
    24
  • TCP/ip详解_TCP/IP详解

    TCP/ip详解_TCP/IP详解  TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。…

    2025年7月4日
    2
  • linux强制删除只读文件夹,强制删除文件夹linux的方法是什么

    linux强制删除只读文件夹,强制删除文件夹linux的方法是什么灰烬里等你丶回答数:14479|被采纳数:22016-12-1714:18:36linux下删除文件的命令是rm;以下分两种介绍删除方法:对于目录文件的删除:#rf-rffilename对于非目录文件的删除:#rffilename之所以对于目录文件的删除加上了强制参数是因为在linux对目录文件的删除是递归式的;rm的参数如下所示:OPTIONSRemove(unlink)t…

    2022年6月13日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号