实验3-2

一、实验目的与要求

  1. 掌握单表查询
  2. 掌握多表连接查询
  3. 掌握子查询、集合查询。
  4. 掌握派生表查询。
  5. 掌握聚合函数使用方法

二、实验内容

  1. 实验平台:

    • 操作系统:windows11
    • 数据库:MySQL8
    • 数据库管理平台:Navicat Premium 15
  2. 在数据库supermarket上完成下列操作
    1. 查询商品种类信息。
    2. 查询IT专业所有学生信息。
    3. 查询MIS专业年龄小于20岁的学生信息。并为MIS列取别名为 “信息管理系统”
    4. 查询利润率大于30%的商品编号与商品名。
    5. 查询广州佛山供应的商品信息。
    6. 查询购买了商品种类为咖啡的MIS专业的学生信息。
    7. 查询购买了商品种类为咖啡的各专业的学生人数。
    8. 查询购买各商品种类的各专业的学生人数。
    9. 查询从未购买过商品的学生信息。
    10. 查询与商品编号GN0005相同产地的商品编号、商品名。
    11. 使用派生表查询各供应商的存货量。
    12. 查询售价大于该种类商品售价均值的商品号、商品名。
    13. 分别用子查询 与 连接查询查询购买了商品编号为 “GN0003” 和"GN0007"的学生学号与姓名。
    14. 查询各校销售额。
    15. 查询购买额前三的校名、专业名。
    16. 使用集合查询方式查询生产日期早于2018-1-1 或 库存量小于30的商品信息。

