# 数据库答案B卷 **Repository Path**: age18/database-answer---volume-b ## Basic Information - **Project Name**: 数据库答案B卷 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-06 - **Last Updated**: 2026-01-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2025—2026学年第3学期《数据库技术》期末试卷B 参考答案 ## 一、SQL补全题(每空1分,共20分) 1. 数据 2. DECIMAL 3. EXIT(或 \q)(或 \quit) 4. ADD 5. ZEROFILL 6. NAMES 7. NOW 8. CHARSET 9. 3306 10. ENGINE = 11. USE 12. EXISTS 13. ZEROFILL 14. CURRENT_USER 15. VALUES 16. DESC 17. SOURCE 18. EXISTS 19. LIKE 20. IS NOT ## 二、SQL语法改错题(每题1.5分,共30分) 1. 修正语句:INSERT INTO student VALUES(001, '李四', 18); 错误点:① 整数类型id无需加双引号;② 中文逗号(,)需改为英文逗号(,)。 2. 替换语句:TRUNCATE TABLE student; 理由:DELETE删除数据后自增主键不重置,日志占用大;TRUNCATE高效删除全表数据,重置自增主键,开发中更推荐。 3. 修正语句:CREATE DATABASE my_db character set gbk; 原因:数据库名不能包含短横线(-),需用下划线(_)替代,符合MySQL命名规范。 4. 修正语句:SET NAMES gbk; SELECT id, name FROM student WHERE name = '张三'; 错误点:① 中文乱码需先设置编码集为gbk;② WHERE关键字大小写规范(建议大写)。 5. 修正语句:CREATE TABLE user( phone CHAR(11) ); 错误点:手机号为11位固定长度,CHAR(11)比VARCHAR(20)更节省空间、查询效率更高。 6. 修正语句:SELECT DATABASE(); 错误点:DATABASE是函数,必须加括号(())才能执行。 7. 修正语句:mysql -u root -p 错误点:默认无密码时,无需在-p后加密码,输入命令后直接回车即可登录。 8. 修正语句:CREATE TABLE `order`( total decimal(10,2) )ENGINE=INNODB DEFAULT CHARSET=gbk; 错误点:① order是MySQL关键字,需用反引号(`)包裹;② ENGINE后缺少等号(=);③ 编码集关键字应为 DEFAULT CHARSET。 9. 修正语句:ALTER TABLE product ADD COLUMN price double(8,2) DEFAULT 0.00; 错误点:DEFAULT后需指定具体浮点数值(0.00而非0),符合字段类型规范。 10. 优化语句:CREATE TABLE comment( content TEXT ); 理由:VARCHAR(65535)冗余且存储效率低,TEXT类型专门适配长篇文本存储场景,更合理。 11. 修正语句:SET NAMES 'utf8'; 错误点:① 编码集关键字为utf8(无短横线);② 语句末尾缺少分号(;)。 12. 修正语句:ALTER TABLE user MODIFY COLUMN gender TINYINT(1); 错误点:MySQL中boolean本质是TINYINT(1)的别名,直接使用TINYINT(1)更规范,避免兼容性问题。 13. 修正语句:CREATE TABLE account( balance DECIMAL(12,2) ); 理由:double类型存在精度丢失风险,银行存款余额需精确存储,DECIMAL类型无精度损失,适配金融场景。 14. 修正语句:CREATE TABLE `order`(id int, num int); 错误点:order是MySQL关键字,需用反引号(`)包裹表名,避免语法冲突。 15. 修正语句:SELECT id, name, age FROM student; 错误点:SQL折行需保持字段连贯性,避免字段拆分在不同行导致格式不规范。 16. 优化语句:CREATE TABLE `order`( status TINYINT(1) DEFAULT 0 ); 理由:TINYINT(1)比int(1)更节省存储空间,且能充分适配0/1状态存储需求。 17. 修正语句:CREATE TABLE goods(id int, name char(20)); 错误点:① 关键字CREATE需大写(语法规范);② 语句末尾缺少分号(;)。 18. 修正语句:CREATE TABLE user( gender CHAR(1) ); 错误点:性别仅1个字符,CHAR(1)比VARCHAR(2)更高效、节省空间。 19. 修正语句:mysql -u root -p < D:\script.sql(或脚本文件绝对路径) 错误点:Wamp环境中需指定脚本文件绝对路径,否则无法识别文件位置。 20. 修正语句:CREATE TABLE student( id int(10), name varchar(50), age tinyint, regTime datetime )ENGINE=MYISAM DEFAULT CHARSET=utf8; 错误点:① name字段后缺少英文逗号(,);② 编码集关键字应为 DEFAULT CHARSET。 ## 三、字段类型优化题(每空0.5分,共10分) 1. 优化后:INT(4);理由:库存数量0-1000,INT(4)完全满足需求,比bigint更节省存储空间。 2. 优化后:DECIMAL(10,2);理由:DECIMAL类型无精度丢失,适配价格(精确到分)场景,避免double的精度问题。 3. 优化后:TEXT;理由:VARCHAR(65535)冗余,TEXT专门存储长篇文本,适配5000字评论场景,存储效率更高。 4. 优化后:VARCHAR(500);理由:地址长度不确定,VARCHAR(500)按需占用空间,CHAR(500)会造成大量空间浪费。 5. 优化后:BIGINT;理由:int最大存储约21亿,BIGINT支持超5亿的用户ID,避免数据溢出。 6. 优化后:VARCHAR(200);理由:文章标题长度不固定(10-200字),VARCHAR(200)按需分配空间,比CHAR(200)更合理。 7. 优化后:FLOAT(5,1);理由:气温对精度要求不高,FLOAT比DECIMAL存储效率更高,适配非精确小数场景。 8. 优化后:TINYINT(1);理由:仅存储0/1两个值,TINYINT(1)比int(2)更节省空间,充分利用类型特性。 9. 优化后:DATETIME;理由:date仅存储年月日,DATETIME包含年月日时分秒,满足订单创建时间的完整记录需求。 10. 优化后:CHAR(18);理由:身份证号是18位固定长度,CHAR(18)比VARCHAR(18)查询效率更高、更节省空间。 ## 四、SQL应用题(每题2分,共40分) 1. 查询number大于50且价格大于1000的书籍,按number降序排列: SELECT * FROM book WHERE number > 50 AND price > 1000 ORDER BY number DESC; 2. 查询所有书籍的name,author,和price,按price升序排序: SELECT name, author, price FROM book ORDER BY price ASC; 3. 查询每个discount类型的书籍的最大价格,按最大价格降序排列: SELECT discount, MAX(price) AS max_price FROM book GROUP BY discount ORDER BY max_price DESC; 4. 查询price在100到500之间的所有书籍: SELECT * FROM book WHERE price BETWEEN 100 AND 500; 5. 查询所有价格大于500的书籍的name,并按价格升序排列: SELECT name FROM book WHERE price > 500 ORDER BY price ASC; 6. 查询price大于500的书籍的平均价格: SELECT AVG(price) AS avg_price FROM book WHERE price > 500; 7. 上调鬼吹灯的价格20块(两种方式): -- 精确匹配(按书名精确查询) UPDATE book SET price = price + 20 WHERE name = '鬼吹灯'; -- 模糊匹配(按书名包含关键字查询) UPDATE book SET price = price + 20 WHERE name LIKE '%鬼吹灯%'; 8. 查询每个discount类型的书籍数量和价格总和,按书籍数量升序排列: SELECT discount, COUNT(*) AS book_count, SUM(price) AS total_price FROM book GROUP BY discount ORDER BY book_count ASC; 9. 查询author为"罗贯中"且price大于100的书籍: SELECT * FROM book WHERE author = '罗贯中' AND price > 100; 10. 查询每个discount类型的书籍的最大价格: SELECT discount, MAX(price) AS max_price FROM book GROUP BY discount; 11. 查询每个作者的书籍数量,且书籍价格大于100: SELECT author, COUNT(*) AS book_count FROM book WHERE price > 100 GROUP BY author; 12. 查询number大于50且价格大于1000的书籍,按number降序排列,且返回前3条记录: SELECT * FROM book WHERE number > 50 AND price > 1000 ORDER BY number DESC LIMIT 3; 13. 查询价格最高的前3本书籍的name和price: SELECT name, price FROM book ORDER BY price DESC LIMIT 3; 14. 查询discount为"是"的书籍,并检查是否存在相关的author: SELECT name, author FROM book WHERE discount = '是' AND author IS NOT NULL; 15. 查询不打折的书籍并且书名必须三个字: SELECT * FROM book WHERE discount = '否' AND LENGTH(name) = 3; 16. 查询所有书籍名称和价格,按书名和价格的复合排序: SELECT name, price FROM book ORDER BY name ASC, price DESC; 17. 查询书籍名称为“狂人日记”或“鬼吹灯”的所有书籍: SELECT * FROM book WHERE name IN ('狂人日记', '鬼吹灯'); 18. 查询每个折扣类型的书籍平均价格,按平均价格升序排列,并且只查询书籍数大于2的记录: SELECT discount, AVG(price) AS avg_price FROM book GROUP BY discount HAVING COUNT(*) > 2 ORDER BY avg_price ASC; 19. 查询折扣为“是”的所有书籍,并且价格大于100的书籍: SELECT * FROM book WHERE discount = '是' AND price > 100; 20. 根据折扣类型计算每个作者的书籍总金额: SELECT author, CASE WHEN discount = '是' THEN '有折扣' WHEN discount = '否' THEN '无折扣' END AS discount_type, SUM(price * number) AS total_amount FROM book GROUP BY author, discount;