数据库实验报告 设计便利店数据表、商品数据表 查询需要上货的商品列表 SQL Kingbase

版权声明:作者:cheese0_0,转载请注明出处来自https://blog.csdn.net/cheese0_0 商业转载请联系作者获得授权,非商业转载请注明出处 https://blog.csdn.net/cheese0_0/article/details/85058490

一、实验题目
已有条件:假设你拥有多个连锁便利店,名字不一样,每个便利店有店名、国家、城市、地址等信息要登记,每个便利店有多种商品要登记,包括商品ID、商品名称等信息。每个店销售的商品种类、价格和促销折扣不一致。每天凌晨5点需要给每个店中数量不足3的商品上货。
问题:请展开想象,按照关系数据库的要求设计便利店数据表、商品数据表。
问题:插入自己想象的数据,查询需要上货的商品列表,结果不少于5项。
二、相关原理与知识
(完成实验所用到的相关原理与知识)
1.定义模式
在SQL语句中模式定义语句如下:
CREATE SCHEMA <模式名>AUTHORIZATION<用户名>;
2.定义基本表
CREATE TABLE<表名> (<列名><数据类型> [列级完整性约束条件]
[,<列名><数据类型> [列级完整性约束条件]]

[,<表级完整性约束条件>]);
3.插入数据
插入单个元组--新元组插入指定表中。
语句格式:
INSERT
INTO <表名> [(<属性列1>[,<属性列2 >…)]
VALUES (<常量1> [,<常量2>] … ) ;
注:
INTO子句
指定要插入数据的表名及属性列
属性列的顺序可与表定义中的顺序不一致
没有指定属性列:表示要插入的是一条完整的元组,且属性列属性与表定义中的顺序一致
指定部分属性列:插入的元组在其余属性列上取空值
VALUES子句
提供的值的个数和值的类型必须与INTO子句匹配
4.数据查询
SELECT [ALL | DISTINCT] <目标列表达式> [,<目标列表达式>] …
FROM <表名或视图名>[, <表名或视图名> ] …
[ WHERE <条件表达式> ]
[ GROUP BY <列名1> [ HAVING <条件表达式> ] ]
[ ORDER BY <列名2> [ ASC | DESC ] ] ;
注:
SELECT子句:指定要显示的属性列;
FROM子句:指定查询对象(基本表或视图);
WHERE子句:指定查询条件;
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中使用集函数;
HAVING短语:筛选出只有满足指定条件的组;
ORDER BY子句:对查询结果按指定列值升序或降序排序。
5.设置搜索模式路径
SET search_path TO “S-T”;
SET search_path TO PUBLIC;
SET search_path TO “S-T”,PUBLIC;
三、实验过程
(清晰展示实际操作过程,相关截图及解释)
建立以MYSTORE命名的模式;
建立如下两个表:
STORE表:STORE(Sname,Scountry,Scity,Saddress),用来存放便利店名称、所在国家、城市和地址,由已知条件可知每个便利店名字不一样,所以无需给便利店编号,名称可以作为主码,即Sname为主码;
GOODS表:GOODS(Gno,Sname,Gname,Gprice,Gdiscount,Gcount),用来存放商品编码、商品所在便利店名称、商品名称、商品价格、商品折扣及剩余数量,由于题目中没有确定各个商品的名称不一样,故对商品进行编号得商品编码,又因为每个店销售的商品种类、价格和促销折扣不一致,所以主码由商品编码和便利店名称这两个属性组成,必须作为表级完整性进行定义,另外,注意Sname为外码,参照表为STORE。
建立模式和表后可以得到如下目录:
在这里插入图片描述
数据插入:
然后向STORE表和GOODS表中添加便利店和商品信息。
题目中表示每个店销售的商品种类、价格和促销折扣不一致。所以在插入数据时要注意商品的多样性及价格和折扣的不同。由于问题二为“插入自己想象的数据,查询需要上货的商品列表,结果不少于5项”。所以我们在插入数据时要注意商品剩余数量小于3的商品要多于五项。
充分发挥想象后,插入数据后的表如下:
STORE表:
在这里插入图片描述
GOODS表:
在这里插入图片描述
数据查询:
接下来查询GOODS表中商品数量小于3的商品信息,包括商品ID、商品名称、所在便利店名称以及当前剩余数量。
运用查询语句,从GOODS表中查询GNO(商品ID)、GNAME(商品名称)、SNAME(所在便利店名称)以及GCOUNT(当前剩余数量),条件是GCOUNT<3。
操作及结果如下图所示:
在这里插入图片描述
四、实验结果与分析
实验结果已在实验过程中给出。
本次实验构建了便利店商品数据库,不仅可以储存我的多个连锁便利店的信息及商品信息,还有利于理清便利店与商品之间的关系(即每个便利店各自不同的商品种类、商品折扣与价格),方便管理,譬如每天凌晨5点需要给每个店中数量不足3的商品上货。
用SQL语句搭建简单的便利店上货系统,在MYSTORE模式下,由两个表组成,分别为STORE表(用来存放便利店名称、所在国家、城市和地址),GOODS表(用来存放商品编码、商品所在便利店名称、商品名称、商品价格、商品折扣及剩余数量)。在我的设计中,STORE表的主码直接是便利店名称,因为题中已说明“多个连锁便利店,名字不一样”。但是,GOODS表中的主码由商品ID和商品所在便利店名称这两个属性共同构成,这样,同一种商品可以出现在不同的便利店中,更符合生活实际。同时,也可以满足“每个店销售的商品…价格和促销折扣不一致”。
有了表之后,依据题目要求发挥想象,向表中插入数据。为了能够使数据表简洁清晰,在保证题目要求的基础上,插入必要数据。假设我有3个便利店“AAA”“DDD”“QQQ”,又因为题目要求“每个店销售的商品种类、价格和促销折扣不一致”,所以在插入数据时,要尽量满足商品的多样性,保证每个便利店都有另外两个便利店没有的商品,同时还要注意不同便利店和不同种类商品折扣和价格的变化。又因为“问题:插入自己想象的数据,查询需要上货的商品列表,结果不少于5项。”为了使我们的最终查询结果不少于5项,在插入数据时要满足商品剩余数量不足3的商品超过5项(不一定是5种商品,即同一种商品在两个便利店库存都小于3,算作2项)。在明确要求后,运用书中INSERT相关内容,逐个向表中插入数据。
然后对表尝试查询操作,直接运用查询语句,查询GOODS表中剩余数量小于3的货物编号、名称、所在商店及当前剩余数量,数据库会直接给出满足条件的商品列表。就是需要上货的商品列表。
五、问题总结
(记录所遇到的问题及解决方法)
遇到问题:第一次建立GOODS表时,主码只设置了GNO,即商品名称。这样会导致一种商品只能在一个便利店出售,虽然满足题目中所述“每个店销售的商品种类……不一致。”,但是不符合实际生活。
解决办法:重新建立表,使主码由两个属性(Sname和Gno)组成,作为表级完整性进行定义。这样就可以保证一种商品可以在多家便利店出售。
六、源代码
(源程序)
建立模式:

  CREATE SCHEMA MYSTORE

建立STORE表:

CREATE TABLE MYSTORE.Store
(Sname CHAR(3) PRIMARY KEY,
Scountry CHAR(20),
Scity CHAR(20),
Saddress CHAR(20));

建立GOODS表:

SET search_path TO MYSTORE,PUBLIC;
CREATE TABLE MYSTORE.Goods
(Gno CHAR(10),
Sname CHAR(3),
PRIMARY KEY(Sname,Gno),
     /* 主码由两个属性构成,必须作为表级完整性进行定义*/
Gname CHAR(30),
Gprice CHAR(20),
Gdiscount CHAR(5),
Gcount CHAR(20),
FOREIGN KEY(Sname)REFERENCES STORE(Sname)
    /* 表级完整性约束条件,Sname是外码,被参照表是STORE */
);

发挥想象,插入数据:
向STORE表中插入便利店相关信息,以下是全部代码:

INSERT INTO "MYSTORE"."STORE"
 ("SNAME","SCOUNTRY","SCITY","SADDRESS" )
 VALUES 
 ('AAA','China','Xi’an','Beijing Road 255' );
INSERT INTO "MYSTORE"."STORE"
 ("SNAME","SCOUNTRY","SCITY","SADDRESS" )
 VALUES 
 ('DDD','Japan','Tokyo','Lemon Road 143' );
INSERT INTO "MYSTORE"."STORE"
 ("SNAME","SCOUNTRY","SCITY","SADDRESS" )
 VALUES 
 ('QQQ','French','Paris','Rain Road 76' );

向GOODS表中插入商品相关信息,以下是部分代码:

INSERT INTO "MYSTORE"."GOODS"
 ("GNO","SNAME","GNAME","GPRICE","GDISCOUNT","GCOUNT" )
 VALUES 
 ('006','DDD', '《Fly with HarryPotter》by WYQ','79','7.5','1');

……

查询GOODS表中数量小于3的货物编号、名称、所在商店及剩余数量:

SET search_path TO MYSTORE;
SELECT GNO,GNAME,SNAME,GCOUNT
FROM GOODS
WHERE GCOUNT<3;

猜你喜欢

转载自blog.csdn.net/cheese0_0/article/details/85058490