三、实验过程、步骤及结果

  1. 题目:查询商品种类信息

    • 代码:

      -- 实验3-2
      -- 1. 查询商品种类信息。
      -- 方法一
      SELECT * FROM category;
      -- 方法二
      SELECT CategoryNO 编号,CategoryName 种类,Description 具体描述 FROM category;
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BblEH3J7-1665624066603)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161526838.png)]


  2. 题目:查询IT专业所有学生信息

    • 代码:

      -- 2. 查询IT专业所有学生信息。
      -- 方法一
      SELECT * FROM student WHERE Major = 'IT';-- 方法二
      SELECT SNO 学号,SName 姓名,BirthYear 出生年份,Ssex 性别,College 学院,Major 专业,WeiXin 专业 FROM student WHERE Major = 'IT';
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GGWM1ikz-1665624066604)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161543809.png)]


  3. 题目:查询MIS专业年龄小于20岁的学生信息。并为MIS列取别名为 “信息管理系统”

    • 代码:

      -- 3. 查询MIS专业且年龄小于20岁的学生信息。并为MIS列取别名为 "信息管理系统"。
      -- 第一次查询不到信息,因为这里的BirthYear不是date类型,而是int,类型,所以直接减就行了SELECT * FROM student WHERE Major = 'MIS' AND (YEAR(NOW())-YEAR(BirthYear)) > 20;
      -- 第一次查询不到信息,因为这里的BirthYear都已经超过了20岁,所以找不到满足条件的,因此查询MIS专业且年龄大于20岁的学生信息
      -- 方法一:查询MIS专业且年龄小于20岁的学生信息
      SELECT * FROM student WHERE Major = 'MIS' AND (YEAR(NOW())-BirthYear) < 20;-- 方法二:查询MIS专业且年龄大于20岁的学生信息
      SELECT SNO 学号,SName 姓名,BirthYear 出生年份,(YEAR(NOW())-BirthYear) 年龄,Ssex 性别,College 学院,Major 专业,WeiXin 专业 FROM student WHERE Major = 'MIS' AND (YEAR(NOW())-BirthYear) > 20;-- 方法二
      SELECT SNO 学号,SName 姓名,BirthYear 出生年份,Ssex 性别,College 学院,Major 专业,WeiXin 专业 FROM student WHERE Major = 'IT';
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gf5ntqBy-1665624066604)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161617075.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYUeu6Yd-1665624066605)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161632448.png)]


  4. 题目:查询利润率大于30%的商品编号与商品名

    • 代码:

      -- 4. 查询利润率大于30%的商品编号与商品名。
      -- SELECT * FROM goods WHERE (SalePrice-InPrice)/InPrice < 0.3;
      SELECT GoodsNO 商品编号,GoodsName 商品名,ROUND((SalePrice-InPrice)/InPrice,2) AS 利润率 FROM goods WHERE (SalePrice-InPrice)/InPrice < 0.3;
      SELECT GoodsNO 商品编号,GoodsName 商品名,ROUND((SalePrice-InPrice)/InPrice,2) AS 利润率 FROM goods WHERE (SalePrice-InPrice)/InPrice > 0.3;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-loYhYfgu-1665624066605)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161901957.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d7jvMRkU-1665624066605)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161913598.png)]


  5. 题目:查询广州佛山供应的商品信息

    • 代码:

      -- 5. 查询广州佛山供应的商品信息。
      SELECT g.GoodsNO 商品编号,s.SupplierNO 供应商编号,g.CategoryNO 商品种类编号,g.GoodsName 商品名,s.Address 供应商,s.SupplierName 公司  FROM goods g
      LEFT JOIN supplier s ON g.SupplierNO = s.SupplierNO
      WHERE s.Address = '广州佛山';
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Z9XxBR0-1665624066605)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161941446.png)]


  6. 题目:查询购买了商品种类为咖啡的MIS专业的学生信息

    • 代码:

      -- 6. 查询购买了商品种类为咖啡的MIS专业的学生信息。
      -- 方法一:使用子查询语句
      SELECT * FROM student st WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM category cLEFT JOIN goods g ON c.CategoryNO = g.CategoryNOWHERE c.CategoryName = '咖啡'))
      AND Major = 'MIS'-- 方法2:使用左右外连接
      SELECT DISTINCT st.SNO,st.SName,st.BirthYear,st.Ssex,st.College,st.Major,st.WeiXin
      FROM category c
      LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
      LEFT JOIN salebill s ON s.GoodsNO = g.GoodsNO
      LEFT JOIN student st ON st.SNO = s.SNO
      WHERE c.CategoryName = '咖啡' AND st.Major='MIS';
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KENkiepN-1665624066606)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012161959760.png)]


  7. 题目:查询购买了商品种类为咖啡的各专业的学生人数

    • 代码:

      -- 7. 查询购买了商品种类为咖啡的各专业的学生人数。
      -- 方法一:使用子查询语句
      SELECT Major 专业,COUNT(Major) 人数 FROM student st WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM category cLEFT JOIN goods g ON c.CategoryNO = g.CategoryNOWHERE c.CategoryName = '咖啡'))
      GROUP BY Major;-- 方法二:使用左右外连接
      SELECT sc.Major 专业,COUNT(sc.Major) 人数
      FROM student st
      RIGHT JOIN (SELECT DISTINCT st.SNO,st.SName,st.BirthYear,st.Ssex,st.College,st.Major,st.WeiXin FROM category cLEFT JOIN goods g ON c.CategoryNO = g.CategoryNOLEFT JOIN salebill s ON s.GoodsNO = g.GoodsNOright JOIN student st ON st.SNO = s.SNO
      WHERE c.CategoryName = '咖啡') sc ON st.SNO = sc.SNO
      GROUP BY sc.Major;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k5V5FlzD-1665624066606)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012162027303.png)]


  8. 题目: 查询购买各商品种类的各专业的学生人数

    • 代码:

      -- 8. 查询购买各商品种类的各专业的学生人数。
      -- 方法一:使用子查询语句
      SELECT Major,COUNT(Major) FROM student WHERE SNO IN (SELECT DISTINCT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM goods WHERE CategoryNO IN (SELECT CategoryNO FROM category))
      )
      GROUP BY Major;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B5lFf5wK-1665624066606)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012162056489.png)]


  9. 题目:查询从未购买过商品的学生信息

    • 代码:

      -- 9. 查询从未购买过商品的学生信息。
      -- 方法一:使用子查询语句
      SELECT * FROM student WHERE SNO NOT IN (SELECT DISTINCT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM goods WHERE CategoryNO IN (SELECT CategoryNO FROM category))
      );
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8D1HWQ3o-1665624066607)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012162116300.png)]


  10. 题目: 查询与商品编号GN0005相同产地的商品编号、商品名

    • 代码:

      -- 10. 查询与商品编号GN0005相同产地的商品编号、商品名。
      -- 第一步:查询到商品编号GN0005商品的产地
      SELECT Address
      FROM goods g
      LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
      WHERE g.GoodsNO = 'GN0005';-- 第二步:根据商品的产地查询到供应商的编号
      SELECT SupplierNO FROM
      supplier
      WHERE Address = (SELECT Address FROM goods gLEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNOWHERE g.GoodsNO = 'GN0005'
      )-- 第三步:使用子查询
      SELECT * FROM goods WHERE SupplierNO IN(SELECT SupplierNO FROM supplier WHERE Address = (SELECT Address FROM goods gLEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNOWHERE g.GoodsNO = 'GN0005')
      )
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKOs1FdJ-1665624066607)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012162446667.png)]


  11. 题目:使用派生表查询各供应商的存货量

    • 代码:

      -- 11. 使用派生表查询各供应商的存货量。
      SELECT sp.SupplierNO 供应商编号,sp.SupplierName 供应商名称,sg.sum_number 存货量
      FROM supplier sp
      LEFT JOIN (SELECT SupplierNO,SUM(Number) sum_number FROM goods GROUP BY SupplierNO) sg
      ON sp.SupplierNO = sg.SupplierNO;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xPiwk85n-1665624066609)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012164131110.png)]


  12. 题目:查询售价大于该种类商品售价均值的商品号、商品名

    • 代码:

      -- 12. 查询售价大于该种类商品售价均值的商品号、商品名。
      -- 第一步:按种类分组求平均售价(保留小数点后两位)
      SELECT CategoryNO,(ROUND(AVG(SalePrice),2)) avg_saleprice FROM goods
      GROUP BY CategoryNO;SELECT g.GoodsNO 商品编号,g.SupplierNO 供应商编号, sg.CategoryNO 商品种类编号,g.GoodsName 商品名,g.SalePrice 售价,sg.avg_saleprice 该类商品的平均售价
      FROM goods g
      right JOIN (SELECTCategoryNO,ROUND(AVG( SalePrice ),2) avg_saleprice FROMgoods GROUP BYCategoryNO) sg
      ON g.CategoryNO = sg.CategoryNO AND g.SalePrice > sg.avg_saleprice;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J7F2yrRB-1665624066609)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012165213442.png)]


  13. 题目:分别用子查询 与 连接查询查询购买了商品编号为 “GN0003” 和"GN0007"的学生学号与姓名

    • 代码:

      -- 13. 分别用子查询 与 连接查询查询购买了商品编号为 "GN0003" 和"GN0007"的学生学号与姓名。
      -- 方法一:使用子查询
      SELECT SNO,SName FROM student WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007'
      )SELECT SNO,SName FROM student WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007' GROUP BY SNO HAVING COUNT(GoodsNO) = 2
      )-- 方法二:使用连接查询
      SELECT st.SNO,st.SName
      FROM student st
      RIGHT JOIN (SELECT DISTINCT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007') g
      ON st.SNO = g.SNO
      ORDER BY st.SNO ASCSELECT st.SNO,st.SName
      FROM student st
      RIGHT JOIN (SELECT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007' GROUP BY SNO HAVING COUNT(GoodsNO) = 2) g
      ON st.SNO = g.SNO
      ORDER BY st.SNO ASC
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xGm3rgJ9-1665624066610)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012170149140.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u5EpgkEm-1665624066610)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221013084331224.png)]


  14. 题目:查询各校销售额

    • 代码:

      -- 14. 查询各校销售额。
      -- 第一步:计算各个学生的销售额
      SELECT s.SNO s_SNO ,SUM((s.Number*g.SalePrice)) sum_number_price FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO;
      -- 第二步:计算各校的销售数量
      SELECT st.College 学校,SUM(sg.sum_number_price) 销售额
      FROM student st
      LEFT JOIN (SELECT s.SNO s_SNO ,SUM((s.Number*g.SalePrice)) sum_number_price FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO
      ) sg
      ON st.SNO = sg.s_SNO
      GROUP BY College;-- 14. 查询各公司销售额。
      -- 第一步:计算各类商品的销售数量
      SELECT GoodsNO,SUM(Number) sum_number FROM salebill
      GROUP BY GoodsNO;SELECT sg.GoodsNO,g.GoodsName,sp.SupplierName 公司,g.SalePrice*sg.sum_number 销售额 FROM goods g
      RIGHT JOIN (SELECT GoodsNO,SUM(Number) sum_number FROM salebill
      GROUP BY GoodsNO) sg
      ON g.GoodsNO = sg.GoodsNO
      LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UvHxMooL-1665624066611)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221013084042608.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hCFUwgIX-1665624066612)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221013084133433.png)]


  15. 题目:查询销售额、购买额前三的校名、专业名

    • 代码:

      -- 15. 查询销售额、购买额前三的校名、专业名。
      SELECT st.College 学校,Major 专业名,SUM(sg.sum_number_price) 销售额
      FROM student st
      LEFT JOIN (SELECT s.SNO s_SNO ,SUM((s.Number*g.SalePrice)) sum_number_price FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO
      ) sg
      ON st.SNO = sg.s_SNO
      GROUP BY College,Major
      ORDER BY Major DESC
      LIMIT 0,3;SELECT st.College 学校,Major 专业名,SUM(sg.sum_number) 购买额
      FROM student st
      LEFT JOIN (SELECT s.SNO s_SNO ,SUM(s.Number) sum_number FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO
      ) sg
      ON st.SNO = sg.s_SNO
      GROUP BY College,Major
      ORDER BY Major DESC
      LIMIT 0,3;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hBuQt7OR-1665624066612)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221013083645807.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6isjtRii-1665624066613)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221013084011868.png)]


  16. 题目:使用集合查询方式查询生产日期早于2018-1-1 或 库存量小于30的商品信息

    • 代码:

      -- 16. 使用集合查询方式查询生产日期早于2018-1-1 或 库存量小于30的商品信息。
      -- 方法一:使用union
      SELECT * FROM goods WHERE DATEDIFF(DATE(ProductTime),'2018-1-1') < 0
      UNION
      SELECT * FROM goods WHERE QGPeriod < 30;
      --
      SELECT GoodsNO,SupplierNO,CategoryNO,GoodsName,InPrice,SalePrice,Number,ProductTime 生产日期,QGPeriod 库存,DATEDIFF(DATE(ProductTime),'2018-1-1') 日期差
      FROM goods
      WHERE DATEDIFF(DATE(ProductTime),'2018-1-1') < 0 OR QGPeriod < 30;
      
    • 效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7u2WB6Dm-1665624066613)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221013083624345.png)]

