Lec 3SQL 基础——数据类型、建库建表与 SELECT
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)
| 类型 | 格式 |
|---|---|
| DATE | CCYY-MM-DD |
| TIME | hh:mm:ss |
| DATETIME | CCYY-MM-DD hh:mm:ss |
| TIMESTAMP | CCYY-MM-DD hh:mm:ss |
| YEAR | CCYY 或 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)。