学生表tbStudentXx(学号、姓名、性别、班级、出生日期和家庭地址) 图书表tbBookXx(编号、书名、作者姓名、出版社、出版日期和价格) 图书借阅表tbBorrowXx(学生学号、图书编号、借阅日期、归还日期、借阅天数) 统计每个出版社价格高于50元的图书的册数、平均价格、最高价格和最低价格。 [如何用union解决这道题] SELECT tbBookXx.出版社, COUNT(*) AS 册数, AVG(tbBookXx.价格) AS 平均价格, MAX(tbBookXx.价格) AS 最高价格, MIN(tbBookXx.价格) AS 最低价格 FROM tbBookXx, tbBorrowXx WHERE tbBookXx.编号 = tbBorrowXx.图书编号 AND tbBookXx.价格 > 50 GROUP BY tbBookXx.出版社 UNION SELECT tbBookXx.出版社, 0, 0, 0, 0 FROM tbBookXx WHERE tbBookXx.出版社 NOT IN ( SELECT tbBookXx.出版社 FROM tbBookXx, tbBorrowXx WHERE tbBookXx.编号 = tbBorrowXx.图书编号 AND tbBookXx.价格 > 50 GROUP BY tbBookXx.出版社 ); 这样解法有问题没?
时间: 2024-03-14 18:46:18 浏览: 21
学生信息管理系统,实现学生信息包括:学号、姓名、性别、年龄、班级等信息。
5星 · 资源好评率100%
这个 SQL 查询语句有一些问题,主要是在第二个 SELECT 子句中,统计出版社价格高于50元的图书册数、平均价格、最高价格和最低价格都被设置为 0,这是不正确的。
正确的解法是使用 UNION ALL 操作符,把两个 SELECT 子句的结果合并在一起,然后再对合并后的结果进行分组和聚合。具体的 SQL 查询语句如下:
```
SELECT tbBookXx.出版社, COUNT(*) AS 册数, AVG(tbBookXx.价格) AS 平均价格, MAX(tbBookXx.价格) AS 最高价格, MIN(tbBookXx.价格) AS 最低价格
FROM tbBookXx, tbBorrowXx
WHERE tbBookXx.编号 = tbBorrowXx.图书编号 AND tbBookXx.价格 > 50
GROUP BY tbBookXx.出版社
UNION ALL
SELECT tbBookXx.出版社, 0, 0, 0, 0
FROM tbBookXx
WHERE tbBookXx.出版社 NOT IN (
SELECT tbBookXx.出版社
FROM tbBookXx, tbBorrowXx
WHERE tbBookXx.编号 = tbBorrowXx.图书编号 AND tbBookXx.价格 > 50
GROUP BY tbBookXx.出版社
);
```
注意,这里使用的是 UNION ALL,而不是 UNION,因为 UNION 会去除重复的行,而在这个问题中,第二个 SELECT 子句返回的都是没有匹配的出版社,因此也需要包含在结果中,不能被去除。
阅读全文