本节摘要:表是存数据的基本单位,由列(结构)和行(数据)组成。每列有数据类型,决定能存什么。本节讲表的结构、常用数据类型怎么选。
阅读完本节,你应当能够:
一张表由若干列(Column)和若干行(Row)组成。列定义结构——每列有名字和数据类型;行存数据——每行是一条记录,每行的同一列就是一个字段值。
以 Customers 表为例:
| CustomerID | FirstName | LastName | City |
|---|---|---|---|
| 101 | Alice | Smith | 北京 |
| 102 | Bob | Jones | 上海 |
这里 4 列定义结构,2 行是数据。CustomerID 这列是整数类型,FirstName 是字符串类型。
数据类型决定一列能存什么值、占多少空间。常用几类:

几个要点:
DECIMAL(10,2) 表示 10 位有效数字、2 位小数。浮点有精度误差,存金额会出问题。NULL 表示"缺失或未知"的值,不是 0 也不是空字符串。它有几个坑:
WHERE City = NULL 永远查不到,要用 WHERE City IS NULL。NULL + 1 = NULL,NULL = NULL 结果是 NULL(不是 true)。COUNT(City) 不数 NULL 的行,COUNT(*) 数所有行。SELECT COUNT(*) FROM Customers; -- 所有行数 SELECT COUNT(City) FROM Customers; -- City 非 NULL 的行数 SELECT * FROM Customers WHERE City IS NULL; -- 查 City 为空的
⚠️ 常见坑:用
WHERE x = NULL查空值查不到,必须用IS NULL。这是新手最常犯的错之一。
建表语句定义表结构,第 6 章会细讲,这里先认个脸:
CREATE TABLE Customers ( CustomerID INT, FirstName VARCHAR(50), LastName VARCHAR(50), City VARCHAR(50), Amount DECIMAL(10,2) );
每列:列名 + 数据类型(+ 可选约束)。看懂这个就知道一张表能存什么。
IS NULL 判断,参与运算得 NULL,聚合函数忽略。下一节讲主键和外键——把表连成关系网的关键。
Q1:VARCHAR 长度到底怎么定?
按业务实际最大值估算再加余量。比如姓名 VARCHAR(50) 一般够用,邮箱 VARCHAR(100),地址 VARCHAR(255)。定太长浪费空间(尤其有索引时),太短会被截断。经验法则:能短则短,但别让正常数据截断。
Q2:INT、BIGINT、DECIMAL 分别适合什么?
Q3:什么时候用 TEXT,什么时候用 VARCHAR?
短文本用 VARCHAR(支持索引、有长度限制、性能好),长文本(文章正文、评论、JSON 存储)用 TEXT。注意 TEXT 类型不能有默认值,且部分场景不可直接建普通索引(要前缀索引)。
Q4:NULL 参与运算到底会发生什么?
NULL 是"未知",任何运算含 NULL 结果都是 NULL:NULL + 1 是 NULL,NULL = 0 是 NULL(不是 false),WHERE x = NULL 永远查不到。所以判断空必须用 IS NULL,处理空值用 COALESCE(x, 默认值)。这个坑几乎所有新手都踩过,记住三条就够:IS NULL 判断、COALESCE 兜底、COUNT(列) 跳过 NULL。
本章的内容最适合用一张真实的表来验证。建议你动手建一张练习表,字段故意覆盖几种类型:整数、可变长字符串、小数、日期、文本。
建好之后,做三件小事。
第一件:分别往表里插入几种类型的值,再尝试插入错误类型的值,比如往整数列里塞文字、往日期列里塞乱码,观察数据库报什么错。这一步能帮你建立"类型"的直觉——类型不是摆设,它在写入那一刻就开始把关。
第二件:体验空值的存在。插入一行不完全填写的记录,让某些列保持空值,然后用查询看这些空值显示成什么,再试着用等号判断空值,看看能不能查到。你会发现,判断空值必须用专门的关键字,这是新手最容易栽的坑。
第三件:查看表的结构定义,对照着你建表时写的语句,看每一列的类型、长度、约束是怎么一一对应的。
这三件事做完,你对"列的类型决定列能存什么""空值的特立独行""表结构怎么看"都会有切身体会。这些体会记在脑子里,比背任何定义都牢固。
表是结构加数据的组合,列定义类型和约束,行存放具体记录。类型选对了,数据自然规整;空值处理错了,查询结果就会出怪问题。