MySQL 入门
本文目标:用最简单、最容易理解的方式讲清楚 mysql 里面的关键语法,特别是数据表的字段类型,比如 int、unsigned、varchar 等到底什么意思。
一、基础概念
数据库(database):存放表的容器,可以理解为一个文件夹。
表(table):由行(row,记录)和列(column,字段)组成的二维结构。
字段(column):表中的一列,决定了存储数据的类型,比如 int 表示整数,varchar 表示字符串。
记录(row):表中的一条具体数据。
二、sql 的几类
ddl(data definition language):定义数据库和表的结构,比如 create、alter、drop。
dml(data manipulation language):操作数据,比如 select、insert、update、delete。
dcl(data control language):权限相关,比如 grant、revoke。
tcl(transaction control language):事务控制,比如 start transaction、commit、rollback。
三、create 示例
创建数据库:
create database blog_db character set utf8mb4 collate utf8mb4_unicode_ci;
use blog_db;
创建数据表:
create table users (id int unsigned not null auto_increment, -- 整数,非负,自增username varchar(50) not null, -- 可变长度字符串,最多 50 个字符email varchar(100) not null unique, -- 唯一值password_hash varchar(255) not null, -- 存密码的加密串is_active tinyint(1) not null default 1, -- 状态字段,1 表示启用,0 表示禁用created_at datetime default current_timestamp,primary key (id),index idx_username (username)
) engine=innodb default charset=utf8mb4;
四、常见数据类型(解释到位)
数值类型
int:整数类型,通常用来存放 id。范围是 -2147483648 到 2147483647。
int unsigned:无符号整数,范围变为 0 到 4294967295。
unsigned
的意思就是不允许负数。tinyint:非常小的整数,范围 -128 到 127。如果加上 unsigned,就是 0 到 255。经常用来表示布尔值或状态。
bigint:特别大的整数,范围比 int 大得多,适合存放大数据量的 id。
decimal(m,n):精确小数,常用于存金额。m 是总位数,n 是小数位数。
字符串类型
char(n):固定长度字符串,比如 char(2) 存省份简称 “bj”。
varchar(n):可变长度字符串,常见类型,比如 varchar(50) 表示最多存 50 个字符。
text:长文本,适合存放文章内容。不同大小有 text、mediumtext、longtext。
日期和时间
date:只存日期,比如 2025-08-26。
datetime:存日期和时间,不随时区变化。
timestamp:存日期和时间,会跟随时区自动转换。
布尔
mysql 里没有真正的 boolean 类型,通常用 tinyint(1) 表示,0 为 false,1 为 true。
其他
blob:二进制大对象,存文件或图片。
enum:枚举类型,只能选定几个固定值,比如 enum('draft','published','deleted')。
五、约束和索引
primary key:主键,唯一且不能为空。
unique:唯一约束,保证该列不能有重复。
not null:不能是空值。
default:设置默认值。
foreign key:外键,用来建立表与表之间的联系。
索引(index)是用来加快查询速度的,但会增加写入成本。
六、crud 示例
插入:
insert into users (username, email, password_hash)
values ('zhangsan','zhang@example.com','123456');
查询:
select id, username from users where is_active = 1 order by created_at desc limit 10;
更新:
update users set is_active = 0 where id = 1;
删除:
delete from users where id = 1;
七、join 示例
select p.id, p.title, u.username
from posts p
inner join users u on p.user_id = u.id
where p.status = 'published';
inner join:两边都有才显示。
left join:左边一定显示,右边没有就 null。
八、事务
start transaction;
update users set is_active = 0 where id = 2;
rollback; -- 回滚
commit; -- 提交
事务保证多条语句要么全部执行成功,要么全部不生效。
九、小结
int:整数,常用于主键。
unsigned:无符号,表示不允许负数,范围翻倍。
varchar:变长字符串。
tinyint:小整数,常当作布尔。
decimal:存钱最安全。
datetime / timestamp:时间戳字段。