MySQL 基础与 SQL 语句
本篇覆盖 MySQL 面试的基础层:数据库概念、存储引擎、数据类型、三范式、SQL 四大分类(DDL / DML / DCL / TCL),以及 SELECT 查询详解。SQL 手写是笔试必考,示例语句建议全部亲手敲一遍。
1. 数据库基础概念
- 数据库:存放数据的仓库。MySQL 属于关系型数据库,数据以表的形式存储,表由行和列组成。
- 客户端-服务器架构:MySQL 服务端监听端口(默认 3306),客户端(mysql 命令行、Navicat、应用驱动)连接服务端后操作数据。
1.1 存储引擎(高频)
| 对比项 | InnoDB | MyISAM |
|---|---|---|
| 事务 | 支持 | 不支持 |
| 锁粒度 | 行级锁 | 表级锁 |
| 崩溃恢复 | 支持(redo log) | 容易丢数据 |
| 适用场景 | 生产环境默认 | 查询快但安全性差,新项目基本不用 |
- InnoDB 是 MySQL 5.5 之后默认引擎,数据安全、支持并发写。
- 一句话结论:企业开发全部用 InnoDB,面试答这句即可。
1.2 常用数据类型
| 类别 | 类型 | 要点 |
|---|---|---|
| 数值 | int | 整数 |
| 数值 | decimal | 金额必须用 decimal,不要用 float/double(浮点数有精度丢失) |
| 字符串 | char(n) | 固定长度,不足补空格;查询快,浪费空间 |
| 字符串 | varchar(n) | 可变长度,按实际内容存储;节省空间 |
| 时间 | datetime | 年月日时分秒,不受时区影响 |
| 时间 | timestamp | 时间戳,受时区影响,范围到 2038 年 |
char vs varchar 一句话: char 定长查询快但费空间,varchar 变长省空间。
1.3 三范式
| 范式 | 要求 | 通俗理解 |
|---|---|---|
| 第一范式(1NF) | 列不可再拆分 | 每个字段是最小原子值(不能存「电话1,电话2」挤一列) |
| 第二范式(2NF) | 满足 1NF,非主键字段完全依赖主键 | 不能存在「只依赖主键一部分」的列(针对联合主键) |
| 第三范式(3NF) | 满足 2NF,非主键字段不能传递依赖其他非主键字段 | 不能「A 依赖主键、B 依赖 A」 |
补充(面试加分): 范式的目的是减少冗余;但实际业务中为了查询方便有时会适当增加冗余字段(如订单表冗余商品名),避免多表关联,不必严格遵守三范式。
2. SQL 语句分类
| 分类 | 全称 | 作用 | 代表语句 |
|---|---|---|---|
| DDL | Data Definition Language | 数据定义:创建/修改/删除库表结构 | CREATE ALTER DROP |
| DML | Data Manipulation Language | 数据操作:增删改表里的数据 | INSERT UPDATE DELETE |
| DCL | Data Control Language | 权限控制:分配账号权限 | GRANT REVOKE |
| TCL | Transaction Control Language | 事务控制:提交、回滚 | COMMIT ROLLBACK |
3. DDL 语句
-- 创建数据库(指定 utf8mb4 字符集)
CREATE DATABASE testdb DEFAULT CHARACTER SET utf8mb4;
SHOW DATABASES; -- 查看数据库
USE testdb; -- 切换数据库
DROP DATABASE testdb; -- 删除数据库(危险)
-- 创建表
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键 + 自增
name VARCHAR(50),
age INT,
address VARCHAR(100)
);
DESC student; -- 查看表结构
SHOW CREATE TABLE student; -- 查看建表语句
ALTER TABLE student ADD phone VARCHAR(20); -- 增加字段
ALTER TABLE student MODIFY phone VARCHAR(11); -- 修改字段类型
ALTER TABLE student DROP phone; -- 删除字段
DROP TABLE student; -- 删除表
PRIMARY KEY主键:唯一标识一行,唯一且非空,自带主键索引。AUTO_INCREMENT自增:插入时不指定 id 自动递增。
4. DML 语句(增删改)
-- 插入数据
INSERT INTO student (name, age, address) VALUES ('张三', 20, '常州');
-- 查询所有数据
SELECT * FROM student;
-- 更新数据:update 必须带 where,否则全表更新,非常危险
UPDATE student SET age = 21 WHERE id = 1;
-- 删除数据:delete 必须带 where,否则清空整张表
DELETE FROM student WHERE id = 1;
delete / truncate / drop 区别(高频)
| 语句 | 层级 | 特点 |
|---|---|---|
DELETE | 删行数据(DML) | 可带 where 条件,逐行删除,事务可回滚 |
TRUNCATE | 清空整张表(DDL) | 全部清空、自增主键重置为 1,速度快,不可回滚 |
DROP | 删除整张表(DDL) | 表结构和数据全部删除 |
5. SELECT 查询详解(重点)
5.1 基础语法与运算符
SELECT 字段 FROM 表名 WHERE 条件;
-- 查询 id=1 的学生
SELECT name, age FROM student WHERE id = 1;
- 比较运算符:
=、>、<、>=、<=、!= - 逻辑运算符:
AND(并且)、OR(或者)
5.2 模糊查询 LIKE
%代表任意多个字符,_代表单个字符。
-- 查询名字带"张"的学生
SELECT * FROM student WHERE name LIKE '%张%';
5.3 排序 ORDER BY 与 限制 LIMIT
-- 升序 ASC(默认)、降序 DESC
SELECT * FROM student ORDER BY age DESC;
-- LIMIT 偏移量, 条数:从第 0 条开始取 5 条
SELECT * FROM student LIMIT 0, 5;
5.4 分组统计 GROUP BY 与聚合函数
聚合函数:count 统计行数、sum 求和、max 最大值、min 最小值、avg 平均值。
-- 统计各个年龄的人数
SELECT age, COUNT(*) FROM student GROUP BY age;
-- having:分组之后做条件过滤
SELECT age, COUNT(*) FROM student GROUP BY age HAVING COUNT(*) > 3;
where 与 having 的区别(高频)
| 对比项 | WHERE | HAVING |
|---|---|---|
| 过滤时机 | 分组之前过滤原始数据 | 分组之后过滤聚合结果 |
| 能否用聚合函数 | 不能 | 能(如 HAVING COUNT(*) > 3) |
| 位置 | GROUP BY 前 | GROUP BY 后 |
5.5 多表连接查询
-- 内连接:只查询两边匹配上的数据
SELECT * FROM student INNER JOIN class ON student.class_id = class.id;
-- 左连接:左表全部数据,右表匹配不到的显示 NULL
SELECT * FROM student LEFT JOIN class ON student.class_id = class.id;
| 连接类型 | 结果 |
|---|---|
| INNER JOIN | 两表都匹配上的行 |
| LEFT JOIN | 左表全部 + 右表匹配不上的补 NULL |
5.6 UNION 与 UNION ALL
SELECT name FROM student_a
UNION
SELECT name FROM student_b;
| 对比项 | UNION | UNION ALL |
|---|---|---|
| 去重 | 自动去重 | 不去重 |
| 性能 | 慢(需要排序去重) | 更快 |
结论:确认无重复需求时一律用 UNION ALL。
6. DCL 权限语句
-- 创建用户:'%' 表示任意主机可连
CREATE USER 'test'@'%' IDENTIFIED BY '123456';
-- 分配权限:把 testdb 库所有表的查询/插入/更新权限给 test
GRANT SELECT, INSERT, UPDATE ON testdb.* TO 'test'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
-- 回收权限
REVOKE SELECT ON testdb.* FROM 'test'@'%';
本篇速记
- 金额用
decimal不用float;char定长快、varchar变长省空间。 - 范式减冗余,实际可适当反范式加冗余字段。
- DDL 管结构、DML 管数据、DCL 管权限、TCL 管事务。
delete删行可回滚、truncate清表重置自增、drop删表。where分组前过滤原始行、having分组后过滤聚合结果。UNION去重慢、UNION ALL不去重快。