sql部分:
基于以下数据库表结构,用mysql数据库解答下列题目:

表结构
CREATEDATABASE sales_report;USE sales_report;-- 产品类别表CREATETABLE categories (idINT PRIMARY KEY,nameVARCHAR(50) NOTNULL);-- 产品表CREATETABLE products (idINT PRIMARY KEY,nameVARCHAR(100) NOTNULL, category_id INT, price DECIMAL(10,2),FOREIGNKEY (category_id) REFERENCES categories(id));-- 订单表CREATETABLE orders (idINT PRIMARY KEY, product_id INT, quantity INT, order_date DATE,FOREIGNKEY (product_id) REFERENCES products(id));-- 示例数据INSERTINTO categories (id, name) VALUES(1, 'Electronics'),(2, 'Clothing'),(3, 'Books');INSERTINTO products (id, name, category_id, price) VALUES(101, 'Laptop', 1, 1200.00),(102, 'T-Shirt', 2, 25.50),(103, 'Novel', 3, 15.99),(104, 'Headphones', 1, 89.99);INSERTINTO orders (id, product_id, quantity, order_date) VALUES(1001, 101, 2, '2025-01-15'),(1002, 102, 10, '2025-02-20'),(1003, 103, 5, '2025-04-10'),(1004, 101, 1, '2025-07-22'),(1005, 104, 8, '2025-03-05'),(1006, 102, 15, '2025-10-30');
1. 基础查询
题目:查询所有产品信息,并显示对应的类别名称(包括没有类别的产品)。
SELECT p.id, p.name, p.price, c.name AS category_nameFROM products pLEFTJOIN categories c ON p.category_id = c.id;
答案:
2. 聚合函数
题目:统计每个类别的产品数量,按数量降序排序。
SELECT c.name, COUNT(p.id) AS product_countFROM categories cLEFTJOIN products p ON c.id = p.category_idGROUPBY c.nameORDERBY product_count DESC;
答案:
3. 子查询
题目:找出价格高于类别平均价的产品。
SELECT p.name, p.price, c.name AScategoryFROM products pJOIN categories c ON p.category_id = c.idWHERE p.price > (SELECTAVG(price) FROM products WHERE category_id = p.category_id);
答案:
4. 日期函数
题目:计算2025年Q1季度(1月-3月)的总销售额。
SELECTSUM(p.price * o.quantity) AS q1_salesFROM orders oJOIN products p ON o.product_id = p.idWHERE o.order_date BETWEEN'2025-01-01'AND'2025-03-31';
答案:
5. HAVING筛选
题目:查询总销售额超过1000的类别。
SELECT c.name, SUM(p.price * o.quantity) AS total_salesFROM orders oJOIN products p ON o.product_id = p.idJOIN categories c ON p.category_id = c.idGROUPBY c.id, c.nameHAVING total_sales > 1000;
答案:
6. 联合查询
题目:列出所有被订购的产品。
SELECT p.id, p.name,SUM(o.quantity) AS total_ordered_quantityFROM products pINNERJOIN orders o ON p.id = o.product_idGROUPBY p.id, p.nameORDERBY p.id;
说明:
- 使用
INNER JOIN 确保只包含有订单记录的产品(即“被订购过”的产品)。 SUM(o.quantity) 汇总每个产品的总订购数量。GROUP BY p.id, p.name 按产品分组。ORDER BY p.id 使结果按产品 ID 排序,便于阅读。
基于你提供的示例数据,结果应为:
所有产品在示例中都被订购过,因此全部列出。
补充:如果你想要列出产品信息 + 类别 + 总数量,可以加上类别名:
SELECT p.id, p.name, c.name AScategory,SUM(o.quantity) AS total_ordered_quantityFROM products pINNERJOIN orders o ON p.id = o.product_idINNERJOIN categories c ON p.category_id = c.idGROUPBY p.id, p.name, c.nameORDERBY p.id;
答案:
7. 窗口函数
题目:对每个类别的产品按价格排名。
SELECTname, price, category_id,RANK() OVER (PARTITIONBY category_id ORDERBY price DESC) AS price_rankFROM products;
答案:
8. 视图创建
题目:创建视图显示每个类别的产品均价。
CREATEVIEW CategoryAvgPrice ASSELECT c.name, COALESCE(AVG(p.price), 0) AS avg_priceFROM categories cLEFTJOIN products p ON c.id = p.category_idGROUPBY c.name;-- 查询视图SELECT * FROM CategoryAvgPrice;
答案:
9. 查询每个产品的总销售额(价格 × 总订购数量)
SELECT p.name AS product_name, c.name AScategory, p.price * SUM(o.quantity) AS total_revenueFROM products pJOIN orders o ON p.id = o.product_idJOIN categories c ON p.category_id = c.idGROUPBY p.id, p.name, p.price, c.nameORDERBY total_revenue DESC;
预期结果(基于原始示例数据,未执行涨价前):
计算说明:
- Laptop: 1200.00 × (2 + 1) = 3600.00
- Headphones: 89.99 × 8 = 719.92
- T-Shirt: 25.50 × 25 = 637.50
10. 数据操作
题目:将所有电子类产品(Electronics)价格提高10%。
UPDATE productsSET price = price * 1.1WHERE category_id = (SELECTidFROM categories WHEREname = 'Electronics');-- 验证更新SELECT * FROM products WHERE category_id = 1;
答案: