MySQL 增删操作面试题

简介: MySQL 增删操作面试题

在数据库操作中,数据的增删是最基础也是最常见的操作。MySQL作为流行的关系型数据库,增删操作在面试中经常涉及。本文准备了30道关于MySQL增删操作的面试题,按照简单、中等、困难的难度划分,并提供了详细的答案和对应的SQL语句。通过这些问题,可以深入理解MySQL在实际应用中的增删操作。


1. 简单问题


问题 1:如何向表中插入一条数据?


题目: 给定一个表 employees,它有如下字段:id、name、age、position,编写SQL语句插入一条记录,name = 'John Doe', age = 30, position = 'Developer'。


答案:

INSERT INTO employees (name, age, position)
VALUES ('John Doe', 30, 'Developer');


问题 2:如何删除表中的某条记录?


题目: 删除表 employees 中 id = 5 的记录。


答案:

DELETE FROM employees WHERE id = 5;


问题 3:如何插入多条记录?


题目: 向表 employees 中插入以下两条记录:

1.name = 'Alice', age = 25, position = 'Manager'

2.name = 'Bob', age = 28, position = 'Engineer'


答案:

INSERT INTO employees (name, age, position)
VALUES ('Alice', 25, 'Manager'),
       ('Bob', 28, 'Engineer');


问题 4:如何删除表中所有数据?


题目: 编写SQL语句删除表 employees 中的所有数据,但保留表结构。


答案:

DELETE FROM employees;


问题 5:删除表中重复的数据


题目: 从表 employees 中删除重复的记录,保留每个 name 最小的 id。


答案:

DELETE e1 FROM employees e1
JOIN employees e2
ON e1.name = e2.name AND e1.id > e2.id;


问题 6:如何通过子查询删除数据?


题目: 删除表 employees 中 age 大于表 salaries 中最大年龄的记录。


答案:

DELETE FROM employees
WHERE age > (SELECT MAX(age) FROM salaries);


问题 7:如何使用默认值插入数据?


题目: 向表 employees 中插入一条记录,name = 'Charlie',其余字段使用默认值。


答案:

INSERT INTO employees (name)
VALUES ('Charlie');


问题 8:如何删除表中年龄大于30岁的员工?


题目: 从表 employees 中删除所有 age 大于30的记录。


答案:

DELETE FROM employees WHERE age > 30;


问题 9:如何使用 INSERT IGNORE 防止重复插入?


题目: 如果 employees 表中的 name 是唯一的,如何在插入时避免重复的 name 插入?


答案:

INSERT IGNORE INTO employees (name, age, position)
VALUES ('David', 29, 'Tester');


问题 10:如何获取最后插入的自增ID?


题目: 插入一条记录并返回该记录的自增 id。


答案:

INSERT INTO employees (name, age, position)
VALUES ('Emma', 22, 'Designer');

SELECT LAST_INSERT_ID();


2. 中等问题


问题 11:如何一次插入或更新多条记录?


题目: 如果记录已存在则更新记录,如果不存在则插入新的记录。以 name 为唯一标识,处理以下两条记录:

1.name = 'Alice', age = 26, position = 'Manager'

2.name = 'Charlie', age = 32, position = 'Developer'


答案:

INSERT INTO employees (name, age, position)
VALUES ('Alice', 26, 'Manager'),
       ('Charlie', 32, 'Developer')
ON DUPLICATE KEY UPDATE
age = VALUES(age),
position = VALUES(position);


问题 12:如何插入来自其他表的数据?


题目: 从表 candidates 中插入符合条件的记录到表 employees 中。要求:age > 25 并且 position = 'Developer'。


答案:

INSERT INTO employees (name, age, position)
SELECT name, age, position
FROM candidates
WHERE age > 25 AND position = 'Developer';


问题 13:如何限制删除的条数?


题目: 从表 employees 中删除 age > 40 的员工,最多删除5条记录。


答案

DELETE FROM employees WHERE age > 40 LIMIT 5;


问题 14:如何在事务中删除数据?


题目: 假设你在处理批量删除操作,如何在事务中删除 age > 50 的记录?


答案:

START TRANSACTION;

DELETE FROM employees WHERE age > 50;

COMMIT;


问题 15:如何使用 REPLACE INTO?


题目: 使用 REPLACE INTO 替换表 employees 中已存在的记录,要求根据 id 判断,如果记录存在则更新,不存在则插入。


答案:

REPLACE INTO employees (id, name, age, position)
VALUES (1, 'John Doe', 31, 'Developer');


问题 16:如何批量删除多个条件的数据?


题目: 批量删除符合以下任一条件的记录:

age > 50

position = 'Intern'


答案:

DELETE FROM employees
WHERE age > 50 OR position = 'Intern';


问题 17:如何通过子查询插入数据?


题目: 插入符合条件的候选人到员工表,要求从 candidates 表中插入 position 为 Developer 的记录。


答案:

INSERT INTO employees (name, age, position)
SELECT name, age, position
FROM candidates
WHERE position = 'Developer';


问题 18:如何使用 DELETE JOIN 删除数据?


题目: 删除 employees 中 id 对应的员工,而这些 id 来源于 departments 表中 dept_id = 3 的记录。


答案:

DELETE e
FROM employees e
JOIN departments d
ON e.dept_id = d.id
WHERE d.dept_id = 3;


问题 19:如何使用 INSERT INTO ... SELECT 插入唯一数据?


题目: 从 candidates 表中插入 name 唯一的记录到 employees 表中。


答案:

INSERT INTO employees (name, age, position)
SELECT DISTINCT name, age, position
FROM candidates;


问题 20:如何删除所有空值字段的记录?


题目: 删除表 employees 中 name 或 position 为 NULL 的记录。


答案:

DELETE FROM employees
WHERE name IS NULL OR position IS NULL;


3. 困难问题


问题 21:如何批量删除满足条件的子表数据?


题目: 在多表关联的情况下,如何删除主表 employees 中 age > 60 的记录,并同时删除其在 projects 子表中的记录?


答案:

DELETE e, p
FROM employees e
LEFT JOIN projects p ON e.id = p.employee_id
WHERE e.age > 60;


问题 22:如何使用 INSERT DELAYED 提高插入性能?


题目: 在高并发环境中,如何通过 INSERT DELAYED 插入数据以提高写入性能?


答案:

INSERT DELAYED INTO employees (name, age, position)
VALUES ('John', 30, 'Developer');


问题 23:如何安全地删除表中大量数据?


题目: 表 logs 过大,如何通过批量删除的方式安全删除表中所有数据?


答案:

DELETE FROM logs LIMIT 1000;
WHILE (ROW_COUNT() > 0) DO
  DELETE FROM logs LIMIT 1000;
END WHILE;


问题 24:如何避免表锁定删除大数据量?


题目: 如果需要删除大量数据,如何避免对表的锁定?


答案:

SET AUTOCOMMIT = 0;

WHILE EXISTS (SELECT 1 FROM logs LIMIT 1) DO
    DELETE FROM logs LIMIT 1000;
    COMMIT;
END WHILE;

SET AUTOCOMMIT = 1;


问题 25:如何在触发器中实现数据插入?


题目: 在 employees 表的插入操作中,如何通过触发器实现插入日志到 audit_logs 表?


答案:

CREATE TRIGGER after_employee_insert
AFTER INSERT ON employees
FOR EACH ROW
BEGIN
    INSERT INTO audit_logs (employee_id, action)
    VALUES (NEW.id, 'INSERT');
END;


问题 26:如何通过游标批量删除?


题目: 使用游标处理表中满足 age > 50 条件的记录并逐条删除。


答案:

DELIMITER $$

CREATE PROCEDURE batch_delete()
BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE emp_id INT;
    DECLARE emp_cursor CURSOR FOR SELECT id FROM employees WHERE age > 50;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
   
    OPEN emp_cursor;
   
    read_loop: LOOP
        FETCH emp_cursor INTO emp_id;
        IF done THEN
            LEAVE read_loop;
        END IF;
       
        DELETE FROM employees WHERE id = emp_id;
    END LOOP;
   
    CLOSE emp_cursor;
END $$

DELIMITER ;


问题 27:如何处理 DELETE ... RETURNING?


题目: 删除记录并返回删除的记录详细信息(假设使用支持 RETURNING 的MySQL版本)。


答案:

DELETE FROM employees
WHERE id = 5
RETURNING id, name, age, position;


问题 28:如何使用事务在插入时处理回滚?


题目: 如何在事务中插入数据,如果某个条件失败,则回滚所有插入?


答案:

START TRANSACTION;

INSERT INTO employees (name, age, position)
VALUES ('Jane', 28, 'Analyst');

IF (SOME_CONDITION_FAILS) THEN
    ROLLBACK;
ELSE
    COMMIT;
END IF;


问题 29:如何使用分区表优化大数据量删除操作?


题目: 如何使用分区表删除过期数据,以提高性能?


答案:

ALTER TABLE logs PARTITION BY RANGE (YEAR(log_date)) (
    PARTITION p0 VALUES LESS THAN (2020),
    PARTITION p1 VALUES LESS THAN (2021),
    PARTITION p2 VALUES LESS THAN (2022)
);

ALTER TABLE logs TRUNCATE PARTITION p0;


问题 30:如何通过复杂条件删除数据?


题目: 删除表 employees 中 age > 40 且 position 不为 Manager 或 Developer 的记录。


答案:

DELETE FROM employees
WHERE age > 40
AND position NOT IN ('Manager', 'Developer');


总结


这篇文章整理了30道关于MySQL增删操作的面试题,涵盖了从简单到困难的多个层次。这些问题不仅考察了增删的基本操作,还涉及了批量操作、事务、分区、游标等高阶技巧。


目录
相关文章
|
24天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
16天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
20天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2577 22
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
18天前
|
人工智能 IDE 程序员
期盼已久!通义灵码 AI 程序员开启邀测,全流程开发仅用几分钟
在云栖大会上,阿里云云原生应用平台负责人丁宇宣布,「通义灵码」完成全面升级,并正式发布 AI 程序员。
|
3天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
2天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
163 2
|
20天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1576 16
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
22天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
977 14
|
4天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
221 2
|
17天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
734 9