MySQL面试(1)
MySQL面试考点通关:从基础概念到实操
刚准备面试的小伙伴是不是对MySQL知识点又多又杂感到头疼?一会儿是关系型和非关系型数据库的区别,一会儿是DDL和DML操作的语法,记了又忘、混在一起?别慌!这篇文章就用最通俗的语言,把MySQL高频面试考点拆解开,从概念到实操一步步讲明白,让你看完就能懂、记住就能用。
一、先搞懂:数据库到底分哪几类?
面试常问“数据库分类”,其实就4种,记住关键词就行:
- 网状数据库:老古董级别的,数据像渔网一样关联,现在基本不用了
- 层次数据库:数据按“上下级”排列,比如“部门→员工”的树形结构,用得也少
- 关系型数据库:咱们重点学的!用“表格”存数据,还能保证数据安全,比如MySQL、Oracle
- 非关系型数据库:不按表格来,存数据更灵活,比如存键值对的Redis、存文档的MongoDB
二、关系型VS非关系型:核心区别一句话讲透
很多人分不清这俩,其实抓准“约束”和“结构”两个点就够了:
对比维度 | 关系型数据库(如MySQL) | 非关系型数据库(如Redis、MongoDB) |
---|---|---|
数据结构 | 二维表格(行是数据,列是字段) | 键值对、文档等(没有固定表格结构) |
数据约束 | 有严格约束(比如主键不能重复、字段非空) | 几乎没约束,想存啥存啥 |
表关联 | 支持1对1、1对多关联(用外键) | 没有表关联,要关联得自己写逻辑 |
典型代表 | MySQL、Oracle、SQL Server | Redis(键值)、MongoDB(文档) |
三、MySQL是什么?为啥大家都用它?
面试常问“介绍下MySQL”,不用讲太复杂,记住3个核心特点:
- 开源免费:不用花钱买版权,小公司、个人开发者都能用
- 轻量级:安装包小,占内存少,电脑配置不高也能跑
- 速度快:处理数据的效率高,日常开发够用了
现在MySQL归甲骨文公司管,但核心功能还是免费的,所以一直是中小型项目的首选数据库。
四、SQL语言:操作数据库的“普通话”
你可以把SQL理解成“和数据库对话的语言”,不管是MySQL还是Oracle,都能用SQL操作。它分5大类,记清每类做啥就行:
SQL分类 | 英文全称 | 作用 | 常用命令 |
---|---|---|---|
DQL | 数据查询语言 | 查数据(最常用) | SELECT |
DML | 数据操作语言 | 增、删、改数据 | INSERT、DELETE、UPDATE |
DDL | 数据定义语言 | 创建、修改、删除表/库 | CREATE、ALTER、DROP |
DCL | 数据控制语言 | 给用户授权、收回权限 | GRANT、REVOKE |
TCL | 事务控制语言 | 管理事务(保证数据安全) | COMMIT、ROLLBACK |
考点加餐:SQL和NoSQL的区别
这是高频面试题,记住5个关键点:
- 结构:SQL是“结构化”(必须按表格存),NoSQL是“非结构化”(灵活存)
- 约束:SQL有主键、非空等约束,NoSQL没有
- 关联:SQL支持表关联(外键),NoSQL不支持
- 一致性:SQL满足ACID(数据绝对安全),NoSQL大多只满足基本一致性
- 存储:SQL主要存在磁盘,NoSQL(如Redis)主要存在内存(速度更快)
五、DDL操作:创建/修改/删除表,一步到位
DDL是“定义表结构”的操作,比如建表、加字段、删表,这些语法必须记熟,面试可能让你写!
1. 最核心:创建表(CREATE TABLE)
建表时要指定“字段名+类型+约束”,比如创建一个“学生表”:
create table t_student(`stuid` int(4) auto_increment PRIMARY KEY, -- 学号:自增+主键(唯一且非空)`sname` VARCHAR(15) not null, -- 姓名:非空(必须填)`ssex` VARCHAR(1) not null DEFAULT '男', -- 性别:非空,默认是“男”`age` int(3) CHECK(age<=100 and age>=0), -- 年龄:0-100之间(检查约束)`email` VARCHAR(30) UNIQUE -- 邮箱:唯一(不能重复)
);
2. 常用辅助操作
- 查看表结构:想知道表有哪些字段,用
desc 表名;
desc t_student; -- 查看t_student表的字段、类型、约束
- 查看建表语句:想知道表是怎么创建的,用
show create table 表名;
show create table t_student;
- 添加字段:给表加个“班级ID”字段,还能指定位置(比如在“姓名”后面)
-- 1. 直接加在最后 alter table t_student add cid int(4); -- 2. 加在sname后面 alter table t_student add cid int(4) AFTER sname;
- 修改/删除字段:
-- 修改字段类型(比如把cid改成int(6)) alter table t_student modify cid int(6); -- 改字段名(把cid改成class_id) alter table t_student change cid class_id int(4); -- 删除字段(删除class_id) alter table t_student drop class_id;
- 删除表:注意!删表会把数据也删了,谨慎用
drop table t_student; -- 删除t_student表
3. 必考点:数据表的完整性约束
约束就是“给数据定规矩”,保证数据不乱,常用的有7种:
约束类型 | 作用 | 示例 |
---|---|---|
主键(PRIMARY KEY) | 唯一标识一行数据,非空且唯一 | stuid int(4) PRIMARY KEY |
非空(NOT NULL) | 字段必须填值,不能空 | sname VARCHAR(15) NOT NULL |
自增(AUTO_INCREMENT) | 字段值自动增长,不用手动填 | stuid int(4) AUTO_INCREMENT |
默认值(DEFAULT) | 没填值时,用默认值 | ssex VARCHAR(1) DEFAULT ‘男’ |
检查(CHECK) | 字段值必须满足条件 | age int(3) CHECK(age<=100) |
唯一(UNIQUE) | 字段值不能重复,但可以空 | email VARCHAR(30) UNIQUE |
外键(FOREIGN KEY) | 关联两个表(比如学生表关联班级表) | 看下面示例 |
外键示例(让学生表的class_id关联班级表的cid):
alter table t_student
add CONSTRAINT fk_student_class -- 外键名(随便起)
FOREIGN key (class_id) -- 学生表的关联字段
REFERENCES t_class (cid); -- 关联班级表的cid字段
4. 高频题:char和varchar的区别
都是存字符串,但用法不一样:
- char:定长字符串。比如
char(10)
,不管你存“abc”还是“abcdefg”,都占10个字符的空间,适合存长度固定的内容(比如手机号、身份证号) - varchar:变长字符串。比如
varchar(10)
,存“abc”就占3个字符空间,存“abcdefg”就占7个,适合存长度不固定的内容(比如姓名、地址)
5. 高频题:Decimal、Float、Double的区别
都是存小数,但精度不一样:
- Float/Double:存“近似值”,会有精度损失。比如存0.1,实际存的可能是0.1000000001,适合对精度要求不高的场景(比如温度、身高)
- Decimal:存“精确值”,没有精度损失。适合存钱(比如金额、工资),比如
Decimal(10,2)
表示总共10位数字,其中2位是小数(最大存99999999.99)
六、DML操作:增删改数据,日常开发天天用
DML是“操作表中数据”的语法,增、删、改是核心,必须熟练!
1. 新增数据(INSERT)
两种写法,记住“字段和值要对应”:
-- 1. 指定字段(推荐!就算表加了新字段也不影响)
insert into t_student (stuid, sname, ssex, age, email)
values (1, '张三', '男', 20, 'zhangsan@xxx.com');-- 2. 不指定字段(必须给所有字段赋值,顺序和建表时一致)
insert into t_student
values (2, '李四', '女', 19, 'lisi@xxx.com');-- 3. 一次插多条数据(用逗号分隔)
insert into t_student (sname, ssex, age, email)
values ('王五', '男', 21, 'wangwu@xxx.com'),('赵六', '女', 20, 'zhaoliu@xxx.com');
注意:不同类型字段的赋值规则:
- 整数/浮点:直接写值(比如1、20.5)
- 字符串/日期:用单引号包起来(比如’张三’、‘2024-05-01’)
- 日期还能自动取当前时间:用
now()
(比如now()
表示当前时间)
2. 修改数据(UPDATE)
必须加WHERE条件! 不然会把表中所有数据都改了,面试时忘了WHERE会扣分!
-- 把stuid=1的学生年龄改成21
update t_student
set age=21, email='zhangsan_new@xxx.com' -- 可以同时改多个字段
where stuid=1; -- 只改stuid=1的这一行
3. 删除数据(DELETE)
同样要加WHERE条件,不然会删光所有数据!
-- 删除stuid=2的学生
delete from t_student
where stuid=2;
4. 面试必考题:DELETE、TRUNCATE、DROP的区别
这三个都能删数据,但差别很大,记清3个维度:
对比维度 | DELETE | TRUNCATE | DROP |
---|---|---|---|
操作类型 | DML(数据操作) | DDL(数据定义) | DDL(数据定义) |
能否回滚 | 能(删错了可以恢复) | 不能(删了就没了) | 不能(删表+数据) |
索引重置 | 不重置(删了数据,自增字段继续从上次开始) | 重置(自增字段从1开始) | 删表了,索引也没了 |
效率 | 慢(一条一条删) | 快(直接清空表) | 快(直接删表) |
作用范围 | 删表中数据(表还在) | 删表中数据(表还在) | 删表+数据(表没了) |
简单记:想删数据留表、能恢复→用DELETE;想快速清空表、不恢复→用TRUNCATE;想把表整个删掉→用DROP。
七、总结:面试怎么考?怎么记?
MySQL面试不会考太偏的内容,重点就是:
- 概念题:数据库分类、关系型vs非关系型、SQL分类、DELETE/TRUNCATE/DROP区别
- 语法题:建表(带约束)、INSERT/UPDATE/DELETE语句、添加字段、外键关联
- 细节题:char vs varchar、Decimal vs Float、字段赋值规则
记的时候别死记硬背,结合“场景”来:比如想到“存手机号”就记char,想到“存金额”就记Decimal,想到“删数据怕删错”就记DELETE。
把这些知识点过一遍,再动手写几遍SQL,MySQL基础面试就没问题啦!后续还会讲DQL查询(比如SELECT加条件、联表查询),一步步进阶~