1. 引言
MySQL 作为全球最流行的开源关系型数据库之一,是后端开发、数据分析乃至全栈工程师的必备技能。无论是构建一个简单的博客系统,还是支撑亿级流量的电商平台,扎实的 MySQL 基础都是成功的基石。
本文旨在为你提供一份系统、全面的 MySQL 入门指南,聚焦于三大核心模块:
- 基础概念:理解数据库、表、行、列等核心术语。
- 数据类型:掌握如何为数据选择合适的“容器”,这是设计高效表结构的关键。
- 库表操作:从创建数据库到管理表结构,通过 SQL 语句实践数据定义语言(DDL)。
通过本文,你将能够独立完成数据库环境的搭建、表结构的设计与创建,并为后续的数据操作(增删改查)打下坚实基础。
2. 核心概念梳理
在动手操作之前,先明确几个核心概念,这有助于你理解后续的 SQL 语句在操作什么。
数据库 (Database)
一个数据库是一个逻辑上的容器,用于存储一组相关的数据。你可以把它想象成一个文件柜,里面存放着多个文件夹(表)。表 (Table)
表是数据库中实际存储数据的结构,由行和列组成。它类似于 Excel 中的一个工作表。每个表都有一个唯一的名称。列 (Column) / 字段 (Field)
表由列定义,每一列代表一种特定类型的数据(例如:id,name,age)。列定义了数据的“形状”和“类型”。行 (Row) / 记录 (Record)
表中的每一行代表一条具体的数据记录。例如,一个users表中,每一行就是一个用户的信息。主键 (Primary Key)
主键是表中一列或一组列,其值能唯一标识表中的每一行。主键列的值不能为 NULL,且必须唯一。通常使用id列作为主键。SQL (Structured Query Language)
结构化查询语言,是与关系型数据库通信的标准语言。它主要分为几类:- DDL (Data Definition Language):数据定义语言,用于定义或修改数据库和表结构。如
CREATE,ALTER,DROP。 - DML (Data Manipulation Language):数据操作语言,用于操作表中的数据。如
SELECT,INSERT,UPDATE,DELETE。 - DCL (Data Control Language):数据控制语言,用于控制访问权限。如
GRANT,REVOKE。
- DDL (Data Definition Language):数据定义语言,用于定义或修改数据库和表结构。如
3. 数据类型详解
为列选择合适的数据类型至关重要,它影响数据的存储效率、完整性和查询性能。MySQL 支持多种数据类型,主要分为以下几类:
3.1 数值类型
用于存储数字。
| 类型 | 说明 | 示例/范围 |
|---|---|---|
INT/INTEGER | 标准整数,最常用。 | -2147483648到2147483647 |
BIGINT | 大整数。 | 更大范围的整数 |
DECIMAL(M, D) | 精确小数,M 是总位数,D 是小数位数。适用于金融等需要精确计算的场景。 | DECIMAL(10, 2)可存储12345678.12 |
FLOAT | 单精度浮点数,近似值。 | |
DOUBLE | 双精度浮点数,近似值。 |
3.2 字符串类型
用于存储文本。
| 类型 | 说明 | 特点 |
|---|---|---|
CHAR(N) | 定长字符串。 | 长度固定为 N 个字符,不足部分用空格填充,检索速度快。 |
VARCHAR(N) | 变长字符串。 | 长度可变,最大长度为 N 个字符,节省存储空间。最常用。 |
TEXT | 长文本数据。 | 可存储大量文本(如文章内容),最大支持约 65KB (TEXT),还有MEDIUMTEXT,LONGTEXT。 |
3.3 日期与时间类型
用于存储时间点或时间段。
| 类型 | 格式 | 说明 |
|---|---|---|
DATE | YYYY-MM-DD | 仅存储日期。 |
TIME | HH:MM:SS | 仅存储时间。 |
DATETIME | YYYY-MM-DD HH:MM:SS | 存储日期和时间。与时区无关。 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 存储日期和时间。与时区有关,范围较小(1970-01-01到2038-01-19),但具有自动初始化/更新特性。 |
3.4 其他类型
ENUM:枚举类型,值必须从预定义列表中选取。例如ENUM('男', '女')。SET:集合类型,值可以从预定义列表中选取零个或多个。BOOLEAN/BOOL:本质上是TINYINT(1)的别名,0 表示 FALSE,非 0 表示 TRUE。
选择建议:
- 整数用
INT,大整数用BIGINT。 - 金额、精确小数用
DECIMAL。 - 可变长度字符串几乎总是用
VARCHAR。 - 日期时间通常用
DATETIME,如果需要自动记录行创建/更新时间,可考虑TIMESTAMP。
4. 数据库操作 (DDL)
4.1 创建数据库
CREATEDATABASE`my_database`CHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;CHARACTER SET utf8mb4:设置字符集为utf8mb4,支持存储所有 Unicode 字符(包括 Emoji)。COLLATE utf8mb4_unicode_ci:设置排序规则为utf8mb4_unicode_ci,进行不区分大小写的比较。
4.2 查看数据库
-- 查看所有数据库SHOWDATABASES;-- 查看特定数据库的创建信息SHOWCREATEDATABASE`my_database`;4.3 选择/使用数据库
在对表进行操作前,必须先指定要操作的数据库。
USE`my_database`;4.4 删除数据库
(危险操作!会删除数据库内所有数据,不可恢复)
DROPDATABASE`my_database`;5. 数据表操作 (DDL)
5.1 创建表
创建表需要定义表名、列名、列的数据类型以及约束(如主键、非空等)。
CREATETABLE`users`(`id`INTUNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT'用户ID,主键',`username`VARCHAR(50)NOTNULLUNIQUECOMMENT'用户名,唯一',`email`VARCHAR(100)NOTNULLUNIQUECOMMENT'邮箱,唯一',`password_hash`CHAR(64)NOTNULLCOMMENT'密码哈希值',`age`TINYINTUNSIGNEDCOMMENT'年龄',`gender`ENUM('男','女','其他')DEFAULT'其他'COMMENT'性别',`created_at`DATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`updated_at`DATETIMENOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间',PRIMARYKEY(`id`),-- 定义主键INDEX`idx_username`(`username`)-- 为 username 创建索引,加速查询)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_unicode_ciCOMMENT='用户表';关键点解析:
NOT NULL:该列不允许存储NULL值。AUTO_INCREMENT:自动递增,常用于主键。UNIQUE:该列的值必须唯一。DEFAULT:指定列的默认值。COMMENT:为列或表添加注释,提高可读性。PRIMARY KEY (id):将id列设为主键。INDEX idx_username (username):在username列上创建名为idx_username的索引。ENGINE=InnoDB:指定存储引擎为 InnoDB(支持事务、行级锁,推荐)。DEFAULT CHARSET=utf8mb4:设置表的默认字符集。
5.2 查看表
-- 查看当前数据库中的所有表SHOWTABLES;-- 查看表的结构(列定义)DESCRIBE`users`;-- 或SHOWCOLUMNSFROM`users`;-- 查看表的创建语句(包含所有细节)SHOWCREATETABLE`users`;5.3 修改表结构
使用ALTER TABLE语句。
添加列:
ALTERTABLE`users`ADDCOLUMN`avatar_url`VARCHAR(255)COMMENT'头像链接'AFTER`email`;修改列定义:
ALTERTABLE`users`MODIFYCOLUMN`username`VARCHAR(100)NOTNULLCOMMENT'修改后的用户名';重命名列:
ALTERTABLE`users`CHANGECOLUMN`age``user_age`TINYINTUNSIGNEDCOMMENT'用户年龄';删除列:
ALTERTABLE`users`DROPCOLUMN`gender`;添加索引:
ALTERTABLE`users`ADDINDEX`idx_email`(`email`);5.4 重命名表
RENAMETABLE`old_users`TO`new_users`;5.5 删除表
(危险操作!会删除表及其所有数据,不可恢复)
DROPTABLE`users`;6. 约束与索引
6.1 常用约束
约束用于确保表中数据的准确性和可靠性。
- 主键约束 (PRIMARY KEY):唯一且非空。
- 唯一约束 (UNIQUE):确保某列或列组合的值唯一。
- 非空约束 (NOT NULL):确保列不能有
NULL值。 - 默认约束 (DEFAULT):当插入数据未指定该列值时,使用默认值。
- 外键约束 (FOREIGN KEY):确保一个表中的数据匹配另一个表中值的有效性(引用完整性)。本文为入门指南,外键将在进阶篇详细讨论。
6.2 索引
索引就像书的目录,能极大加快数据检索速度,但会增加写操作(增、删、改)的开销和存储空间。
- 主键索引 (PRIMARY):自动创建,唯一且非空。
- 唯一索引 (UNIQUE):确保索引列的值唯一。
- 普通索引 (INDEX/KEY):最基本的索引,仅用于加速查询。
- 创建时机:通常在
WHERE、ORDER BY、JOIN条件中频繁使用的列上创建索引。
7. 总结与实践建议
通过本文,你已经系统梳理了 MySQL 的基础概念、数据类型和库表操作(DDL)。这是你数据库之旅的第一步。
下一步学习建议:
- 动手实践:在本地或在线 MySQL 环境中,按照本文的 SQL 示例逐一执行,观察结果。
- 设计表结构:尝试为一个简单的博客系统(包含用户、文章、评论)设计表结构,并写出
CREATE TABLE语句。 - 深入学习 DML:掌握
INSERT(插入)、SELECT(查询)、UPDATE(更新)、DELETE(删除)语句,这是与数据交互的核心。 - 探索进阶主题:了解事务(Transaction)、视图(View)、存储过程(Stored Procedure)等高级特性。
记住,理解概念后,持续的编码实践是掌握 SQL 的唯一途径。