MySQL 面试题

1. 数据库基础

问题
请解释数据库(DB)、数据库管理系统(DBMS)、SQL 三者的区别。

参考答案

  • DB:存储数据的结构化仓库
  • DBMS:管理数据库的软件(如 MySQL、Oracle)
  • SQL:操作关系型数据库的标准化语言

2. SQL 分类

问题
SQL 分为哪几类?分别写出对应的关键字(至少 3 个)。

参考答案

  • DDL:CREATE/DROP/ALTER
  • DML:INSERT/UPDATE/DELETE
  • DQL:SELECT
  • DCL:GRANT/REVOKE

3. 表结构设计

问题
设计一个员工表(emp),包含字段:编号、姓名、年龄、性别、入职日期、部门 ID。要求:

  • 编号为主键且自增
  • 年龄字段为无符号整数
  • 部门 ID 关联部门表(dept)的主键

参考答案

CREATE TABLE emp (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  age TINYINT UNSIGNED,
  gender CHAR(1),
  entrydate DATE,
  dept_id INT,
  FOREIGN KEY (dept_id) REFERENCES dept(id)
);

4. 数据查询

问题
使用 DQL 查询年龄在 20-30 岁之间的女性员工,按入职日期降序排列,显示前 5 条记录。

参考答案

SELECT * FROM emp 
WHERE age BETWEEN 20 AND 30 
  AND gender = '女' 
ORDER BY entrydate DESC 
LIMIT 5;

5. 约束与索引

问题
外键约束的作用是什么?如何实现级联删除?

参考答案

  • 作用:保证数据一致性,防止孤立记录
  • 级联删除
    ALTER TABLE emp 
    ADD CONSTRAINT fk_dept 
    FOREIGN KEY (dept_id) 
    REFERENCES dept(id) 
    ON DELETE CASCADE;
    

6. 事务管理

问题
事务的四大特性(ACID)是什么?脏读和幻读的区别是什么?

参考答案

  • ACID:原子性、一致性、隔离性、持久性
  • 脏读:读取到未提交的数据
  • 幻读:查询时不存在的数据,插入时已存在

7. 多表查询

问题
使用内连接查询员工姓名、部门名称和薪资等级(薪资等级表 salgrade 包含 grade、losal、hisal)。

参考答案

SELECT e.name, d.name, s.grade 
FROM emp e 
JOIN dept d ON e.dept_id = d.id 
JOIN salgrade s ON e.salary BETWEEN s.losal AND s.hisal;

8. 权限管理

问题
创建一个用户dev,允许其远程访问数据库,授予test_db的 SELECT 和 INSERT 权限。

参考答案

CREATE USER 'dev'@'%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT ON test_db.* TO 'dev'@'%';

9. 函数应用

问题
如何使用 MySQL 函数实现以下需求:

  • 将员工姓名转换为大写
  • 计算员工入职天数
  • 根据薪资等级返回 “高 / 中 / 低”

参考答案

SELECT 
  UPPER(name) AS 大写姓名,
  DATEDIFF(CURDATE(), entrydate) AS 入职天数,
  CASE 
    WHEN salary > 10000 THEN '高'
    WHEN salary > 5000 THEN '中'
    ELSE '低'
  END AS 薪资等级
FROM emp;

10. 性能优化

问题
当查询速度变慢时,可能的优化手段有哪些?(至少列出 3 种)

参考答案

  1. 添加索引(如INDEX idx_name ON emp(name)
  2. 优化查询语句(避免 SELECT *、使用 EXPLAIN 分析执行计划)
  3. 分表或分区(按时间或业务拆分表)
  4. 调整数据库配置(如缓冲池大小)
### 常见 MySQL 面试题及答案 #### 1. 获取当前 MySQL 版本的方法 为了获取当前使用的 MySQL 数据库版本,可以通过执行如下 SQL 查询命令: ```sql SELECT VERSION(); ``` 这条语句会返回服务器的版本号以及其他有关的信息[^1]。 #### 2. CHAR 和 VARCHAR 类型的区别 `CHAR` 是固定长度字符串类型,而 `VARCHAR` 则是可变长度字符串类型。当定义了一个 `CHAR(10)` 字段并存入少于十个字符的数据时,剩余的空间会被填充为空格;相反地,对于 `VARCHAR(10)` 来说,则只会占用实际所需字节数再加上一个额外字节来保存真实长度。因此,在大多数情况下,如果列的最大可能大小已知且相对较小的话,应该优先考虑使用 `VARCHAR` 而不是 `CHAR`,因为这样可以节省存储空间。 #### 3. 一条 MySQL 语句执行的主要过程 - **客户端发送请求给服务端** - **解析器分析SQL语法结构** - **优化器决定最佳访问路径** - **执行引擎负责具体操作** - **缓存机制提高重复查询效率** 以上就是典型的 MySQL 语句处理流程概述[^2]。 #### 4. 如何区分大小写的比较方式 要在 MySQL 中实现严格区分大小写字母的匹配,可以在查询条件前加上 `BINARY` 关键词或者将待比较的内容包裹在 `BINARY()` 函数内。例如: ```sql -- 方法一:直接在字段名前加 BINARY SELECT * FROM table_name WHERE BINARY column_name = 'value'; -- 方法二:用 BINARY() 包围值 SELECT * FROM table_name WHERE column_name LIKE BINARY ('value'); ``` 这两种方法都可以确保对比时不忽略字母的大写形式差异[^3]。 #### 5. MyISAM 存储引擎的特点 MyISAM 是一种早期非常流行的 MySQL 存储引擎之一,它具有以下特性: - 支持全文索引功能; - 对读密集型应用表现良好; - 表锁定而非行锁定意味着并发更新能力较差; - 缺乏对外键约束的支持; - 更适用于那些只需要简单事务管理的应用程序环境。 尽管如此,由于 InnoDB 成为了默认选项并且提供了更多高级特性的支持,现在 MyISAM 已经逐渐被淘汰了[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值