一、MySQL 数据库基础
(一)数据库类型
MySQL 属于关系型数据库(RDBMS),核心是建立在关系模型基础上,由多张相互关联的二维表组成数据存储结构,表与表之间可通过关联字段建立逻辑关系。
(二)核心特点
- 存储规范:使用表结构存储数据,字段格式统一,数据组织有序,便于后期维护和修改。
- 操作统一:通过 SQL(结构化查询语言)实现数据操作,语法标准通用,学习成本低、使用便捷。
二、SQL 通用语法
-
书写规则:
- SQL 语句可单行或多行书写,必须以分号(;) 结尾;
- 可通过空格、缩进优化语句结构,提升可读性(如关键字换行、字段对齐)。
-
大小写规则:MySQL 中 SQL 语句不区分大小写(如
SELECT与select功能一致),但建议关键字使用大写(如CREATE、WHERE),字段 / 表名使用小写,避免混淆。 -
注释方式:
- 单行注释:
-- 注释内容(注意 “--” 后需加空格)或# 注释内容(MySQL 特有); - 多行注释:
/* 注释内容 */,支持跨多行标注(如说明复杂逻辑的作用)。
- 单行注释:
三、DDL(数据定义语言)—— 数据库与表结构操作
DDL 用于定义数据库、表的结构,核心操作包括 “数据库操作” 和 “表操作”,不涉及表中具体数据。
(一)数据库操作
| 操作需求 | SQL 语句格式 | 说明 |
|---|---|---|
| 查询所有数据库 | SHOW DATABASES; |
列出 MySQL 服务器中所有已创建的数据库名称。 |
| 查询当前使用的数据库 | SELECT DATABASE(); |
查看当前会话正在操作的数据库。 |
| 创建数据库 | CREATE DATABASE [IF NOT EXISTS] 数据库名 [DEFAULT CHARSET 字符集] [COLLATE 排序规则]; |
IF NOT EXISTS 避免数据库已存在时报错;DEFAULT CHARSET 可指定默认字符集(如 utf8mb4 支持表情)。 |
| 使用数据库 | USE 数据库名; |
操作表前必须先切换到目标数据库(如 USE student_db;)。 |
| 删除数据库 | DROP DATABASE [IF EXISTS] 数据库名; |
IF NOT EXISTS 避免删除不存在的数据库时报错;删除后数据不可恢复,需谨慎操作。 |
(二)表操作
1. 查询表信息
| 操作需求 | SQL 语句 | 说明 |
|---|---|---|
| 查询当前数据库所有表 | SHOW TABLES; |
列出当前数据库中所有表名。 |
| 查询表结构 | DESC 表名; |
显示表的字段名、数据类型、是否为空、默认值、主键等结构信息。 |
| 查询建表语句 | SHOW CREATE TABLE 表名; |
查看表的完整创建语句(含表注释、字符集、存储引擎等细节,便于复制表结构)。 |
2. 创建表
基本语法
CREATE TABLE 表名(
字段1 字段1类型 [***MENT 字段1注释],
字段2 字段2类型 [***MENT 字段2注释],
...
字段n 字段n类型 [***MENT 字段n注释]
)[ ***MENT 表注释 ]; -- 表的整体功能说明
示例
创建 “学生表(student)”,包含学号、姓名、年龄字段:
CREATE TABLE student(
id INT ***MENT '学号',
name VARCHAR(50) ***MENT '姓名',
age TINYINT ***MENT '年龄'
)[ ***MENT '学生基本信息表' ];
3. 修改表
| 操作需求 | SQL 语句格式 | 示例 |
|---|---|---|
| 添加字段 | ALTER TABLE 表名 ADD 字段名 类型(长度) [***MENT 注释] [约束]; |
给 student 表加 “性别” 字段:ALTER TABLE student ADD gender CHAR(1) ***MENT '性别(男/女)';
|
| 删除字段 | ALTER TABLE 表名 DROP 字段名; |
删除 student 表的 “年龄” 字段:ALTER TABLE student DROP age;
|
| 修改表名 | ALTER TABLE 表名 RENAME TO 新表名; |
将 student 表改名为 stu:ALTER TABLE student RENAME TO stu;
|
4. 删除表
| 操作需求 | SQL 语句 | 说明 |
|---|---|---|
| 删除指定表 | DROP TABLE [IF EXISTS] 表名; |
IF EXISTS 避免表不存在时报错,删除后表结构和数据均消失。 |
| 清空表数据并保留结构 | TRUNCATE TABLE 表名; |
快速清空表中所有数据(不可恢复),执行效率高于 DELETE,且保留表结构。 |
(三)MySQL 核心数据类型
MySQL 数据类型按用途分为三类,需根据业务场景选择(如金额用 DECIMAL,文本用 VARCHAR):
1. 数值类型(存储整数、小数)
| 类型 | 占用空间 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
|---|---|---|---|---|
| TINYINT | 1 byte | (-128, 127) | (0, 255) | 小整数值(如性别、状态:0 = 女,1 = 男) |
| SMALLINT | 2 bytes | (-32768, 32767) | (0, 65535) | 较小整数值(如班级人数) |
| MEDIUMINT | 3 bytes | (-8388608, 8388607) | (0, 16777215) | 中等整数值(如区域编码) |
| INT/INTEGER | 4 bytes | (-2147483648, 2147483647) | (0, 4294967295) | 常用整数值(如学号、用户 ID) |
| BIGINT | 8 bytes | (-2^63, 2^63-1) | (0, 2^64-1) | 极大整数值(如大表 ID、订单号) |
| FLOAT | 4 bytes | (-3.4E+38, 3.4E+38) | 0 和 (1.2E-38, 3.4E+38) | 单精度浮点数(精度低,如近似测量值) |
| DOUBLE | 8 bytes | (-1.8E+308, 1.8E+308) | 0 和 (2.2E-308, 1.8E+308) | 双精度浮点数(精度较高,如温度、体重) |
| DECIMAL | 依赖 M/D | 依赖 M(精度)和 D(标度) | 依赖 M(精度)和 D(标度) | 定点数(精准存储小数,如金额:DECIMAL(10,2) 表示最大 99999999.99) |
2. 字符串类型(存储文本、二进制数据)
| 类型 | 占用空间 | 描述 |
|---|---|---|
| CHAR | 0-255 bytes | 定长字符串(长度固定,如手机号、身份证号:CHAR(11) 存储手机号) |
| VARCHAR | 0-65535 bytes | 变长字符串(长度随内容变化,如姓名、地址:VARCHAR(50) 存储姓名) |
| TINYBLOB | 0-255 bytes | 小型二进制数据(如小图标、缩略图) |
| TINYTEXT | 0-255 bytes | 短文本(如简短备注、标签) |
| BLOB | 0-65535 bytes | 二进制长数据(如图片、小型文件) |
| TEXT | 0-65535 bytes | 长文本(如文章内容、详细描述) |
| MEDIUMBLOB | 0-16777215 bytes | 中等二进制数据(如高清图片、中型文件) |
| MEDIUMTEXT | 0-16777215 bytes | 中等长度文本(如长文章、系统日志) |
| LONGBLOB | 0-4294967295 bytes | 极大二进制数据(如大型文件、视频片段) |
| LONGTEXT | 0-4294967295 bytes | 极大长度文本(如超长日志、文档) |
3. 日期时间类型(存储时间相关信息)
| 类型 | 占用空间 | 取值范围 | 格式 | 描述 |
|---|---|---|---|---|
| DATE | 3 bytes | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 仅存储日期(如生日、注册日期) |
| TIME | 3 bytes | -838:59:59 至 838:59:59 | HH:MM:SS | 仅存储时间或持续时间(如打卡时间、任务时长) |
| YEAR | 1 byte | 1901 至 2155 | YYYY | 仅存储年份(如毕业年份、产品生产年份) |
| DATETIME | 8 bytes | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期 + 时间(如订单创建时间、交易时间) |
| TIMESTAMP | 4 bytes | 1970-01-01 00:00:01 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 时间戳(自动关联时区,如数据更新时间,插入 / 更新时可自动填充) |
四、DML(数据操作语言)—— 表数据增删改
DML 用于操作表中的具体数据,核心是 “添加、修改、删除”,不改变表结构。
(一)添加数据(INSERT)
1. 语法分类
| 操作场景 | SQL 语句格式 | 示例 |
|---|---|---|
| 给指定字段添加数据 | INSERT INTO 表名(字段1, 字段2, ...) VALUES(值1, 值2, ...); |
给 student 表添加一条数据:INSERT INTO student(id, name) VALUES(1, '张三');
|
| 给所有字段添加数据 | INSERT INTO 表名 VALUES(值1, 值2, ...); |
给 student 表(id, name, gender)添加数据:INSERT INTO student VALUES(2, '李四', '男');
|
| 批量添加数据 | INSERT INTO 表名(字段1, ...) VALUES(值1, ...), (值1, ...), ...; |
批量添加 2 条数据:INSERT INTO student(id, name) VALUES(3, '王五'), (4, '赵六');
|
2. 注意事项
- 字段值需与字段类型匹配(如
INT类型不能填字符串); - 字符串、日期类型需用单引号(') 包裹(如
'2024-01-01'、'张三')。
(二)修改数据(UPDATE)
1. 基本语法
UPDATE 表名 SET 字段1=值1, 字段2=值2, ... [WHERE 条件];
2. 示例
- 修改 student 表中 id=1 的姓名为 “张三三”:
UPDATE student SET name='张三三' WHERE id=1;
- 同时修改姓名和性别:
UPDATE student SET name='李四四', gender='女' WHERE id=2;
3. 注意事项
-
必须加
WHERE条件(否则会修改表中所有数据,造成数据污染); - 若需清空某个字段值,可设为
NULL(需字段允许为空,如UPDATE student SET age=NULL WHERE id=1;)。
(三)删除数据(DELETE)
1. 基本语法
DELETE FROM 表名 [WHERE 条件];
2. 示例
- 删除 student 表中 id=3 的数据:
DELETE FROM student WHERE id=3;
- 删除性别为 “女” 的数据:
DELETE FROM student WHERE gender='女';
3. 注意事项
-
必须加
WHERE条件(否则会删除表中所有数据,不可恢复); -
DELETE只能删除整行数据,不能单独删除某一列的值(需用UPDATE实现)。
五、DQL(数据查询语言)—— 表数据查询
DQL 是 SQL 中最常用的部分,用于从表中查询指定数据,支持条件、排序、分组、分页等复杂逻辑。
(一)完整语法结构
SELECT 字段列表 -- 1. 确定要查询的字段(如 * 表示所有字段)
FROM 表名列表 -- 2. 确定查询的表(单表/多表)
WHERE 条件列表 -- 3. 过滤行数据(查询前过滤)
GROUP BY 分组字段列表 -- 4. 按指定字段分组
HAVING 分组后条件列表 -- 5. 过滤分组结果(分组后过滤)
ORDER BY 排序字段列表 -- 6. 按指定字段排序
LIMIT 分页参数 -- 7. 限制查询结果条数(分页)
(二)核心查询功能
1. 基础查询(查询指定字段)
- 查询所有字段:
SELECT * FROM 表名;(如 SELECT * FROM student;);
- 查询指定字段:
SELECT 字段1, 字段2, ... FROM 表名;(如 SELECT id, name FROM student;)。
2. 条件查询(加 WHERE 过滤)
常用条件运算符
| 运算符类型 | 具体符号 / 关键字 | 功能描述 | 示例 |
|---|---|---|---|
| 比较运算符 |
>、>=、<、<=
|
大于、大于等于、小于、小于等于 |
WHERE age > 18(年龄大于 18) |
=(等于)、<> 或 !=(不等于) |
等于、不等于 |
WHERE gender = '男'(性别为男) |
|
BETWEEN ... AND ... |
在指定范围内(含边界) |
WHERE age BETWEEN 18 AND 25(年龄 18-25 岁) |
|
IN(...) |
在列表中选择(多选一) |
WHERE id IN(1,2,3)(id 为 1、2、3) |
|
LIKE 占位符 |
模糊匹配(_ 匹配 1 个字符,% 匹配任意个字符) |
WHERE name LIKE '张%'(姓张的所有姓名) |
|
IS NULL/IS NOT NULL
|
判断是否为空 |
WHERE age IS NULL(年龄为空) |
|
| 逻辑运算符 |
AND 或 &&
|
(并且)多个条件同时成立 |
WHERE age > 18 AND gender = '男'(18 岁以上男性) |
OR 或 || |
(或者)多个条件任意一个成立 |
WHERE age < 18 OR gender = '女'(18 岁以下或女性) |
|
NOT 或 !
|
(非)取反条件 |
WHERE NOT age > 18(年龄不大于 18) |
示例
查询 student 表中年龄 18-22 岁、姓名含 “李” 的学生:
SELECT id, name, age FROM student WHERE age BETWEEN 18 AND 22 AND name LIKE '%李%';
3. 聚合函数(纵向计算数据)
聚合函数将一列数据作为整体计算,NULL 值不参与运算。
| 函数名 | 功能 | 示例 |
|---|---|---|
COUNT |
统计非 NULL 值的数量 |
SELECT COUNT(id) FROM student;(统计学生总数) |
MAX |
求列的最大值 |
SELECT MAX(age) FROM student;(求最大年龄) |
MIN |
求列的最小值 |
SELECT MIN(age) FROM student;(求最小年龄) |
AVG |
求列的平均值 |
SELECT AVG(age) FROM student;(求平均年龄) |
SUM |
求列的总和 |
SELECT SUM(age) FROM student;(求年龄总和) |
4. 排序查询(ORDER BY)
基本语法
SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1, 字段2 排序方式2;
- 排序方式:
ASC(升序,默认,如从小到大)、DESC(降序,如从大到小); - 多字段排序:先按字段 1 排序,字段 1 值相同时,再按字段 2 排序。
示例
查询 student 表,按年龄降序排序,年龄相同时按 id 升序排序:
SELECT * FROM student ORDER BY age DESC, id ASC;
5. 分页查询(LIMIT)
基本语法(MySQL 特有)
SELECT 字段列表 FROM 表名 LIMIT 起始索引, 每页条数;
- 起始索引:从 0 开始(第 1 页起始索引为 0,第 2 页为 “每页条数”,以此类推);
- 公式:
起始索引 = (页码 - 1) * 每页条数。
示例
查询 student 表,每页显示 10 条数据,查询第 2 页:
SELECT * FROM student LIMIT 10, 10; -- 起始索引 10,每页 10 条
(三)DQL 执行顺序
编写顺序 ≠ 执行顺序,实际执行流程如下(需理解以优化查询效率):
-
FROM:确定查询的表; -
WHERE:过滤行数据(先过滤,再后续操作,减少数据量); -
GROUP BY:按字段分组; -
HAVING:过滤分组结果(对分组后的数据二次过滤); -
SELECT:提取指定字段; -
ORDER BY:对结果排序; -
LIMIT:限制结果条数(最后执行,减少数据传输量)。
六、DCL(数据控制语言)—— 用户与权限管理
DCL 主要用于管理 MySQL 用户和权限,通常由 DBA(数据库管理员)操作,开发人员使用较少。
(一)用户管理
| 操作需求 | SQL 语句格式 | 示例 |
|---|---|---|
| 查询所有用户 | USE mysql; SELECT * FROM user; |
切换到 mysql 系统库,查询 user 表(存储所有用户信息)。 |
| 创建用户 | CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码'; |
创建用户 test,允许所有主机访问,密码 123456:CREATE USER 'test'@'%' IDENTIFIED BY '123456';
|
| 修改用户密码 | ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码'; |
修改 test 用户密码为 654321:ALTER USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY '654321';
|
| 删除用户 | DROP USER '用户名'@'主机名'; |
删除 test 用户:DROP USER 'test'@'%';
|
说明
- 主机名:
%表示允许所有主机访问,localhost仅允许本地访问,192.168.1.%允许指定网段访问; -
mysql_native_password:MySQL 常用的密码加密方式,确保兼容性。
(二)权限控制
1. 常用权限(部分)
- 数据权限:
SELECT(查询)、INSERT(添加)、UPDATE(修改)、DELETE(删除); - 结构权限:
CREATE(创建)、ALTER(修改)、DROP(删除); - 全权限:
ALL(所有权限)。
2. 权限操作语法
| 操作需求 | SQL 语句格式 | 示例 |
|---|---|---|
| 查询用户权限 | SHOW GRANTS FOR '用户名'@'主机名'; |
查询 test 用户权限:SHOW GRANTS FOR 'test'@'%';
|
| 授予权限 | GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名'; |
授予 test 用户 student_db 库所有表的查询、添加权限:GRANT SELECT, INSERT ON student_db.* TO 'test'@'%';
|
| 撤销权限 | REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名'; |
撤销 test 用户的添加权限:REVOKE INSERT ON student_db.* FROM 'test'@'%';
|
说明
- 权限列表:多个权限用逗号分隔(如
SELECT, INSERT); - 通配符:
数据库名.*表示该库所有表,*.*表示所有库所有表(谨慎授予)。