跳到主要内容
版本:Next

MySQL 基础与 SQL 语句

本篇覆盖 MySQL 面试的基础层:数据库概念、存储引擎、数据类型、三范式、SQL 四大分类(DDL / DML / DCL / TCL),以及 SELECT 查询详解。SQL 手写是笔试必考,示例语句建议全部亲手敲一遍。

1. 数据库基础概念​

  • 数据库:存放数据的仓库。MySQL 属于关系型数据库,数据以表的形式存储,表由行和列组成。
  • 客户端-服务器架构:MySQL 服务端监听端口(默认 3306),客户端(mysql 命令行、Navicat、应用驱动)连接服务端后操作数据。

1.1 存储引擎(高频)​

对比项InnoDBMyISAM
事务支持不支持
锁粒度行级锁表级锁
崩溃恢复支持(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 语句分类​

分类全称作用代表语句
DDLData Definition Language数据定义:创建/修改/删除库表结构CREATE ALTER DROP
DMLData Manipulation Language数据操作:增删改表里的数据INSERT UPDATE DELETE
DCLData Control Language权限控制:分配账号权限GRANT REVOKE
TCLTransaction 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 的区别(高频)​

对比项WHEREHAVING
过滤时机分组之前过滤原始数据分组之后过滤聚合结果
能否用聚合函数不能能(如 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;
对比项UNIONUNION 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 不去重快。