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,数据库)