Archipelago

Lec 3SQL 基础——数据类型、建库建表与 SELECT

讲义完成更新于 2026-09-29

Lec 3 SQL 基础——数据类型、建库建表与 SELECT(Database Queries)

对应 MIT CTL.SC4x · Supply Chain Technology and Systems · 第 3 讲
核心参考:SC4x Key Concept Document (Summer 2019) & MITx MicroMasters SCM 课程大纲

TL;DR

  • 结构化查询语言(SQL)是提取与操作关系数据库的标准声明式语言。
  • DDL 负责定义数据库架构(CREATE、ALTER、DROP)与字段精度(VARCHAR、INT、DECIMAL)。
  • SELECT 基础语句通过列投影、算术运算与别名实现高效基础数据过滤与重构。

供应链数据精度的底层雷区

在设计物料价格、运费结算与高精度称重计量字段时,绝对不能使用 FLOAT 或 REAL 等浮点数类型。浮点数的二进制近似表示会在海量聚合运算中累积舍入误差,导致月底财务账目出现不可对齐的“神秘几分钱”。必须无条件选用定点数 DECIMAL(M, D) 或 NUMERIC,这是供应链与金融系统最基础的工程底线。

1. 从模型到可查询的数据库

Lec2 把数据设计成了关系模型;本讲开始动手操作数据库本身——SQL(Structured Query Language,结构化查询语言)。有效查询大型数据库的能力,是把"大数据"真正利用起来的关键。SQL 是一门语言,包含了创建、管理、查询关系数据库所需的命令。技术与系统领域的常态是:市面上有大量厂商提供 SQL 的不同实现版本,但它们都共享一套通用的数据类型和命令集合——SQL 具有跨操作系统、(在大体上)跨厂商的可移植性。

2. SQL 语言本身的性质

SQL 不像 Java、Visual Basic 或 C++ 那样是一门完整的编程语言;它是一个大约包含 30 种语句类型的子语言(sub-language),通常被嵌入在其他语言或工具里使用,来实现对数据库的访问。

SQL 涵盖的五类核心操作:

类别说明
数据定义(Data Definition)建表、建视图(虚拟表)等操作
数据操纵(Data Manipulation)INSERT、DELETE、UPDATE 或用 SELECT 检索数据
数据完整性(Data Integrity)通过参照完整性和事务机制强制主键/外键约束
访问控制(Access Control)面向多类用户的安全机制
数据共享(Data Sharing)支持并发用户访问同一数据库

需要留意的坑:

  • SQL 存在一些不一致性,其中 NULL 的处理尤其容易踩坑(下一讲详述);
  • SQL 是声明式语言(declarative),不是过程式语言(procedural)——你写的命令描述的是"想要什么结果",而不是"具体怎么一步步做到",如何实现留给数据库应用自己去解决。

2.1 不同厂商实现之间的差异

即便都叫"SQL",不同数据库产品的实现仍会在以下方面出现差异:错误代码、支持的数据类型(日期/时间、货币、字符串的具体变体)、是否区分大小写、系统表(数据库自身结构)、编程接口(没有任何厂商完全遵循同一标准)、报表与查询生成工具、标准内的厂商自定义变体、数据库初始化/打开/连接方式。

3. MySQL 核心数据类型

由于跨数据库存在差异,教材以 MySQL 为例讲解数据类型。MySQL 有三大类:数值型、字符串(文本)型、日期/时间型。

数值型(Numeric)

类型说明
INT标准整数
BIGINT大整数
DECIMAL定点数
FLOAT单精度浮点数
DOUBLE双精度浮点数
BIT位字段

字符串型(Strings / Text)

类型说明
CHAR定长非二进制字符串
VARCHAR变长非二进制字符串
NCHAR / NVARCHAR同上 + Unicode 支持
BINARY / VARBINARY定长/变长二进制字符串
TINYBLOB / BLOB二进制大对象(小型)
TEXT小型非二进制字符串

日期/时间型(Dates/Times)

类型格式
DATECCYY-MM-DD
TIMEhh:mm:ss
DATETIMECCYY-MM-DD hh:mm:ss
TIMESTAMPCCYY-MM-DD hh:mm:ss
YEARCCYY 或 YY

4. 创建数据库与表

创建数据库:

CREATE DATABASE db_name;
USE db_name;         -- 告诉系统接下来使用哪个数据库

创建表:

  • 用 CREATE TABLE 声明新表;
  • 可以设定每个属性(列)的名称和数据类型;
  • 建表时可以指定主键、外键关系;
  • 可以决定某列是否允许 NULL(空值)。

4.1 导入数据是对数据模型的一次"压力测试"

数据模型设计得好不好,往往要等真正插入数据时才见分晓:

  • 如果数据库建库顺利、几乎没有报错——很可能说明你确实找准了真实的业务规则;
  • 如果有一些错误——可能业务规则是对的,但数据本身比较"脏"(messy);
  • 如果建库时报错很多——很可能说明当初总结的业务规则本身就不准确。

因此实践中常见做法:先取一份样本数据边导入边浏览,逐步验证模型是否合理,而不是一次性导入全部数据。

5. SELECT 查询

SELECT 用于从数据库表中取数,返回结果以"结果表"的形式呈现,是绝大多数应用中使用频率最高的数据操纵命令。一条 SELECT 语句由一系列**子句(clause)**构成,从一个或多个表/视图中取出记录。

子句必须按固定顺序出现;其中只有 SELECT 和 FROM 是必需的:

子句作用
SELECT选择要返回的属性/列
INTO把结果写入新表
FROM指定来源表或视图
WHERE指定具体记录或建立连接(join)的条件
GROUP BY按属性分组
HAVING对分组结果再做条件筛选
ORDER BY指定排序方式:ASC(升序)| DESC(降序)
DISTINCT只返回去重后的不同取值

5.1 通配符(Wildcards)

多数数据库实现都提供额外的正则表达式风格通配符,可以匹配复杂的字符串模式。MySQL 的例子:

  • [list]:匹配 list 中任意单个字符,如 [a-f];
  • [^list]:匹配不在 list 中的任意单个字符,如 [^h-m]。

6. 编辑表中的数据

命令作用
INSERT向表中新增一条记录,为一组属性指定具体取值
UPDATE修改表中一条或一组记录的某个值或某组值
DELETE删除满足特定条件的记录

7. 本讲小结与学习目标回顾

  • 熟悉 SQL 的定位:一个约 30 种语句的声明式子语言,而非完整编程语言;
  • 认识到不同 SQL 实现之间存在差异,使用时需留意;
  • 复习了 MySQL 的三大类数据类型;
  • 学会如何创建新的数据库和表;
  • 理解如何使用 SELECT 查询;
  • 熟悉通配符及其使用场景;
  • 复习了如何编辑(增/改/删)表中的数据。

下一讲(Lec 4):只会 SELECT * 还不够——进入 SQL 进阶:条件筛选、NULL 处理、分组统计、排序抽样,以及多表连接(JOIN)与视图(VIEW)。