内容正文:
编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》第59练,内容是修改数据。
《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》 第59练
修改数据
一、单项选择题
1. 下列有关MySQL中UPDATE语句的说法中,正确的是( )。
A. UPDATE语句属于DDL,用于修改表结构
B. 执行UPDATE语句时,如果没有指定WHERE子句,系统会自动提示错误并要求补充条件
C. UPDATE语句可以同时修改一个表中的多个字段,多个字段赋值之间使用逗号分隔
D. UPDATE语句在SET子句中只能使用常量进行赋值,不允许使用字段运算或函数计算
【答案】C
【解析】
A错误:UPDATE属于DML(数据操纵语言),而非DDL。DDL负责定义数据结构(CREATE、ALTER、DROP等),DML负责操作数据(INSERT、UPDATE、DELETE、SELECT)。
B错误:在MySQL中,执行不带WHERE子句的UPDATE语句不会提示错误,而是会直接更新表中的所有记录——这是一个常见的风险点,因此一般强烈建议在UPDATE语句中加WHERE条件。
C正确:UPDATE语句支持同时修改多字段,SET子句中各字段赋值之间使用逗号分隔。基本语法为UPDATE 表名 SET 字段1 = 新值1, 字段2 = 新值2, ... [WHERE 条件]。
D错误:UPDATE语句的SET子句中,新值不仅可以由常量给出,也可以是表达式、字段运算或函数调用,如SET score = score + 10即为典型的字段自增运算。
2.现有商品表 product(pid, pname, price, stock),其中pid为主键。执行以下SQL语句后,关于该语句的执行结果,说法正确的是( )。
UPDATE product SET price = price * 1.2;
A. 该语句因缺少WHERE子句而执行失败
B. 该语句只更新第一条记录的price字段
C. 该语句将表中所有商品的price字段值在原价基础上上涨20%
D. 该语句将更新表中所有的字段,包括主键字段
【答案】C
【解析】
A错误:不带WHERE子句的UPDATE语句在MySQL中可以正常执行,不会因缺少WHERE条件而报错。但这样操作会更新表中的全部记录,实际开发中应当避免。
B错误:不带WHERE子句时更新的是所有记录,而非只更新单条记录。若要指定单条记录,应加WHERE条件(如WHERE pid = 某值)。
C正确:该语句使用price = price * 1.2的表达式,将表中所有商品的price字段修改为原值的1.2倍,实现了批量价格调整。字段可以用自身的值参与运算来表达相对变化。
D错误:UPDATE语句只更新SET子句中明确列出的字段,未列出的字段保持不变,主键字段也未列入SET子句,因此不会被更新。
3.下列关于MySQL多表更新的描述中,正确的是( )。
A. 使用JOIN关联的多表更新中,只能更新JOIN右侧的那张表
B. 一条多表UPDATE语句最多只能更新一张表,JOIN仅用于提供更新条件
C. 一条UPDATE语句可以使用JOIN语法同时更新多张表中的数据
D. 多表更新时,MySQL会锁定所有涉及的表,并且禁止在更新过程中使用子查询
【答案】C
【解析】
A错误:多表更新允许更新JOIN左侧的关联表,结合JOIN带来的额外数据进行赋值操作。多表更新时位于UPDATE关键字后第一位的表为待更新的主表。
B错误且C正确:MySQL支持使用多表更新语法(multiple-table UPDATE),通过JOIN连接多张表,并在SET子句中指定各表的字段,实现一条语句同时更新多张表中的数据。
D错误:多表更新中可以存在关联子查询,某些复杂业务场景可能需要在UPDATE语句的SET或WHERE部分内嵌入子查询来计算目标值。此外,MySQL在处理更新时会加锁以确保数据一致性。
4.有标准的学生表结构以及执行操作如下:在student表(学生表)中有student_id(学号,主键),name(学生姓名),score(成绩)等字段。现发现李华的语文成绩未统计,需将所有语文成绩低于60分的同学加分。执行以下语句后,关于最终仅有李华一人语文成绩不足60分得到加分的情况,说法正确的是( )。
UPDATE student SET score = score + 5 WHERE score < 60;
A. 该语句会将所有学生成绩在当前基础上加上5分
B. 该语句只能将李华一人的score增加5分,但条件筛选依赖于“语文科目”,而本表并无考试科目字段
C. 该语句无法完成,因为更新条件中不该使用算术运算符
D. 该语句因成绩更新时参与算术运算,若李华成绩原本小于60,将会增加5分
【答案】B
5.有“雇员”表(emp)和“部门”表(dept)如下:dept(dept_id, avg_salary), emp(emp_id, emp_name, salary, dept_id)。现要将工资低于部门平均工资的雇员工资上浮5%。请问以下哪段SQL语句能正确实现上述功能?( )
A.
UPDATE emp SET salary = salary * 1.05
WHERE salary < (SELECT AVG(salary) FROM emp);
B.
UPDATE emp INNER JOIN dept ON emp.dept_id = dept.dept_id
SET salary = salary * 1.05
WHERE salary < dept.avg_salary;
C.
UPDATE emp SET salary = salary * 1.05
WHERE salary < (SELECT AVG(salary) FROM emp GROUP BY dept_id);
D.
UPDATE emp SET salary = salary * 1.05
WHERE dept_id IN (SELECT dept_id FROM dept WHERE avg_salary > salary);
【答案】B
【解析】
A错误:子查询SELECT AVG(salary) FROM emp计算的是全公司的平均工资,而非部门平均工资,与“低于所在部门平均工资”的需求不符。
B正确:通过INNER JOIN将emp表与dept表按部门编号关联,以dept表中的部门平均工资字段作为比较基准,筛选出salary < dept.avg_salary的员工并对其工资上浮5%。
C错误:子查询中使用了GROUP BY,但AVG(salary)搭配GROUP BY dept_id会返回多行结果,在标量比较场景中出现子查询返回多行将引发错误。如使用关联子查询(需将外层emp表通过dept_id传入内层)才可实现分部门平均值获取。
D错误:WHERE dept_id IN (SELECT dept_id FROM dept WHERE avg_salary > salary)虽试图筛选部门平均工资高于该员工个人工资的员工,但子查询中的salary引用存在作用域歧义,且过滤逻辑反向。更重要的是,这条语句只能筛选出员工,但还需通过关联获取对应部门平均工资用于条件比较,实际上并未建立员工与部门的正确交互。
6.某学校的教务系统中有学生表student(stu_id, stu_name, age, class_id)和所选课程表sc(stu_id, course_id, grade)。现需要将“王红”(stu_name唯一)所选的全部课程的成绩在原有基础上增加10分。下列选项中能正确实现该功能的SQL语句是( )。
A.
UPDATE sc SET grade = grade + 10
WHERE stu_id = (SELECT stu_id FROM student WHERE stu_name = '王红');
B.
UPDATE sc SET grade = grade + 10
WHERE stu_id IN (SELECT stu_id FROM student WHERE stu_name = '王红');
C.
UPDATE student s, sc c SET c.grade = c.grade + 10
WHERE s.stu_id = c.stu_id AND s.stu_name = '王红';
D. 以上选项都正确
【答案】D
【解析】
选项A正确:stu_name = '王红'在学生表中此字段唯一标识一名学生时,通过=标量子查询确定单个stu_id,准确更新该学生在sc表中的成绩,多门课程因条件中stu_id匹配而全部更新。
选项B正确:使用IN子查询也可获取stu_id的集合。虽然子查询返回单行数据,=与IN语法均可兼容更新,作用是等效的。
选项C正确:采用多表更新语法。将student表与sc表通过stu_id关联,筛选student.stu_name = '王红'后,更新sc表中grade字段,同样正确。
既然A、B、C三个选项都能正确实现功能,则D“以上选项都正确”为最终正确选项,指向A、B、C均为有效解法的判断。
7.在MySQL的默认REPEATABLE READ隔离级别下,关于对同一张表并发执行UPDATE操作的描述,正确的是( )。
A. 两个事务同时执行UPDATE时,后执行的事务必须等待先执行的事务提交后才能运行
B. 如果一个事务更新某个主键条件的行时使用了SELECT … FOR UPDATE锁定,另一个事务无法读取该行数据
C. UPDATE语句在InnoDB存储引擎中采用行级锁,会锁住满足WHERE条件的所有索引范围
D. 执行不带WHERE条件的高频并发UPDATE语句时,不同事务之间无额外开销,并发性能很高
【答案】C
【解析】
A错误:MySQL的InnoDB存储引擎默认采用行级锁。两个事务同时更新表中互不冲突的行时,无须等待对方提交。
B错误:MySQL默认隔离级别为REPEATABLE READ时,普通SELECT语句是非阻塞的快照读,不会被FOR UPDATE(当前读)锁阻挡。
C正确:对于条件查找范围下的UPDATE,InnoDB会根据WHERE条件中的索引情况锁定相应的范围——包括命中的索引项及其间的间隙(间隙锁机制)。
D错误:UPDATE不带WHERE条件会触发表级锁扫描,或对所有行获取行锁,并发开销极大。语句不加索引条件或完全无WHERE,可能导致串行化执行,严重降低并发性能。
8.在MySQL中,执行REPLACE INTO语句时,当新插入的记录与表中现有记录出现主键或唯一索引冲突时,其内部的实现方式是( )。
A. 直接报错并终止插入
B. 忽略冲突部分,仅插入无冲突的记录
C. 先删除原有冲突记录,再插入新记录
D. 保持原记录不变,只更新冲突字段
【答案】C
【解析】
A错误:REPLACE INTO在发生主键或唯一索引冲突时不会报错,而是执行特殊的覆盖替换操作。
B错误:该行为属于INSERT IGNORE语句的功能,即忽略冲突记录继续插入下一条,而非REPLACE的行为。
C正确:REPLACE INTO的执行逻辑是检测到主键或唯一索引冲突时,先删除原有冲突行,再插入新行,据此更新记录。
D错误:该行为属于INSERT … ON DUPLICATE KEY UPDATE的功能:仅在冲突时执行更新操作,保留符合约束的多字段旧值。
9.关于MySQL的INSERT … ON DUPLICATE KEY UPDATE语句,当插入的记录在表中因唯一索引发生重复时,以下说法正确的是( )。
A. 执行该语句时若发生冲突,会对整张表加表锁
B. 该语句实际上等价于REPLACE INTO语句
C. 该语句在发生冲突时执行更新,不会删除原有记录
D. 该语句在发生冲突时先删除原有记录,再插入新记录
【答案】C
【解析】
A错误:INSERT … ON DUPLICATE KEY UPDATE在键冲突时仅会锁定必要索引行,不会升级为表锁,不同行间的冲突完全相互独立。
B错误:二者不等价。REPLACE INTO执行先删除后写入;INSERT … ON DUPLICATE KEY UPDATE只是在原记录上执行UPDATE,其他字段的旧值被保留,再覆盖传入的字段新值。
C正确且D错误:DUPLICATE冲突场景下,该语句只会执行UPDATE操作来处理重复键问题,保留原有字段并根据SET子句更新指定字段数据,不会删除整条记录。ON DUPLICATE KEY UPDATE的执行效率更高,避免了DELETE再INSERT的额外开销。
10.在学生管理系统数据库上,执行了以下SQL语句序列:
START TRANSACTION;
UPDATE student SET score = score - 5 WHERE class_id = 101;
UPDATE student SET score = score - 2 WHERE class_id = 101 AND score < 80;
ROLLBACK;
若执行前class_id = 101的所有学生score分布在75到95之间。关于执行后的结果,以下说法正确的是( )。
A. 所有班级101的学生score均减少7分
B. 所有班级101的学生score均减少5分
C. 所有班级101的学生score均减少2分
D. 所有班级101的学生score与执行前完全相同
【答案】D
【解析】
A、B、C均错误:因为整个事务以ROLLBACK结束,ROLLBACK会撤销该事务内执行的所有数据修改操作,将数据库恢复到BEGIN之前的状态。
D正确:事务原子性保证所有更新要么全部成功提交,要么全部撤销回滚。这里的ROLLBACK将两个UPDATE的操作全部撤销,因此score最终与执行前完全相同。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》第59练,内容是修改数据。
《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》 第59练
修改数据
一、单项选择题
1. 下列有关MySQL中UPDATE语句的说法中,正确的是( )。
A. UPDATE语句属于DDL,用于修改表结构
B. 执行UPDATE语句时,如果没有指定WHERE子句,系统会自动提示错误并要求补充条件
C. UPDATE语句可以同时修改一个表中的多个字段,多个字段赋值之间使用逗号分隔
D. UPDATE语句在SET子句中只能使用常量进行赋值,不允许使用字段运算或函数计算
2.现有商品表 product(pid, pname, price, stock),其中pid为主键。执行以下SQL语句后,关于该语句的执行结果,说法正确的是( )。
UPDATE product SET price = price * 1.2;
A. 该语句因缺少WHERE子句而执行失败
B. 该语句只更新第一条记录的price字段
C. 该语句将表中所有商品的price字段值在原价基础上上涨20%
D. 该语句将更新表中所有的字段,包括主键字段
3.下列关于MySQL多表更新的描述中,正确的是( )。
A. 使用JOIN关联的多表更新中,只能更新JOIN右侧的那张表
B. 一条多表UPDATE语句最多只能更新一张表,JOIN仅用于提供更新条件
C. 一条UPDATE语句可以使用JOIN语法同时更新多张表中的数据
D. 多表更新时,MySQL会锁定所有涉及的表,并且禁止在更新过程中使用子查询
4.有标准的学生表结构以及执行操作如下:在student表(学生表)中有student_id(学号,主键),name(学生姓名),score(成绩)等字段。现发现李华的语文成绩未统计,需将所有语文成绩低于60分的同学加分。执行以下语句后,关于最终仅有李华一人语文成绩不足60分得到加分的情况,说法正确的是( )。
UPDATE student SET score = score + 5 WHERE score < 60;
A. 该语句会将所有学生成绩在当前基础上加上5分
B. 该语句只能将李华一人的score增加5分,但条件筛选依赖于“语文科目”,而本表并无考试科目字段
C. 该语句无法完成,因为更新条件中不该使用算术运算符
D. 该语句因成绩更新时参与算术运算,若李华成绩原本小于60,将会增加5分
5.有“雇员”表(emp)和“部门”表(dept)如下:dept(dept_id, avg_salary), emp(emp_id, emp_name, salary, dept_id)。现要将工资低于部门平均工资的雇员工资上浮5%。请问以下哪段SQL语句能正确实现上述功能?( )
A.
UPDATE emp SET salary = salary * 1.05
WHERE salary < (SELECT AVG(salary) FROM emp);
B.
UPDATE emp INNER JOIN dept ON emp.dept_id = dept.dept_id
SET salary = salary * 1.05
WHERE salary < dept.avg_salary;
C.
UPDATE emp SET salary = salary * 1.05
WHERE salary < (SELECT AVG(salary) FROM emp GROUP BY dept_id);
D.
UPDATE emp SET salary = salary * 1.05
WHERE dept_id IN (SELECT dept_id FROM dept WHERE avg_salary > salary);
6.某学校的教务系统中有学生表student(stu_id, stu_name, age, class_id)和所选课程表sc(stu_id, course_id, grade)。现需要将“王红”(stu_name唯一)所选的全部课程的成绩在原有基础上增加10分。下列选项中能正确实现该功能的SQL语句是( )。
A.
UPDATE sc SET grade = grade + 10
WHERE stu_id = (SELECT stu_id FROM student WHERE stu_name = '王红');
B.
UPDATE sc SET grade = grade + 10
WHERE stu_id IN (SELECT stu_id FROM student WHERE stu_name = '王红');
C.
UPDATE student s, sc c SET c.grade = c.grade + 10
WHERE s.stu_id = c.stu_id AND s.stu_name = '王红';
D. 以上选项都正确
7.在MySQL的默认REPEATABLE READ隔离级别下,关于对同一张表并发执行UPDATE操作的描述,正确的是( )。
A. 两个事务同时执行UPDATE时,后执行的事务必须等待先执行的事务提交后才能运行
B. 如果一个事务更新某个主键条件的行时使用了SELECT … FOR UPDATE锁定,另一个事务无法读取该行数据
C. UPDATE语句在InnoDB存储引擎中采用行级锁,会锁住满足WHERE条件的所有索引范围
D. 执行不带WHERE条件的高频并发UPDATE语句时,不同事务之间无额外开销,并发性能很高
8.在MySQL中,执行REPLACE INTO语句时,当新插入的记录与表中现有记录出现主键或唯一索引冲突时,其内部的实现方式是( )。
A. 直接报错并终止插入
B. 忽略冲突部分,仅插入无冲突的记录
C. 先删除原有冲突记录,再插入新记录
D. 保持原记录不变,只更新冲突字段
9.关于MySQL的INSERT … ON DUPLICATE KEY UPDATE语句,当插入的记录在表中因唯一索引发生重复时,以下说法正确的是( )。
A. 执行该语句时若发生冲突,会对整张表加表锁
B. 该语句实际上等价于REPLACE INTO语句
C. 该语句在发生冲突时执行更新,不会删除原有记录
D. 该语句在发生冲突时先删除原有记录,再插入新记录
10.在学生管理系统数据库上,执行了以下SQL语句序列:
START TRANSACTION;
UPDATE student SET score = score - 5 WHERE class_id = 101;
UPDATE student SET score = score - 2 WHERE class_id = 101 AND score < 80;
ROLLBACK;
若执行前class_id = 101的所有学生score分布在75到95之间。关于执行后的结果,以下说法正确的是( )。
A. 所有班级101的学生score均减少7分
B. 所有班级101的学生score均减少5分
C. 所有班级101的学生score均减少2分
D. 所有班级101的学生score与执行前完全相同
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$