Appearance
第3章:MySQL 核心基础概念
3.1 数据库核心概念
通俗讲解
数据库(Database)
定义:存储数据的"容器",用于组织和管理相关数据。
类比:就像一个大仓库,里面可以存放各种货物(数据)。
示例:
学校管理系统
├── 学生数据库(student_db)
├── 教师数据库(teacher_db)
└── 课程数据库(course_db)数据表(Table)
定义:数据库中的"表格",用于分类存储数据,由行和列组成。
类比:就像 Excel 表格,有表头(字段)和数据行(记录)。
示例:
学生表(students)
┌────┬────────┬─────┬────────┐
│ ID │ 姓名 │ 年龄 │ 班级 │
├────┼────────┼─────┼────────┤
│ 1 │ 张三 │ 18 │ 一班 │
│ 2 │ 李四 │ 19 │ 二班 │
│ 3 │ 王五 │ 18 │ 一班 │
└────┴────────┴─────┴────────┘字段(Field/Column)
定义:表格中的"列",定义了数据的属性。
常见字段:
| 字段名 | 说明 | 示例值 |
|---|---|---|
| id | 唯一标识 | 1, 2, 3 |
| name | 姓名 | 张三, 李四 |
| age | 年龄 | 18, 19 |
| class | 班级 | 一班, 二班 |
| 邮箱 | zhangsan@example.com |
记录(Record/Row)
定义:表格中的"行",每一行对应一条完整的数据。
示例:
一条学生记录:
ID: 1, 姓名: 张三, 年龄: 18, 班级: 一班
这行数据包含了该学生的所有信息主键(Primary Key)
定义:唯一标识一条记录的字段,具有唯一性和非空性。
特点:
- 唯一性:每条记录的主键值都不同
- 非空性:主键不能为空
- 不可重复:不能有两条记录使用相同的主键
示例:
sql
-- 学生表,使用 id 作为主键
CREATE TABLE students (
id INT PRIMARY KEY, -- 主键
name VARCHAR(50),
age INT
);
-- 数据示例
id: 1, name: '张三' -- 合法
id: 2, name: '李四' -- 合法
id: 1, name: '王五' -- 错误!id 重复概念关系图
数据库(Database)
│
├── 数据表1(Table)
│ │
│ ├── 字段1(Field)
│ ├── 字段2(Field)
│ └── 字段3(Field)
│
│ 记录1(Record): 值1, 值2, 值3
│ 记录2(Record): 值1, 值2, 值3
│ 记录3(Record): 值1, 值2, 值3
│
├── 数据表2(Table)
│ │
│ └── ...
│
└── 数据表3(Table)
│
└── ...3.2 数据类型
常用数据类型
整数类型
| 类型 | 大小 | 范围(有符号) | 用途 |
|---|---|---|---|
| TINYINT | 1 字节 | -128 ~ 127 | 小范围整数(年龄、状态) |
| SMALLINT | 2 字节 | -32768 ~ 32767 | 较小范围整数 |
| INT | 4 字节 | -21亿 ~ 21亿 | 常用整数(ID、数量) |
| BIGINT | 8 字节 | 极大范围 | 大整数(用户ID、订单号) |
使用建议:
sql
-- 年龄:使用 TINYINT(0-150 足够)
age TINYINT UNSIGNED
-- 用户ID:使用 INT(一般足够)
user_id INT
-- 订单号:使用 BIGINT(可能很大)
order_id BIGINT字符串类型
| 类型 | 说明 | 最大长度 | 用途 |
|---|---|---|---|
| CHAR(n) | 固定长度 | 255 字符 | 固定长度(手机号、身份证号) |
| VARCHAR(n) | 可变长度 | 65535 字符 | 常用字符串(姓名、地址) |
| TEXT | 长文本 | 65535 字节 | 文章内容、描述 |
| LONGTEXT | 超长文本 | 4GB | 大文本(文章内容、日志) |
CHAR vs VARCHAR:
sql
-- CHAR(10):固定占用 10 个字符空间
-- 存储 'abc',实际占用 10 个字符(补空格)
phone CHAR(11) -- 手机号,固定11位
-- VARCHAR(10):按实际长度存储
-- 存储 'abc',实际占用 3 个字符
name VARCHAR(50) -- 姓名,长度不固定使用建议:
sql
-- 固定长度:CHAR
phone CHAR(11) -- 手机号
id_card CHAR(18) -- 身份证号
-- 可变长度:VARCHAR
name VARCHAR(50) -- 姓名
email VARCHAR(100) -- 邮箱
address VARCHAR(200) -- 地址
-- 长文本:TEXT
description TEXT -- 商品描述
content LONGTEXT -- 文章内容日期时间类型
| 类型 | 格式 | 用途 |
|---|---|---|
| DATE | YYYY-MM-DD | 日期(生日、纪念日) |
| TIME | HH:MM:SS | 时间 |
| DATETIME | YYYY-MM-DD HH:MM:SS | 日期时间(创建时间、更新时间) |
| TIMESTAMP | YYYY-MM-DD HH:MM:SS | 时间戳(自动更新) |
| YEAR | YYYY | 年份 |
使用示例:
sql
-- 生日(只需要日期)
birthday DATE
-- 创建时间(日期时间)
created_at DATETIME
-- 自动记录更新时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP小数类型
| 类型 | 说明 | 用途 |
|---|---|---|
| FLOAT | 单精度浮点数 | 科学计算(精度要求不高) |
| DOUBLE | 双精度浮点数 | 科学计算(精度要求较高) |
| DECIMAL(M,D) | 定点数 | 金额(精确计算) |
DECIMAL 说明:
sql
-- DECIMAL(10, 2):总共10位,小数点后2位
-- 范围:-99999999.99 到 99999999.99
price DECIMAL(10, 2) -- 商品价格,如 199.99重要提示:
sql
-- 金额计算必须使用 DECIMAL,避免精度丢失
-- 错误:使用 FLOAT/DOUBLE
price FLOAT -- 可能导致 199.99 变成 199.9899999
-- 正确:使用 DECIMAL
price DECIMAL(10, 2) -- 精确存储 199.99其他类型
| 类型 | 说明 | 用途 |
|---|---|---|
| BOOLEAN | 布尔值 | 是/否、真/假(实际用 TINYINT(1)) |
| ENUM | 枚举 | 固定选项(性别:男/女) |
| SET | 集合 | 多选(爱好:音乐/运动/阅读) |
| BLOB | 二进制数据 | 图片、文件(不推荐直接存数据库) |
使用示例:
sql
-- 布尔值
is_active BOOLEAN -- 1 表示 true,0 表示 false
-- 枚举
gender ENUM('男', '女') -- 只能选择男或女
-- 集合
hobbies SET('音乐', '运动', '阅读', '旅游') -- 可多选数据类型选择技巧
选择原则
- 够用就好:不要过度设计,选择满足需求的最小类型
- 考虑扩展:预留一定扩展空间
- 性能优先:小类型比大类型性能更好
- 精确计算:金额等需要精确计算的使用 DECIMAL
常见场景推荐
sql
-- 用户表
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT, -- ID,自增
username VARCHAR(50) NOT NULL, -- 用户名
email VARCHAR(100), -- 邮箱
phone CHAR(11), -- 手机号,固定长度
age TINYINT UNSIGNED, -- 年龄,小整数
gender ENUM('男', '女'), -- 性别,枚举
birthday DATE, -- 生日,日期
balance DECIMAL(10, 2), -- 余额,金额
is_active BOOLEAN DEFAULT TRUE, -- 是否激活
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时间
);3.3 MySQL 编码设置
为什么需要设置编码?
问题:如果不设置编码,存储中文时可能出现乱码。
原因:
- 默认编码可能不支持中文
- 客户端、服务器、数据库编码不一致
推荐编码:UTF-8(utf8mb4)
utf8 vs utf8mb4:
utf8:MySQL 早期实现,最多 3 字节,不支持 emojiutf8mb4:完整 UTF-8 实现,4 字节,支持所有字符(推荐)
查看当前编码
sql
-- 查看服务器字符集
SHOW VARIABLES LIKE 'character_set_server';
-- 查看数据库字符集
SHOW VARIABLES LIKE 'character_set_database';
-- 查看客户端字符集
SHOW VARIABLES LIKE 'character_set_client';
-- 查看所有字符集设置
SHOW VARIABLES LIKE 'character_set_%';设置编码
1. 创建数据库时指定编码
sql
CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;2. 创建表时指定编码
sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;3. 修改数据库编码
sql
ALTER DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;4. 修改表编码
sql
ALTER TABLE users
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;5. 客户端连接时设置编码
sql
-- 在连接后执行
SET NAMES utf8mb4;
-- 或在连接命令中指定
mysql -u root -p --default-character-set=utf8mb43.4 实操案例
创建第一个数据库
sql
-- 1. 登录 MySQL
mysql -u root -p
-- 2. 创建数据库(指定编码)
CREATE DATABASE school_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 3. 查看所有数据库
SHOW DATABASES;
-- 4. 使用数据库
USE school_db;
-- 5. 查看当前数据库
SELECT DATABASE();创建第一个数据表
sql
-- 创建学生表
CREATE TABLE students (
-- 主键:自增ID
id INT PRIMARY KEY AUTO_INCREMENT,
-- 学生姓名:必填,最长50字符
name VARCHAR(50) NOT NULL,
-- 年龄:小整数,无符号(0-255)
age TINYINT UNSIGNED,
-- 性别:枚举类型
gender ENUM('男', '女') DEFAULT '男',
-- 班级:可变长度字符串
class VARCHAR(20),
-- 手机号:固定长度
phone CHAR(11),
-- 邮箱:可变长度
email VARCHAR(100),
-- 入学日期:日期类型
enrollment_date DATE,
-- 是否在读:布尔值
is_active BOOLEAN DEFAULT TRUE,
-- 创建时间:自动记录
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-- 更新时间:自动更新
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 查看表结构
DESC students;
-- 查看创建表的SQL
SHOW CREATE TABLE students;插入测试数据
sql
-- 插入单条数据
INSERT INTO students (name, age, gender, class, phone, email, enrollment_date)
VALUES ('张三', 18, '男', '一班', '13800138000', 'zhangsan@example.com', '2024-09-01');
-- 插入多条数据
INSERT INTO students (name, age, gender, class, phone, email, enrollment_date) VALUES
('李四', 19, '女', '二班', '13800138001', 'lisi@example.com', '2024-09-01'),
('王五', 18, '男', '一班', '13800138002', 'wangwu@example.com', '2024-09-01'),
('赵六', 20, '女', '三班', '13800138003', 'zhaoliu@example.com', '2024-09-01');
-- 查询所有数据
SELECT * FROM students;查询结果
+----+--------+------+--------+-------+-------------+----------------------+---------------------+-----------+---------------------+---------------------+
| id | name | age | gender | class | phone | email | enrollment_date | is_active | created_at | updated_at |
+----+--------+------+--------+-------+-------------+----------------------+---------------------+-----------+---------------------+---------------------+
| 1 | 张三 | 18 | 男 | 一班 | 13800138000 | zhangsan@example.com | 2024-09-01 | 1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 2 | 李四 | 19 | 女 | 二班 | 13800138001 | lisi@example.com | 2024-09-01 | 1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 3 | 王五 | 18 | 男 | 一班 | 13800138002 | wangwu@example.com | 2024-09-01 | 1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
| 4 | 赵六 | 20 | 女 | 三班 | 13800138003 | zhaoliu@example.com | 2024-09-01 | 1 | 2024-01-15 10:30:00 | 2024-01-15 10:30:00 |
+----+--------+------+--------+-------+-------------+----------------------+---------------------+-----------+---------------------+---------------------+小结
通过本章的学习,你掌握了:
- ✅ 数据库核心概念(数据库、表、字段、记录、主键)
- ✅ MySQL 常用数据类型及选择技巧
- ✅ MySQL 编码设置(UTF-8/utf8mb4)
- ✅ 创建了第一个数据库和数据表
这些基础概念是学习 SQL 语法的前提,理解它们将帮助你更好地掌握后续的内容。继续学习 第4章:SQL 基础入门。