四、具体查询

-- 实验3-2
-- 1. 查询商品种类信息。
-- 方法一
SELECT * FROM category;
-- 方法二
SELECT CategoryNO 编号,CategoryName 种类,Description 具体描述 FROM category;-- 2. 查询IT专业所有学生信息。
-- 方法一
SELECT * FROM student WHERE Major = 'IT';-- 方法二
SELECT SNO 学号,SName 姓名,BirthYear 出生年份,Ssex 性别,College 学院,Major 专业,WeiXin 专业 FROM student WHERE Major = 'IT';-- 3. 查询MIS专业且年龄小于20岁的学生信息。并为MIS列取别名为 "信息管理系统"。
-- 第一次查询不到信息,因为这里的BirthYear不是date类型,而是int,类型,所以直接减就行了SELECT * FROM student WHERE Major = 'MIS' AND (YEAR(NOW())-YEAR(BirthYear)) > 20;
-- 第一次查询不到信息,因为这里的BirthYear都已经超过了20岁,所以找不到满足条件的,因此查询MIS专业且年龄大于20岁的学生信息
-- 方法一:查询MIS专业且年龄小于20岁的学生信息
SELECT * FROM student WHERE Major = 'MIS' AND (YEAR(NOW())-BirthYear) < 20;-- 方法二:查询MIS专业且年龄大于20岁的学生信息
SELECT SNO 学号,SName 姓名,BirthYear 出生年份,(YEAR(NOW())-BirthYear) 年龄,Ssex 性别,College 学院,Major 专业,WeiXin 专业 FROM student WHERE Major = 'MIS' AND (YEAR(NOW())-BirthYear) > 20;-- 4. 查询利润率大于30%的商品编号与商品名。
-- SELECT * FROM goods WHERE (SalePrice-InPrice)/InPrice < 0.3;
SELECT GoodsNO 商品编号,GoodsName 商品名,ROUND((SalePrice-InPrice)/InPrice,2) AS 利润率 FROM goods WHERE (SalePrice-InPrice)/InPrice < 0.3;
SELECT GoodsNO 商品编号,GoodsName 商品名,ROUND((SalePrice-InPrice)/InPrice,2) AS 利润率 FROM goods WHERE (SalePrice-InPrice)/InPrice > 0.3;-- 5. 查询广州佛山供应的商品信息。
SELECT g.GoodsNO 商品编号,s.SupplierNO 供应商编号,g.CategoryNO 商品种类编号,g.GoodsName 商品名,s.Address 供应商,s.SupplierName 公司  FROM goods g
LEFT JOIN supplier s ON g.SupplierNO = s.SupplierNO
WHERE s.Address = '广州佛山';-- 6. 查询购买了商品种类为咖啡的MIS专业的学生信息。
-- 方法一:使用子查询语句
SELECT * FROM student st WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM category cLEFT JOIN goods g ON c.CategoryNO = g.CategoryNOWHERE c.CategoryName = '咖啡'))
AND Major = 'MIS'-- 方法2:使用左右外连接
SELECT DISTINCT st.SNO,st.SName,st.BirthYear,st.Ssex,st.College,st.Major,st.WeiXin
FROM category c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
LEFT JOIN salebill s ON s.GoodsNO = g.GoodsNO
LEFT JOIN student st ON st.SNO = s.SNO
WHERE c.CategoryName = '咖啡' AND st.Major='MIS';-- 7. 查询购买了商品种类为咖啡的各专业的学生人数。
-- 方法一:使用子查询语句
SELECT Major 专业,COUNT(Major) 人数 FROM student st WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM category cLEFT JOIN goods g ON c.CategoryNO = g.CategoryNOWHERE c.CategoryName = '咖啡'))
GROUP BY Major;-- 方法二:使用左右外连接
SELECT sc.Major 专业,COUNT(sc.Major) 人数
FROM student st
RIGHT JOIN (SELECT DISTINCT st.SNO,st.SName,st.BirthYear,st.Ssex,st.College,st.Major,st.WeiXin FROM category cLEFT JOIN goods g ON c.CategoryNO = g.CategoryNOLEFT JOIN salebill s ON s.GoodsNO = g.GoodsNOright JOIN student st ON st.SNO = s.SNO
WHERE c.CategoryName = '咖啡') sc ON st.SNO = sc.SNO
GROUP BY sc.Major;-- 8. 查询购买各商品种类的各专业的学生人数。
-- 方法一:使用子查询语句
SELECT Major,COUNT(Major) FROM student WHERE SNO IN (SELECT DISTINCT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM goods WHERE CategoryNO IN (SELECT CategoryNO FROM category))
)
GROUP BY Major;-- 9. 查询从未购买过商品的学生信息。
-- 方法一:使用子查询语句
SELECT * FROM student WHERE SNO NOT IN (SELECT DISTINCT SNO FROM salebill WHERE GoodsNO IN (SELECT GoodsNO FROM goods WHERE CategoryNO IN (SELECT CategoryNO FROM category))
);-- 10. 查询与商品编号GN0005相同产地的商品编号、商品名。
-- 第一步:查询到商品编号GN0005商品的产地
SELECT Address
FROM goods g
LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
WHERE g.GoodsNO = 'GN0005';-- 第二步:根据商品的产地查询到供应商的编号
SELECT SupplierNO FROM
supplier
WHERE Address = (SELECT Address FROM goods gLEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNOWHERE g.GoodsNO = 'GN0005'
)-- 第三步:使用子查询
SELECT * FROM goods WHERE SupplierNO IN(SELECT SupplierNO FROM supplier WHERE Address = (SELECT Address FROM goods gLEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNOWHERE g.GoodsNO = 'GN0005')
)-- 11. 使用派生表查询各供应商的存货量。
SELECT sp.SupplierNO 供应商编号,sp.SupplierName 供应商名称,sg.sum_number 存货量
FROM supplier sp
LEFT JOIN (SELECT SupplierNO,SUM(Number) sum_number FROM goods GROUP BY SupplierNO) sg
ON sp.SupplierNO = sg.SupplierNO;-- 12. 查询售价大于该种类商品售价均值的商品号、商品名。
-- 第一步:按种类分组求平均售价(保留小数点后两位)
SELECT CategoryNO,(ROUND(AVG(SalePrice),2)) avg_saleprice FROM goods
GROUP BY CategoryNO;SELECT g.GoodsNO 商品编号,g.SupplierNO 供应商编号, sg.CategoryNO 商品种类编号,g.GoodsName 商品名,g.SalePrice 售价,sg.avg_saleprice 该类商品的平均售价
FROM goods g
right JOIN (SELECTCategoryNO,ROUND(AVG( SalePrice ),2) avg_saleprice FROMgoods GROUP BYCategoryNO) sg
ON g.CategoryNO = sg.CategoryNO AND g.SalePrice > sg.avg_saleprice;-- 13. 分别用子查询 与 连接查询查询购买了商品编号为 "GN0003" 和"GN0007"的学生学号与姓名。
-- 方法一:使用子查询
SELECT SNO,SName FROM student WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007'
)SELECT SNO,SName FROM student WHERE SNO IN(SELECT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007' GROUP BY SNO HAVING COUNT(GoodsNO) = 2
)-- 方法二:使用连接查询
SELECT st.SNO,st.SName
FROM student st
RIGHT JOIN (SELECT DISTINCT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007') g
ON st.SNO = g.SNO
ORDER BY st.SNO ASCSELECT st.SNO,st.SName
FROM student st
RIGHT JOIN (SELECT SNO FROM salebill WHERE GoodsNO = 'GN0003' OR GoodsNO = 'GN0007' GROUP BY SNO HAVING COUNT(GoodsNO) = 2) g
ON st.SNO = g.SNO
ORDER BY st.SNO ASC-- 14. 查询各校销售额。
-- 第一步:计算各个学生的销售额
SELECT s.SNO s_SNO ,SUM((s.Number*g.SalePrice)) sum_number_price FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO;
-- 第二步:计算各校的销售数量
SELECT st.College 学校,SUM(sg.sum_number_price) 销售额
FROM student st
LEFT JOIN (SELECT s.SNO s_SNO ,SUM((s.Number*g.SalePrice)) sum_number_price FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO
) sg
ON st.SNO = sg.s_SNO
GROUP BY College;SELECT GoodsNO,SUM(Number) sum_number FROM salebill
GROUP BY GoodsNO;SELECT sg.GoodsNO,g.GoodsName,sp.SupplierName 公司,g.SalePrice*sg.sum_number 销售额 FROM goods g
RIGHT JOIN (SELECT GoodsNO,SUM(Number) sum_number FROM salebill
GROUP BY GoodsNO) sg
ON g.GoodsNO = sg.GoodsNO
LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO;-- 15. 查询销售额、购买额前三的校名、专业名。
SELECT st.College 学校,Major 专业名,SUM(sg.sum_number_price) 销售额
FROM student st
LEFT JOIN (SELECT s.SNO s_SNO ,SUM((s.Number*g.SalePrice)) sum_number_price FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO
) sg
ON st.SNO = sg.s_SNO
GROUP BY College,Major
ORDER BY Major DESC
LIMIT 0,3;SELECT st.College 学校,Major 专业名,SUM(sg.sum_number) 购买额
FROM student st
LEFT JOIN (SELECT s.SNO s_SNO ,SUM(s.Number) sum_number FROM salebill s LEFT JOIN goods g ON s.GoodsNO = g.GoodsNO GROUP BY SNO
) sg
ON st.SNO = sg.s_SNO
GROUP BY College,Major
ORDER BY Major DESC
LIMIT 0,3;-- 16. 使用集合查询方式查询生产日期早于2018-1-1 或 库存量小于30的商品信息。
-- 方法一:使用union
SELECT * FROM goods WHERE DATEDIFF(DATE(ProductTime),'2018-1-1') < 0
UNION
SELECT * FROM goods WHERE QGPeriod < 30;
--
SELECT GoodsNO,SupplierNO,CategoryNO,GoodsName,InPrice,SalePrice,Number,ProductTime 生产日期,QGPeriod 库存,DATEDIFF(DATE(ProductTime),'2018-1-1') 日期差
FROM goods
WHERE DATEDIFF(DATE(ProductTime),'2018-1-1') < 0 OR QGPeriod < 30;

数据库文件:>
supermarket.sql
https://www.aliyundrive.com/s/hmXsCqZJHN3
提取码: 4rx3
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

查询语句文件:>
实验3-2.sql
https://www.aliyundrive.com/s/vshDT2MhVnG
提取码: 3x1e
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。

五、实验总结

  1. 综合考查了对数据库表的查询的DML语句,单表查询、多表联查的使用
  2. 综合考查了子查询语句、集合查询、派生查询的具体应用
  3. 综合考查了聚合函数、分组查询、limit子句的知识

数据库原理及应用-李唯唯主编-实验3-2相关推荐

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

    实验3-4 数据更新 一.实验目的与要求 掌握插入数据.删除数据.修改数据 掌握实验子查询插入数据.更新数据 二.实验内容 实验平台: 操作系统:windows11 数据库:MySQL8 数据库管理平 ...

  2. 【数据库原理与应用MySQL版】实验指导

    实验1 CRETE DATABASE studentsdb; USE studentsdb;CREATE TABLE IF NOT EXISTS `student_info`( `student_id ...

  3. 南京廖华里mysql测试题1答案_数据库原理(一)研讨、实验、作业题安排

    第4周(第四章:数据更新.视图.嵌入式SQL部分自学) 一.实验课: 1. 建立计算机学院总评不及格成绩学生的视图,包括学生学号.姓名.性别.手机.所选 课程和成绩. 2. 在E表中插入记录,把每个学 ...

  4. 【数据库原理实验(openGauss)】金融场景化实验

    金融场景化实验 文章目录 金融场景化实验 一.金融数据模型 1.E-R图 2.关系模式 3.物理模型 Client(客户)表 bank_card(银行卡)表 finances_product(理财产品 ...

  5. 《数据库原理与应用》实验一

    题目来源学校课后作业,禁商业用途,仅用于课业学习 <数据库原理与应用>实验一 一.实验目的及要求 1.掌握MySQL系统的数据库创建方式. 2.掌握MySQL系统的数据表的创建方式. 3. ...

  6. 《数据库原理实验指导书》

    <数据库原理实验指导书> 河南科技大学软件学院 目录 实验规则 基本实验方法 实验环境 实验一 数据定义 实验二 数据更新 实验三 数据查询-简单查询和连接查询 实验四 数据查询-分组查询 ...

  7. 《数据库系统原理及应用教程》(苗雪兰等,第五版) 实验五:数据库的组合查询和统计查询实验

    阅读前注意: 1. 本实验报告配套<数据库系统原理及应用教程>(苗雪兰等,第五版) 实验五:数据库的组合查询和统计查询实验(书上10.4节以及第六章部分内容),书本中采用Microsoft ...

  8. 数据库原理及应用实验报告-实验10-触发器

    数据库原理及应用实验报告 实验题目  实验10触发器 10.1 实验目的 通过实验使学生加深对数据完整性的理解,学会理解.创建和使用触发器. 10.2 实验内容  (用实验9的Teacher表) (1 ...

  9. 数据库原理及应用实验二参考答案

    一.实验内容及要求 1.创建数据库和数据表(在相应位置贴上SQL语句) (1)利用资源管理器,在D盘建立以自己的姓名为名称的文件夹,以便保存数据库. (2)登录并连接到SQL Server 服务器. ...

最新文章

  1. 通用数组(练习,可能有错)
  2. Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法
  3. [SDOI2011]计算器 BSGS
  4. g4e基础篇#6 了解Git历史记录
  5. C#设计模式之14-命令模式
  6. 关于sqoop增量导入oracle的数据到HDFS的出现的错误总结
  7. poj3252Round Numbers
  8. cpu占用高 mongo_排查MongoDB CPU使用率高的问题
  9. ios传感器应用开发最佳实践_同构 javascript 应用开发的最佳实践(Four)
  10. swift 异常捕获try catch的使用
  11. MS-DOS虚拟机安装
  12. 图文详解PCB生产工艺流程
  13. python操作word实现小学拼音本功能
  14. 115、神州数码交换机配置基本命令
  15. ios系统安装android,iPhone上安装Android系统详细步骤。
  16. [学习笔记]opencv双线性插值法图像放大
  17. 电脑操作系统(Androidx86、Windows、Linux)说明
  18. Linux 修改虚拟机IP地址
  19. Docker基础(下)
  20. PPT中的声音文件(完美版)

热门文章

  1. 安利:那些让你欲罢不能的宝贝网站
  2. linux 网站服务器优化 web server优化
  3. Delphi FastReport 小结
  4. zoj 2576 Queen Collisions
  5. js 点击文本框,预览选择图片
  6. 微信小程序分享功能(微信好友,朋友圈)
  7. 开源社已加入群聊,思否 AIGC Hackathon 扩列
  8. 图片怎样加贴纸?这些方法值得一试
  9. TCP/UDP/IP/Socket的定义
  10. 知乎:月薪2~3万,码农怎样度过一天