# 数据库A卷答案 **Repository Path**: age18/database-answer ## Basic Information - **Project Name**: 数据库A卷答案 - **Description**: 数据库 - **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学期《数据库技术》期末试卷A 参考答案 ## 一、SQL补全题(每空1分,共20分) 1. CHARACTER SET 2. ENGINE = 3. NOW 4. USE 5. VERSION 6. VALUES 7. utf8 8. DESC 9. ZEROFILL 10. SOURCE 11. EXISTS 12. CURRENT_USER 13. CHARSET 14. ADD 15. DATABASE 16. DECIMAL 17. EXIT(或 QUIT) 18. MODIFY COLUMN 19. * 20. 程序 ## 二、SQL语法改错题(每题1.5分,共30分) 1. 修正语句:CREATE DATABASE my_db character set gbk; 原因:数据库名不能包含短横线(-),需用下划线(_)替代,符合MySQL命名规范。 2. 修正语句:CREATE TABLE student( id int(10), name varchar(50), age tinyint, regTime datetime )ENGINE=MYISAM DEFAULT CHARSET=utf8; 错误点:① name字段后缺少逗号(,);② 编码集关键字应为 DEFAULT CHARSET。 3. 修正语句:INSERT INTO student VALUES(001, '李四', 18); 错误点:① 整数类型id无需加双引号;② 中文逗号(,)需改为英文逗号(,)。 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. 修正语句:ALTER TABLE product ADD COLUMN price double(8,2) DEFAULT 0.00; 错误点:DEFAULT后需指定具体数值(0.00而非0),符合浮点型字段默认值规范。 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. 修正语句:SELECT DATABASE(); 错误点:DATABASE是函数,必须加括号(())才能执行。 10. 优化语句:CREATE TABLE comment( content TEXT ); 理由:VARCHAR(65535)冗余且效率低,TEXT类型专门用于存储长篇文本,适配评论场景。 11. 修正语句:CREATE TABLE goods(id int, name char(20)); 错误点:① 关键字CREATE需大写(规范);② 语句末尾缺少分号(;)。 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是关键字,需用反引号(`)包裹表名,避免语法冲突。 15. 修正语句:SELECT id, name, age FROM student; 错误点:SQL折行需保持字段逗号后换行,避免字段拆分导致语法不规范。 16. 优化语句:CREATE TABLE `order`( status TINYINT(1) DEFAULT 0 ); 理由:TINYINT(1)比int(1)更节省空间,且能充分利用类型特性(存储0/1状态)。 17. 修正语句:SET NAMES 'utf8'; 错误点:语句末尾缺少分号(;),SQL语句必须以分号结束。 18. 修正语句:CREATE TABLE user( gender CHAR(1) ); 错误点:性别仅1个字符,用CHAR(1)比VARCHAR(2)更高效、节省空间。 19. 修正语句:mysql -u root -p < D:\script.sql(或脚本文件绝对路径) 错误点:Wamp环境中需指定脚本文件绝对路径,否则无法找到文件。 20. 替换语句:TRUNCATE TABLE student; 理由:DELETE删除数据后自增主键不重置,且日志占用大;TRUNCATE高效删除全表数据,重置自增主键,适合清空表场景(开发推荐)。 ## 三、字段类型优化题(每空0.5分,共10分) 1. 优化后:CHAR(18);理由:身份证号是18位固定长度,CHAR(18)比VARCHAR(18)节省空间、查询效率更高。 2. 优化后:DECIMAL(10,2);理由:DECIMAL类型无精度丢失,适配价格(精确到分)场景,避免double的精度问题。 3. 优化后:TEXT;理由:VARCHAR(65535)冗余,TEXT专门存储长篇文本,适配5000字评论场景,更高效。 4. 优化后:BIGINT;理由:int最大存储约21亿,BIGINT支持超5亿的用户ID,避免数据溢出。 5. 优化后:TINYINT(1);理由:仅存储0/1两个值,TINYINT(1)比int(2)更节省空间,充分利用类型特性。 6. 优化后:VARCHAR(200);理由:文章标题长度不固定(10-200字),VARCHAR(200)按需占用空间,CHAR(200)会浪费空间。 7. 优化后:FLOAT(5,1);理由:气温对精度要求不高,FLOAT比DECIMAL存储效率更高,适配非精确小数场景。 8. 优化后:DATETIME;理由:date仅存储年月日,DATETIME包含年月日时分秒,满足订单创建时间的完整需求。 9. 优化后:VARCHAR(500);理由:地址长度不确定,VARCHAR(500)按需占用空间,CHAR(500)会造成大量空间浪费。 10. 优化后:INT(4);理由:库存数量0-1000,int(4)完全满足需求,比bigint更节省空间。 ## 四、SQL应用题(每题2分,共40分) 1. 查询所有书籍的name,author,和price,按price升序排序: SELECT name, author, price FROM book ORDER BY price ASC; 2. 给book表中price修改正确类型并追加合理约束: ALTER TABLE book MODIFY COLUMN price DECIMAL(10,2) NOT NULL DEFAULT 0.00; 3. 查询author为"罗贯中"或"周树人"且price小于1000的书籍: SELECT * FROM book WHERE (author = '罗贯中' OR author = '周树人') AND price < 1000; 4. 查询每个作者的书籍数量和价格总和,按价格总和降序排列: SELECT author, COUNT(*) AS book_count, SUM(price) AS total_price FROM book GROUP BY author ORDER BY total_price DESC; 5. 查询每个作者的书籍总数和总价格,只显示总数大于2且总价格大于1000的记录: SELECT author, COUNT(*) AS book_count, SUM(price) AS total_price FROM book GROUP BY author HAVING book_count > 2 AND total_price > 1000; 6. 查询所有书籍的name和price,按价格降序排序,返回前5条记录: SELECT name, price FROM book ORDER BY price DESC LIMIT 5; 7. 查询每个discount类型的书籍数量和平均价格,只显示数量大于1的记录: SELECT discount, COUNT(*) AS book_count, AVG(price) AS avg_price FROM book GROUP BY discount HAVING book_count > 1; 8. 查询author为"罗贯中"或周树人的书籍,按name升序排序,返回id和author: SELECT id, author FROM book WHERE author IN ('罗贯中', '周树人') ORDER BY name ASC; 9. 查询每个discount类型的书籍最大价格,按最大价格降序排列: SELECT discount, MAX(price) AS max_price FROM book GROUP BY discount ORDER BY max_price DESC; 10. 删除book表中date字段: ALTER TABLE book DROP COLUMN date; 11. 查询每个折扣类型的书籍总价格,仅显示总价格大于1000的折扣类型: SELECT discount, SUM(price) AS total_price FROM book GROUP BY discount HAVING total_price > 1000; 12. 查询价格在50到500之间且折扣为“是”的书籍名称: SELECT name FROM book WHERE price BETWEEN 50 AND 500 AND discount = '是'; 13. 上调《鬼吹灯》的价格20块: UPDATE book SET price = price + 20 WHERE name = '鬼吹灯'; 14. 查询价格在100到500之间的书籍,按照价格升序排序: SELECT * FROM book WHERE price BETWEEN 100 AND 500 ORDER BY price ASC; 15. 给book表中number字段添加合理默认值: ALTER TABLE book MODIFY COLUMN number INT(2) DEFAULT 0; 16. 查询书名是四个字的记录: SELECT * FROM book WHERE LENGTH(name) = 4; 17. 按书名和价格复合排序,查询书籍名称和价格: SELECT name, price FROM book ORDER BY name ASC, price DESC; 18. 查询价格为69或3的书籍名称和价格: SELECT name, price FROM book WHERE price IN (3, 69); 19. 查询价格大于1000且discount为“是”的书籍数量: SELECT COUNT(*) AS book_count FROM book WHERE price > 1000 AND discount = '是'; 20. 按出版日期统计书籍总数并分类: SELECT date AS publish_date, COUNT(*) AS book_count, CASE WHEN COUNT(*) > 100 THEN '畅销' WHEN COUNT(*) BETWEEN 50 AND 100 THEN '普通' ELSE '冷门' END AS sales_type FROM book GROUP BY date; ---------------------------------------------------------------------------------------------------