内容正文:
编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》第60练,内容是删除数据。
《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》 第60练
删除数据
一、单项选择题
1. 关于MySQL中DELETE语句的说法,下列选项中正确的是( )。
A. DELETE语句属于DDL,用于删除整个表的结构
B. 执行DELETE语句时,若省略WHERE子句,系统会报错并拒绝执行
C. DELETE语句可以删除表中的部分行,也可以一次删除所有行
D. DELETE语句执行后,被删除的数据可以通过ROLLBACK命令恢复到任意历史状态
【答案】C
【解析】
A错误:DELETE属于DML(数据操纵语言),用于删除表中的数据行。DROP TABLE属于DDL,用于删除表结构。
B错误:在MySQL中,不带WHERE子句的DELETE语句可以执行(除非开启了SQL_SAFE_UPDATES模式且无主键条件),它会删除表中的所有行,但不会报错——这是常见的危险操作。
C正确:DELETE通过WHERE子句指定删除条件可实现部分删除;省略WHERE则为全表删除,删除所有行但保留表结构。
D错误:DELETE操作在事务中(InnoDB)可以通过ROLLBACK撤销,但前提是事务未提交;一旦COMMIT,数据即永久删除。并且无法恢复到“任意历史状态”,只依据事务日志回滚。
2.有学生表student(id INT PRIMARY KEY, name VARCHAR(20), age INT, class_id INT),执行以下语句:
DELETE FROM student WHERE age < 18;
若表中存在多行age < 18的记录,关于该语句执行结果的描述,正确的是( )。
A. 仅删除第一条满足条件的记录
B. 删除所有age < 18的记录,并自动重置AUTO_INCREMENT计数器
C. 删除所有age < 18的记录,但不会重置AUTO_INCREMENT计数器
D. 因为缺少ORDER BY语句,该语句会执行失败
【答案】C
【解析】
A错误:DELETE不带LIMIT会删除所有满足WHERE条件的行,而不是只删除一条。
B错误:DELETE不会重置AUTO_INCREMENT计数器。即使删除表中所有行,下次插入新记录时,自增值仍在上次最大自增值基础上继续增加。
C正确:DELETE按条件删除对应行,不重置自增计数器。
D错误:DELETE语句不需要ORDER BY子句即可正常执行。
3.下列关于TRUNCATE TABLE与DELETE FROM(无WHERE子句)的区别,说法错误的是( )。
A. TRUNCATE TABLE是DDL操作,而DELETE FROM是DML操作
B. TRUNCATE TABLE会重置AUTO_INCREMENT计数器,而DELETE FROM不会
C. TRUNCATE TABLE不支持WHERE条件,而DELETE FROM支持
D. TRUNCATE TABLE执行后无法通过事务回滚恢复数据,而DELETE FROM无论在任何情况下都可以回滚
【答案】D
【解析】
A正确:TRUNCATE属于DDL,隐式提交事务无法回滚;DELETE属于DML,可在事务中回滚。
B正确:TRUNCATE会重置自增计数器从1开始;DELETE不会重置。
C正确:TRUNCATE清空整表,不可加WHERE;DELETE可以加条件筛选。
D错误:如果DELETE在事务中执行且尚未提交,可以通过ROLLBACK恢复;但如果已经COMMIT,则也无法回滚。同时,DELETE在自动提交模式下默认每条语句提交,也不能回滚。
4.设有部门表dept(dept_id INT PRIMARY KEY, name VARCHAR(20))和员工表emp(emp_id INT PRIMARY KEY, name VARCHAR(20), dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(dept_id) ON DELETE RESTRICT)。现有以下操作:
DELETE FROM dept WHERE dept_id = 101;
假设dept_id = 101的部门下存在多名员工。关于该语句的执行结果,正确的是( )。
A. 删除部门表dept中dept_id=101的行,同时自动级联删除该部门下所有员工
B. 删除部门表dept中dept_id=101的行,同时将该部门下所有员工的dept_id设置为NULL
C. 执行失败,因为子表中有引用记录,违反了RESTRICT约束
D. 删除部门表dept中dept_id=101的行,同时将该部门下所有员工的dept_id设置为默认值0
【答案】C
【解析】
A错误:级联删除对应ON DELETE CASCADE,题干中是RESTRICT。
B错误:自动设NULL对应ON DELETE SET NULL。
C正确:ON DELETE RESTRICT(MySQL中默认行为)会阻止删除父表中被子表引用的行,以确保引用完整性,因此语句执行失败并报错。
D错误:设定默认值对应ON DELETE SET DEFAULT,且不是标准默认行为。
5.在MySQL中,执行下列语句序列(假设InnoDB存储引擎,自动提交关闭):
START TRANSACTION;
DELETE FROM orders WHERE order_id = 1001;
此时,另一会话执行以下查询:
SELECT * FROM orders WHERE order_id = 1001;
关于第二个会话查询结果的描述,正确的是( )。
A. 返回order_id=1001的行数据
B. 无返回行
C. 第二个会话被阻塞,直到第一个事务提交或回滚
D. 返回错误ORA-00054:资源忙
【答案】A
【解析】
在InnoDB的默认隔离级别REPEATABLE READ下,普通SELECT语句是非阻塞的快照读,读取的是事务开始时的数据快照。
A正确:第一个事务中执行了DELETE但未提交,第二个会话的SELECT读取的是该行删除前的版本。
B错误:未提交的删除对其他事务不可见,因此第二个会话仍能看到该行。
C错误:普通SELECT不会因为行被加锁而阻塞。本题为普通SELECT,读快照,不会被阻塞。
D错误:ORA-00054是Oracle的错误号,不适用于MySQL。
6.某MySQL数据库中,表student含有大量数据,需要清空表中所有行,并且要求立即释放数据文件占用的磁盘空间。下列两种操作方式中,效果上符合要求且风险较低的是( )。
A. DELETE FROM student; 然后 OPTIMIZE TABLE student;
B. TRUNCATE TABLE student;
C. DROP TABLE student; 然后 CREATE TABLE student ...;
D. 不需要任何操作,MySQL会自动释放空间
【答案】B
【解析】
A方式:DELETE全表不会立即释放磁盘空间,仅将行标记为删除,需再运行OPTIMIZE TABLE重建表才能释放空间,且大量删除会产生大量undo日志,速度慢、风险高。
B正确:TRUNCATE TABLE是DDL操作,直接释放表的数据页,将磁盘空间归还操作系统,且速度极快,日志开销小。
C方式:DROP+CREATE也可释放空间,但需要重新定义表结构,若字段、约束较多,操作复杂且易出错,不如TRUNCATE简洁。
D错误:MySQL不会自动释放DELETE后占用的空间;Truncate才立即释放。
7.有商品表product(pid, pname, price, cid),以及类别表category(cid, cname)。现要删除“所有销售类别为‘电子产品’的商品记录”。下列SQL语句中,能正确实现该功能的是( )。
A.
DELETE FROM product
WHERE cid = (SELECT cid FROM category WHERE cname = '电子产品');
B.
DELETE FROM product
WHERE cid IN (SELECT cid FROM category WHERE cname = '电子产品');
C.
DELETE p FROM product p INNER JOIN category c ON p.cid = c.cid
WHERE c.cname = '电子产品';
D. 以上选项都正确
【答案】D
【解析】
选项A:如果cname='电子产品'对应的cid唯一,使用=子查询可以正确删除;若cid可能不唯一,但通常类别名称应唯一,该写法可行。
选项B:使用IN更稳妥,即使返回多个cid也适用,能删除所有对应产品。
选项C:多表DELETE语法(使用JOIN),关联category表筛选后删除product表的记录,功能正确。
因为A、B、C在一般场景(cid唯一)下均可正确执行,且题干没有排除任意一种方式,所以D“以上选项都正确”是本题的最佳答案。
注意:实际使用中,若子查询返回多行,A会报错,B和C安全。但考虑到命题通常限定cname唯一,三者均可视为正确。
8.在MySQL中,执行以下语句时:
DELETE FROM scores WHERE score_id = 5 ORDER BY score_id LIMIT 3;
关于该语句的说法,正确的是( )。
A. 语法错误,DELETE语句中不能使用ORDER BY和LIMIT
B. 删除表中score_id = 5的所有记录
C. 删除表中满足score_id = 5的记录,并按照score_id排序后删除前3行
D. 因为score_id是主键或唯一索引,无重复值,LIMIT 3作用无意义,但语句仍合法
【答案】D
【解析】
A错误:MySQL的DELETE语句确实支持ORDER BY和LIMIT子句,用于控制删除顺序和限制删除行数。
B、C不准确:WHERE score_id = 5仅筛选出score_id=5的行,LIMIT 3不会出错但也没有额外效果。
D正确:该语句语法合法,即使LIMIT大于符合条件的行数,也是安全的。虽然逻辑上冗余,但MySQL不会报错。
9.下列哪种情况下,DELETE语句在MySQL中会因为“安全更新模式”而拒绝执行?
A. 使用了ORDER BY子句但没有使用LIMIT
B. WHERE条件中使用了索引列,但该列存在NULL值
C. 执行DELETE语句时,WHERE条件中未使用索引键且未指定LIMIT,同时开启了sql_safe_updates=1
D. 删除的数据行数超过1000行
【答案】C
【解析】
A错误:ORDER BY单独使用并不触发安全模式拦截;拦截条件是同时WHERE无索引列且无LIMIT。
B错误:索引列为NULL不影响安全模式判定。
C正确:当sql_safe_updates=1(安全模式)时,DELETE语句要求要么WHERE条件中使用索引列,要么带LIMIT,否则拒绝执行,以防止误删全表。
D错误:安全模式与删除行数无关。
10.关于多表DELETE语句在MySQL中的行为,下列说法正确的是( )。
A. 多表DELETE只能删除一张表中的数据,其他表仅用于条件筛选
B. 多表DELETE可以同时从多张表中删除符合JOIN条件的行
C. 多表DELETE执行时,所有参与的表都必须出现在FROM子句中
D. 多表DELETE必须使用JOIN,不能使用逗号隐式连接
【答案】B
【解析】
A错误:多表DELETE可以从多张表中同时删除数据,例如DELETE t1, t2 FROM t1 INNER JOIN t2 ...。
B正确:语法上支持单次删除多张表的关联数据。
C错误:并非所有参与的表都必须出现在FROM子句,至少需指定要删除的表在DELETE关键字后,关联表可放在USING或FROM中。例如标准语法DELETE FROM t1 USING t1 JOIN t2 ...。
D错误:多表DELETE可以使用逗号隐式连接(旧式语法),也可使用JOIN。例如DELETE t1 FROM t1, t2 WHERE t1.id=t2.id是合法的。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
编写说明:依托三阶支架资源编写方案,《一课一练》明确基础层具象化支架定位,作为课堂同步配套资源,其内容与课堂教学深度绑定,并且精准匹配中职学生知识基础与学习特质,遵循"由浅入深、循序渐进"的认知规律,聚焦基础性与实效性核心,通过拆解知识点、简化认知难度,切实降低学习门槛,为后续知识巩固与能力提升筑牢根基,是优质课后作业首选。
本卷是《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》第60练,内容是删除数据。
《数据库原理与应用技术-MySQL》(河北科学技术出版社)《一课一练》 第60练
删除数据
一、单项选择题
1. 关于MySQL中DELETE语句的说法,下列选项中正确的是( )。
A. DELETE语句属于DDL,用于删除整个表的结构
B. 执行DELETE语句时,若省略WHERE子句,系统会报错并拒绝执行
C. DELETE语句可以删除表中的部分行,也可以一次删除所有行
D. DELETE语句执行后,被删除的数据可以通过ROLLBACK命令恢复到任意历史状态
2.有学生表student(id INT PRIMARY KEY, name VARCHAR(20), age INT, class_id INT),执行以下语句:
DELETE FROM student WHERE age < 18;
若表中存在多行age < 18的记录,关于该语句执行结果的描述,正确的是( )。
A. 仅删除第一条满足条件的记录
B. 删除所有age < 18的记录,并自动重置AUTO_INCREMENT计数器
C. 删除所有age < 18的记录,但不会重置AUTO_INCREMENT计数器
D. 因为缺少ORDER BY语句,该语句会执行失败
3.下列关于TRUNCATE TABLE与DELETE FROM(无WHERE子句)的区别,说法错误的是( )。
A. TRUNCATE TABLE是DDL操作,而DELETE FROM是DML操作
B. TRUNCATE TABLE会重置AUTO_INCREMENT计数器,而DELETE FROM不会
C. TRUNCATE TABLE不支持WHERE条件,而DELETE FROM支持
D. TRUNCATE TABLE执行后无法通过事务回滚恢复数据,而DELETE FROM无论在任何情况下都可以回滚
4.设有部门表dept(dept_id INT PRIMARY KEY, name VARCHAR(20))和员工表emp(emp_id INT PRIMARY KEY, name VARCHAR(20), dept_id INT, FOREIGN KEY (dept_id) REFERENCES dept(dept_id) ON DELETE RESTRICT)。现有以下操作:
DELETE FROM dept WHERE dept_id = 101;
假设dept_id = 101的部门下存在多名员工。关于该语句的执行结果,正确的是( )。
A. 删除部门表dept中dept_id=101的行,同时自动级联删除该部门下所有员工
B. 删除部门表dept中dept_id=101的行,同时将该部门下所有员工的dept_id设置为NULL
C. 执行失败,因为子表中有引用记录,违反了RESTRICT约束
D. 删除部门表dept中dept_id=101的行,同时将该部门下所有员工的dept_id设置为默认值0
5.在MySQL中,执行下列语句序列(假设InnoDB存储引擎,自动提交关闭):
START TRANSACTION;
DELETE FROM orders WHERE order_id = 1001;
此时,另一会话执行以下查询:
SELECT * FROM orders WHERE order_id = 1001;
关于第二个会话查询结果的描述,正确的是( )。
A. 返回order_id=1001的行数据
B. 无返回行
C. 第二个会话被阻塞,直到第一个事务提交或回滚
D. 返回错误ORA-00054:资源忙
6.某MySQL数据库中,表student含有大量数据,需要清空表中所有行,并且要求立即释放数据文件占用的磁盘空间。下列两种操作方式中,效果上符合要求且风险较低的是( )。
A. DELETE FROM student; 然后 OPTIMIZE TABLE student;
B. TRUNCATE TABLE student;
C. DROP TABLE student; 然后 CREATE TABLE student ...;
D. 不需要任何操作,MySQL会自动释放空间
7.有商品表product(pid, pname, price, cid),以及类别表category(cid, cname)。现要删除“所有销售类别为‘电子产品’的商品记录”。下列SQL语句中,能正确实现该功能的是( )。
A.
DELETE FROM product
WHERE cid = (SELECT cid FROM category WHERE cname = '电子产品');
B.
DELETE FROM product
WHERE cid IN (SELECT cid FROM category WHERE cname = '电子产品');
C.
DELETE p FROM product p INNER JOIN category c ON p.cid = c.cid
WHERE c.cname = '电子产品';
D. 以上选项都正确
8.在MySQL中,执行以下语句时:
DELETE FROM scores WHERE score_id = 5 ORDER BY score_id LIMIT 3;
关于该语句的说法,正确的是( )。
A. 语法错误,DELETE语句中不能使用ORDER BY和LIMIT
B. 删除表中score_id = 5的所有记录
C. 删除表中满足score_id = 5的记录,并按照score_id排序后删除前3行
D. 因为score_id是主键或唯一索引,无重复值,LIMIT 3作用无意义,但语句仍合法
9.下列哪种情况下,DELETE语句在MySQL中会因为“安全更新模式”而拒绝执行?
A. 使用了ORDER BY子句但没有使用LIMIT
B. WHERE条件中使用了索引列,但该列存在NULL值
C. 执行DELETE语句时,WHERE条件中未使用索引键且未指定LIMIT,同时开启了sql_safe_updates=1
D. 删除的数据行数超过1000行
10.关于多表DELETE语句在MySQL中的行为,下列说法正确的是( )。
A. 多表DELETE只能删除一张表中的数据,其他表仅用于条件筛选
B. 多表DELETE可以同时从多张表中删除符合JOIN条件的行
C. 多表DELETE执行时,所有参与的表都必须出现在FROM子句中
D. 多表DELETE必须使用JOIN,不能使用逗号隐式连接
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$