数据库原理及应用-李唯唯主编-实验3-4

实验3-4 数据更新

一、实验目的与要求
  1. 掌握插入数据、删除数据、修改数据
  2. 掌握实验子查询插入数据、更新数据
二、实验内容
  1. 实验平台:

    • 操作系统:windows11
    • 数据库:MySQL8
    • 数据库管理平台:Navicat Premium 15
  2. 题目:在数据库supermarket数据库上完成下列操作

    1. 添加新品"GN0011 Sup002 CN001 乐至三合一咖啡 12.30 17.30 100 2018-11-12 18" 。

    2. 建立一张新表,使用子查询将各月的销售额插人该表,存储月份及销售额。

    3. 使用子查询将各学生的购买额插入新表,由系统自建新表,存储学生学号、姓名、销售额。

    4. 将所有商品存量增加2。

    5. 将保质期还有30天的商品价格打8折。

    6. .分别使用子查询方式与连接方式将广州地区供货商的商品加价10%。

    7. 将销售额后两位的商品下架。

    8. 删除销售额最小的供应商信息。

三、实验过程、步骤及结果
  1. 添加新品"GN0011 Sup002 CN001 乐至三合一咖啡 12.30 17.30 100 2018-11-12 18" 。

    • 代码:

      -- 1.添加新品"GN0011 Sup002 CN001 乐至三合一咖啡 12.30 17.30 100 2018-11-12 18" 。
      -- 方法一:
      SELECT * FROM goods;
      INSERT INTO goods VALUES('GN0011','Sup002','CN001','乐至三合一咖啡',12.30,17.30,100,'2018-11-12',18);
      SELECT * FROM goods;
      -- 方法二:
      DELETE FROM goods WHERE GoodsNO = 'GN0011';
      
      SELECT * FROM goods;
      INSERT INTO goods (GoodsNO,SupplierNO,CategoryNO,GoodsName,InPrice,SalePrice,Number,ProductTime,QGPeriod) VALUES('GN0011','Sup002','CN001','乐至三合一咖啡',12.30,17.30,100,'2018-11-12',18);
      
      SELECT * FROM goods;
      
    • 效果图:
      -在这里插入图片描述
      在这里插入图片描述在这里插入图片描述

  2. 建立一张新表,使用子查询将各月的销售额插人该表,存储月份及销售额。

    • 代码:

      -- 2.建立一张新表,使用子查询将各月的销售额插人该表,存储月份及销售额。
      -- 求得各月的销售额
      SELECT MONTH(s.HappenTime) month,SUM(g.SalePrice*s.Number) sale FROM goods g
      RIGHT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      GROUP BY MONTH(s.HappenTime)
      ORDER BY MONTH(s.HappenTime) ASC
      
      -- 创建表
      CREATE TABLE tmp(
      	month INT,
      	sale DOUBLE
      );
      
      -- 插入数据
      INSERT INTO tmp (month,sale) (
      	SELECT MONTH(s.HappenTime) month,SUM(g.SalePrice*s.Number) sale FROM goods g
      	RIGHT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      	GROUP BY MONTH(s.HappenTime)
      	ORDER BY MONTH(s.HappenTime) ASC
      )
      
      SELECT * FROM tmp;
      
    • 效果图:在这里插入图片描述
      在这里插入图片描述在这里插入图片描述

  3. 使用子查询将各学生的购买额插入新表,由系统自建新表,存储学生学号、姓名、销售额。

    • 代码:

      -- 3.使用子查询将各学生的购买额插入新表,由系统自建新表,存储学生学号、姓名、销售额。
      -- 查询各个学生的购买额
      SELECT st.SNO,st.SName,SUM(s.Number*g.SalePrice) sale FROM student st
      LEFT JOIN salebill s ON st.SNO = s.SNO
      LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO
      GROUP BY st.SNO,st.SName;
      
      -- 查询并且建表
      CREATE table tmp2 (SELECT st.SNO,st.SName,SUM(s.Number*g.SalePrice) sale FROM student st
      LEFT JOIN salebill s ON st.SNO = s.SNO
      LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO
      GROUP BY st.SNO,st.SName);
      -- 查看创建的表
      SELECT * FROM tmp2;
      
    • 效果图:在这里插入图片描述
      在这里插入图片描述

  4. 将所有商品存量增加2。

    • 代码:

      -- 4.将所有商品存量增加2。
      -- 未添加前
      SELECT * FROM goods;
      UPDATE goods SET Number = Number + 2;
      -- 添加后
      SELECT * FROM goods;
      
      
    • 效果图:在这里插入图片描述在这里插入图片描述在这里插入图片描述

  5. 将保质期还有30天的商品价格打8折。

    • 代码:

      -- 5.将保质期还有30天的商品价格打8折。
      -- 打折前
      SELECT * FROM goods;
      
      -- 打折
      UPDATE goods SET SalePrice = SalePrice*0.8 WHERE QGPeriod <= 30;
      
      -- 打折后
      SELECT * FROM goods;
      
    • 效果图:在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

  6. 分别使用子查询方式与连接方式将广州地区供货商的商品加价10%。

    • 代码:

      -- 6.分别使用子查询方式与连接方式将广州地区供货商的商品加价10%。
      -- 方法一:子查询
      -- 加价前查询广州地区供货商品的进价
      SELECT * FROM goods WHERE SupplierNO IN(
      	SELECT SupplierNO FROM supplier WHERE Address LIKE '广州%'
      )
      -- 加价
      UPDATE goods SET InPrice = (1+0.1)*InPrice WHERE SupplierNO IN(
      	SELECT SupplierNO FROM supplier WHERE Address LIKE '广州%'
      ) 
      SET g.InPrice = (1+0.1)*g.InPrice;
      ;
      -- 加价后查询广州地区供货商品的进价
      
      -- 方法二:连接查询
      -- 加价前,查询广州地区供货商品的进价
      SELECT sp.SupplierName,g.GoodsName,g.InPrice,sp.Address FROM goods g 
      LEFT JOIN supplier sp 
      ON g.SupplierNO = sp.SupplierNO
      WHERE sp.Address LIKE '广州%';
      
      -- 加价
      UPDATE 
      goods g LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
      SET g.InPrice = (1+0.1)*g.InPrice;
      WHERE sp.Address LIKE '广州%';
      
      -- 加价后,查询广州地区供货商品的进价
      SELECT sp.SupplierName,g.GoodsName,g.InPrice,sp.Address FROM goods g 
      LEFT JOIN supplier sp 
      ON g.SupplierNO = sp.SupplierNO
      WHERE sp.Address LIKE '广州%';
      
    • 效果图:在这里插入图片描述
      在这里插入图片描述在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

  7. 将销售额后两位的商品下架。

    • 代码:

      -- 7.将销售额后两位的商品下架。--》删除销售额最低的两件商品
      -- 第一步 查询所有商品的销售额,找出销售额最低的两位商品的商品id,然后删除
      SELECT DISTINCT g.GoodsNO,g.GoodsName,SUM(g.SalePrice*s.Number) sale FROM goods g
      LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      GROUP BY g.GoodsNO,g.GoodsName
      ORDER BY sale ASC
      LIMIT 0,2;
      
      -- 删除
      DELETE FROM goods WHERE GoodsNO IN (
      SELECT DISTINCT g.GoodsNO,g.GoodsName,SUM(g.SalePrice*s.Number) sale FROM goods g
      LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      GROUP BY g.GoodsNO,g.GoodsName
      ORDER BY sale ASC LIMIT 0,2);
      
      -- 删除后,查看goods表
      SELECT * FROM goods;
      
    • 效果图:在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

  8. 删除销售额最小的供应商信息。

    • 代码:

      -- 8.删除销售额最小的供应商信息。
      -- 统计各个供应商的销售额
      SELECT sp.SupplierNO FROM supplier sp 
      LEFT JOIN goods g ON sp.SupplierNO = g.SupplierNO
      LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      GROUP BY sp.SupplierNO
      ORDER BY SUM(g.SalePrice*s.Number) ASC
      LIMIT 0,1;
      
      -- 删除
      -- 由于由多个表引用了待删除供应商的信息作为外键约束,所以删除供应商信息前一个先删除引用外键的数据
      -- 查询到该供应商的所有商品信息并删除,再删除供应商的信息
      SELECT GoodsNO FROM goods WHERE SupplierNO =  (
      			SELECT sp.SupplierNO FROM supplier sp 
      			LEFT JOIN goods g ON sp.SupplierNO = g.SupplierNO
      			LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      			GROUP BY sp.SupplierNO
      			ORDER BY SUM(g.SalePrice*s.Number) ASC
      			LIMIT 0,1
      )
      -- 删除最低销售额的供应商的货物对应的账单信息
      DELETE FROM salebill WHERE GoodsNO IN (
      	SELECT t.GoodsNO FROM (SELECT GoodsNO FROM goods WHERE SupplierNO = (
      			SELECT sp.SupplierNO FROM supplier sp 
      			LEFT JOIN goods g ON sp.SupplierNO = g.SupplierNO
      			LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      			GROUP BY sp.SupplierNO
      			ORDER BY SUM(g.SalePrice*s.Number) ASC
      			LIMIT 0,1)) t
      )
      -- 删除最低销售额的供应商的货物信息
      DELETE FROM goods WHERE SupplierNO = (
      		SELECT * FROM (
      			SELECT sp.SupplierNO FROM supplier sp 
      			LEFT JOIN goods g ON sp.SupplierNO = g.SupplierNO
      			LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      			GROUP BY sp.SupplierNO
      			ORDER BY SUM(g.SalePrice*s.Number) ASC
      			LIMIT 0,1
      	) t
      )
      -- 删除最低销售额的供应商信息
      DELETE FROM supplier WHERE SupplierNO IN (
      	SELECT * FROM (
      			SELECT sp.SupplierNO FROM supplier sp 
      			LEFT JOIN goods g ON sp.SupplierNO = g.SupplierNO
      			LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      			GROUP BY sp.SupplierNO
      			ORDER BY SUM(g.SalePrice*s.Number) ASC
      			LIMIT 0,1
      	) t
      );
      
      -- 查看删除后的结果
      SELECT * FROM supplier;
      
    • 效果图:在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、实验问题及解决方法
  1. 上述第八题在这里插入图片描述
    —》limit子句不能用于嵌套循环

    • 解决办法:在外面再嵌套一层子查询
    1. 第七题,将销售额后两位的商品下架。实际上并不是删除商品信息,而是将商品的库存清零,即将销售额后两位的商品的set Number = 0
    • -- 7.将销售额后两位的商品下架。--》删除销售额最低的两件商品
      -- 第一步 查询所有商品的销售额,找出销售额最低的两位商品的商品id,然后将库存置为0
      SELECT DISTINCT g.GoodsNO,g.GoodsName,SUM(g.SalePrice*s.Number) sale FROM goods g
      LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      GROUP BY g.GoodsNO,g.GoodsName
      ORDER BY sale ASC
      LIMIT 0,2;
      
      -- 删除
      update goods set Number = 0 WHERE GoodsNO IN (
      SELECT DISTINCT g.GoodsNO,g.GoodsName,SUM(g.SalePrice*s.Number) sale FROM goods g
      LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      GROUP BY g.GoodsNO,g.GoodsName
      ORDER BY sale ASC LIMIT 0,2);
      
      -- 删除后,查看goods表
      SELECT * FROM goods;
      
  2. 第八题:如果该表没有外键引用该表数据(supplier)直接删除即可,如果引用了则需要如上述方法删除,根据实际情况自行选择即可

    • -- 如果没有外键删除最低销售额的供应商信息
      DELETE FROM supplier WHERE SupplierNO IN (
      	SELECT * FROM (
      			SELECT sp.SupplierNO FROM supplier sp 
      			LEFT JOIN goods g ON sp.SupplierNO = g.SupplierNO
      			LEFT JOIN salebill s ON g.GoodsNO = s.GoodsNO
      			GROUP BY sp.SupplierNO
      			ORDER BY SUM(g.SalePrice*s.Number) ASC
      			LIMIT 0,1
      	) t
      );
      
