2.2 表、列、行与数据类型


2.2 表、列、行与数据类型

本节摘要:表是存数据的基本单位,由列(结构)和行(数据)组成。每列有数据类型,决定能存什么。本节讲表的结构、常用数据类型怎么选。

先说结论

阅读完本节,你应当能够:

  1. 描述表、列、行的关系
  2. 区分常用数据类型并选对
  3. 理解 NULL 的含义和坑
  4. 看懂一张表的结构定义

概念脉络

一、表的结构

一张表由若干列(Column)和若干行(Row)组成。列定义结构——每列有名字和数据类型;行存数据——每行是一条记录,每行的同一列就是一个字段值。

以 Customers 表为例:

CustomerID FirstName LastName City
101 Alice Smith 北京
102 Bob Jones 上海

这里 4 列定义结构,2 行是数据。CustomerID 这列是整数类型,FirstName 是字符串类型。

二、常用数据类型

数据类型决定一列能存什么值、占多少空间。常用几类:

图 2-2 数据类型分类树

图 2-2 数据类型分类树

几个要点:

  • 金额用 DECIMALDECIMAL(10,2) 表示 10 位有效数字、2 位小数。浮点有精度误差,存金额会出问题。
  • 字符串多用 VARCHAR:可变长度,省空间。CHAR 是定长,不足补空格,适合固定长度(如国家代码)。
  • 日期用日期类型:别用字符串存日期,否则没法用日期函数比较运算。

三、NULL 的含义

NULL 表示"缺失或未知"的值,不是 0 也不是空字符串。它有几个坑:

  • 不能用 = 判断WHERE City = NULL 永远查不到,要用 WHERE City IS NULL
  • 参与运算结果为 NULLNULL + 1 = NULLNULL = NULL 结果是 NULL(不是 true)。
  • 聚合函数忽略 NULLCOUNT(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) );

每列:列名 + 数据类型(+ 可选约束)。看懂这个就知道一张表能存什么。

重点提炼

  • 表 = 列(结构)+ 行(数据),每行是一条记录。
  • 数据类型:数值(INT/DECIMAL)、字符串(VARCHAR/CHAR)、日期(DATE/DATETIME)、其他。
  • 金额用 DECIMAL,别用浮点;字符串多用 VARCHAR;日期用日期类型。
  • NULL 是缺失值,不是 0,用 IS NULL 判断,参与运算得 NULL,聚合函数忽略。
  • 表结构由建表语句定义,列名 + 类型 + 约束。

下一节讲主键和外键——把表连成关系网的关键。

常见疑问

Q1:VARCHAR 长度到底怎么定?

按业务实际最大值估算再加余量。比如姓名 VARCHAR(50) 一般够用,邮箱 VARCHAR(100),地址 VARCHAR(255)。定太长浪费空间(尤其有索引时),太短会被截断。经验法则:能短则短,但别让正常数据截断。

Q2:INT、BIGINT、DECIMAL 分别适合什么?

  • INT:整数,范围约正负 21 亿,适合 ID、数量、年龄。
  • BIGINT:更大的整数,适合订单号、时间戳(毫秒级)。
  • DECIMAL(10,2):精确小数,金额、价格、百分比——金额必须用它,不能用 FLOAT。浮点有二进制精度误差,存钱会算错。

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。

动手做一做

本章的内容最适合用一张真实的表来验证。建议你动手建一张练习表,字段故意覆盖几种类型:整数、可变长字符串、小数、日期、文本。

建好之后,做三件小事。

第一件:分别往表里插入几种类型的值,再尝试插入错误类型的值,比如往整数列里塞文字、往日期列里塞乱码,观察数据库报什么错。这一步能帮你建立"类型"的直觉——类型不是摆设,它在写入那一刻就开始把关。

第二件:体验空值的存在。插入一行不完全填写的记录,让某些列保持空值,然后用查询看这些空值显示成什么,再试着用等号判断空值,看看能不能查到。你会发现,判断空值必须用专门的关键字,这是新手最容易栽的坑。

第三件:查看表的结构定义,对照着你建表时写的语句,看每一列的类型、长度、约束是怎么一一对应的。

这三件事做完,你对"列的类型决定列能存什么""空值的特立独行""表结构怎么看"都会有切身体会。这些体会记在脑子里,比背任何定义都牢固。

一句话记忆

表是结构加数据的组合,列定义类型和约束,行存放具体记录。类型选对了,数据自然规整;空值处理错了,查询结果就会出怪问题。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U