一、实验目的与要求
二、实验内容
三、实验过程、步骤及结果
题目:查询商品种类信息
代码:
-- 实验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)]
题目:查询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)]
题目:查询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)]
题目:查询利润率大于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. 查询广州佛山供应的商品信息。
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)]
题目:查询购买了商品种类为咖啡的MIS专业的学生信息
代码:
-- 6. 查询购买了商品种类为咖啡的MIS专业的学生信息。
-- 方法一:使用子查询语句
SELECT * FROM student st WHERE SNO IN(
SELECT SNO FROM salebill WHERE GoodsNO IN (
SELECT GoodsNO
FROM category c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
WHERE 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. 查询购买了商品种类为咖啡的各专业的学生人数。
-- 方法一:使用子查询语句
SELECT Major 专业,COUNT(Major) 人数 FROM student st WHERE SNO IN(
SELECT SNO FROM salebill WHERE GoodsNO IN (
SELECT GoodsNO
FROM category c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
WHERE 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 c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
LEFT JOIN salebill s ON s.GoodsNO = g.GoodsNO
right 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. 查询购买各商品种类的各专业的学生人数。
-- 方法一:使用子查询语句
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. 查询从未购买过商品的学生信息。
-- 方法一:使用子查询语句
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)]
题目: 查询与商品编号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 g
LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
WHERE g.GoodsNO = 'GN0005'
)
-- 第三步:使用子查询
SELECT * FROM goods WHERE SupplierNO IN(
SELECT SupplierNO FROM supplier WHERE Address = (
SELECT Address
FROM goods g
LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
WHERE g.GoodsNO = 'GN0005')
)
效果图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IKOs1FdJ-1665624066607)(C:\Users\SayHello\AppData\Roaming\Typora\typora-user-images\image-20221012162446667.png)]
题目:使用派生表查询各供应商的存货量
代码:
-- 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. 查询售价大于该种类商品售价均值的商品号、商品名。
-- 第一步:按种类分组求平均售价(保留小数点后两位)
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 (
SELECT
CategoryNO,
ROUND(AVG( SalePrice ),2) avg_saleprice
FROM
goods
GROUP BY
CategoryNO) 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)]
题目:分别用子查询 与 连接查询查询购买了商品编号为 “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 ASC
SELECT 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. 查询各校销售额。
-- 第一步:计算各个学生的销售额
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. 查询销售额、购买额前三的校名、专业名。
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)]
题目:使用集合查询方式查询生产日期早于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 c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
WHERE 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 c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
WHERE 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 c
LEFT JOIN goods g ON c.CategoryNO = g.CategoryNO
LEFT JOIN salebill s ON s.GoodsNO = g.GoodsNO
right 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 g
LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
WHERE g.GoodsNO = 'GN0005'
)
-- 第三步:使用子查询
SELECT * FROM goods WHERE SupplierNO IN(
SELECT SupplierNO FROM supplier WHERE Address = (
SELECT Address
FROM goods g
LEFT JOIN supplier sp ON g.SupplierNO = sp.SupplierNO
WHERE 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 (
SELECT
CategoryNO,
ROUND(AVG( SalePrice ),2) avg_saleprice
FROM
goods
GROUP BY
CategoryNO) 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 ASC
SELECT 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 ,无需下载极速在线查看,视频原画倍速播放。
五、实验总结