五、实验总结
  1. 综合考查对数据库DML语句(数据库操作语言)与嵌套查询、子查询的组合使用

  2. 考查了对外键使用的优点和缺点:

    • 优点:可以保持数据的一致性更新
    • 缺点:增加数据、删除数据、修改数据十分耗费资源,必须先删除引用了该列为外键的数据先删除,才能删除被引用的列
  3. 考查了DML(数据库查询语句)与limit子句、常用聚合函数的搭配使用

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
let str = "\u6797\u80afZ\u8f7f\u8f66\u7684\u5916\u89c2\u8bbe\u8ba1\u6709\u4ee5\u4e0b\u4eae\u70b9\uff1a\n\n1. \u8f66\u5934\u8bbe\u8ba1\uff1a\u91c7\u7528\u70b9\u9635\u5f0f\u4e2d\u7f51\u548c\u8d2f\u7a7f\u5f0fLED\u5934\u706f\uff0c\u642d\u914d\u4f1a\u53d1\u5149\u7684\u8f66\u5934LOGO\uff0c\u5c55\u73b0\u51fa\u8bbe\u8ba1\u611f\u548c\u5e74\u8f7b\u65f6\u5c1a\u3002\u8f66\u5934\u8fd8\u914d\u5907\u4e86\u591a\u4e2a\u6444\u50cf\u5934\u548c\u96f7\u8fbe\uff0c\u652f\u6301\u9ad8\u7ea7\u9a7e\u9a76\u8f85\u52a9\u7cfb\u7edf\u3002\n\n2. \u8f66\u8eab\u4fa7\u9762\u8bbe\u8ba1\uff1a\u6d41\u7545\u7684\u7ebf\u6761\u5c55\u73b0\u8c6a\u534e\u8f66\u7684\u6c14\u8d28\uff0c\u4f4e\u77ee\u7684\u8f66\u9876\u548c\u9ad8\u6311\u633a\u62d4\u7684\u8170\u7ebf\uff0c\u5c55\u73b0\u7f8e\u5f0f\u8c6a\u534e\u8f66\u7684\u4f20\u7edf\u8d28\u611f\u3002\u9690\u85cf\u5f0f\u95e8\u628a\u624b\u589e\u52a0\u4e86\u8f66\u8f86\u7684\u7ec6\u8282\u611f\uff0c\u4e0b\u65b9\u7684\u5200\u950b\u9020\u578b\u8f6e\u5708\u589e\u6dfb\u4e86\u8fd0\u52a8\u611f\u3002\n\n3. \u8f66\u5c3e\u8bbe\u8ba1\uff1a\u8d2f\u7a7f\u5f0f\u706f\u5149\u548cLED\u8f66\u6807\u4e0e\u8f66\u5934\u76f8\u547c\u5e94\uff0c\u7ed3\u5408\u6241\u5e73\u5316\u7684\u5c3e\u90e8\u8bbe\u8ba1\uff0c\u8ba9\u8f66\u5c3e\u770b\u8d77\u6765\u77ed\u5de7\u7cbe\u608d\uff0c\u4e0d\u663e\u5f97\u7b28\u91cd\u3002\u8f66\u8eab\u56db\u5468\u8fd8\u914d\u5907\u4e86\u4e0d\u5c11\u9540\u94ec\u5143\u7d20\uff0c\u5f70\u663e\u7f8e\u5f0f\u8c6a\u534e\u98ce\u683c\u3002\n\n\u6797\u80afZ\u8f7f\u8f66\u7684\u5916\u89c2\u8bbe\u8ba1\u901a\u8fc7\u5e74\u8f7b\u5316\u548c\u79d1\u6280\u5316\u5143\u7d20\u7684\u52a0\u5165\uff0c\u63d0\u5347\u4e86\u6574\u8f66\u7684\u53d7\u4f17\u9762\uff0c\u5c55\u73b0\u51fa\u8c6a\u534e\u548c\u65f6\u5c1a\u611f\u3002";用js怎么解码并且使里面的\n变成\br
07-21

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

redvelet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值