精读笔记 · 第20章 SQL 数据库操作语言(DDL 库/表/类型/约束)
大约 5 分钟
精读笔记 · 第20章 SQL 数据库操作语言(DDL 库/表/类型/约束)
精读整理自 RHCE9 随堂讲义(原文字版 29 页)|同名视频约 16 节(第02套) 关联知识文件:
分章笔记/02-Oracle(SQL 通用语法可对照)、03-常用命令速查表
一、SQL 与库概念
- SQL 由 IBM 开发,用于存取/查询/更新/管理关系数据库。四大类见第 19 章(DDL/DML/DQL/DCL)。
- 默认数据库:
information_schema(虚拟库:对象信息/列/权限/字符集)、performance_schema(性能参数/锁等待/事件汇总)、mysql(授权库:用户权限)、sys(性能与排障视图)。 - 层级:数据库服务器 → 数据库(数据实体存
/var/lib/mysql)→ 表(管理单元)→ 记录/行 → 字段/列(字段名+类型(长度)+约束)。
二、库操作 DDL
CREATE DATABASE discuz;库名要求:区分大小写、唯一、不能是关键字(create/select)、不能纯数字或特殊符号。SHOW DATABASES;、USE 库名;、SELECT database();看当前库、DROP DATABASE 库名;删库。- 生产中删除前务必备份/确认。
三、数据类型总览
- 数值:整数(tinyint/smallint/int/bigint)、浮点(float/double)、定点(decimal);
unsigned无符号(只能正)、zerofill零填充。 - 字符串:
char(M)定长(0~255,不足补空格、检索去尾空格)、varchar(M)变长(0~65535,按实际存储);text 大文本;enum 单选、set 多选。 - 二进制:binary/varbinary/blob(图片音视频,与字符集无关;真文件一般放磁盘不入库)。
- 时间日期:year/date/time/datetime/timestamp。
- 字符集:utf8(万国码 1~3 字节/字符)、gb2312/gbk(简体、汉字 2 字节)、big5(繁体)。
四、数值类型要点(含实验结论)
- tinyint 有符号最大 127、int 有符号最大 2147483647;超出报
ERROR 1264 Out of range(MySQL 报错;MariaDB 可能存 0)。 - int 的宽度只是“显示宽度”,不是存储上限:
int(6)仍能存大于 6 位的数(≤上限);建议整型不写宽度,字符型必须写宽度。 zerofill:不足宽度自动补 0 显示(且自动转为 unsigned)。float(5,2):总长 5 位、小数 2 位(整数仅 3 位),超范围报错;decimal(M,D)定点数以字符串存储更精确(银行货币),decimal 不写精度默认整数 10 位小数 0;超长小数会四舍五入并告警。- float 32bit/7 有效位、double 64bit/15 有效位、decimal 128bit/28 有效位(存钱用 decimal)。
五、时间日期要点
date(年月日)、time(时分秒)、datetime(年月日时分秒)、year(年)、timestamp(时间戳)。- 插入可用
now();timestamp 插入 NULL 自动填当前时间,更新行自动刷新(on update CURRENT_TIMESTAMP)。 - year 两位年份:≤69 按 20xx,≥70 按 19xx;尽量写 4 位。
六、字符串/枚举/集合要点
- char(4) 存 'ab ' 会去尾空格(length 短),varchar 保留空格(length 按实际);用
concat(v,'=')观察差异。 - 字符必须加引号,数字不加引号;INSERT 两种写法:
INSERT INTO t VALUES(...)与INSERT INTO t SET 列=值,...(值在给定范围外报ERROR 1265 Data truncated)。 - enum 单选、set 多选:如
sex enum('m','f')、hobby set('music','book','game','disc'),set 插入'book,game'。
七、完整性约束(DDL 核心)
| 约束 | 说明 |
|---|---|
| PRIMARY KEY (PK) | 主键:唯一 + NOT NULL;可单列/多列(复合主键) |
| FOREIGN KEY (FK) | 外键:关联父表主键,可 on update/delete cascade 同步 |
| UNIQUE KEY (UK) | 唯一但不限空,空值可重复;一表可多个 |
| AUTO_INCREMENT | 自动增长(配整数主键),不写该列自动 +1 |
| DEFAULT | 默认值(如 default 'm'、default 18) |
| NOT NULL | 不允许为空(报 ERROR 1048 cannot be null) |
| UNSIGNED / ZEROFILL | 无符号正数 / 零填充 |
- 空值 NULL 与空串 '' 不同;UNIQUE 列 NULL 可重复。
- 复合主键:多列组合唯一,例
primary key(host_ip,port);MySQL 的mysql.user就是 Host+User 复合主键。 - 外键实验:父表 employees(name 主键) / 子表 payroll(name 外键 references employees(name) on update cascade on delete cascade),两表须 engine=innodb,改/删父记录子表联动。
八、表操作 DDL
- 建表:
create table 表名(字段 类型(长度) 约束,...);(如 school.student1)。 - 查看:
show tables;(表名)、desc 表名;(表结构=列定义)、select * from 表;(表内容)——结构≠内容。 - 删表:
drop table t1;。
九、命令速查表
| 场景 | SQL |
|---|---|
| 建/删/选库 | create/show/use/drop database 名;、select database(); |
| 建表 | create table student1(id int, name varchar(20), sex enum('m','f'), age int); |
| 看结构/表 | desc 表;、show tables; |
| 完整约束示例 | id int primary key not null auto_increment |
| 复合主键 | primary key(host_ip,port)(表级) |
| 外键 | foreign key(name) references employees(name) on update cascade on delete cascade |
| 插入 | insert into 表 values(...) 或 insert into 表 set 列=值,... |
| 看当前时间 | select now(); |
| 统计长度/拼接 | length(列)、concat(列,'=') |
十、易错点
- int(M) 不限制存储范围、只是显示宽度;字符类型 M 才是长度上限。
- char 去尾空格、varchar 保留——检索差异(如登录名比较)坑多。
- primary key 已含 not null;unique 允许空且空可重复;auto_increment 只能配主键整数列。
- timestamp 与 datetime:timestamp 自动当前时间/自动更新、范围小(1970~2038);datetime 需手动给值、范围大。
- 外键两表必须 InnoDB,类型要一致,否则建表失败。
- MariaDB 越界行为与 MySQL 不同(可能写 0 不报错),考试以官方语义为准。
十一、实操清单
建 school 库 → 四列表 student1 插入/查询 → 依次做 tinyint/int 越界、float(5,2)、decimal、date/time、char/varchar(length/concat)、enum/set 越界实验 → 建 student4 验证 default/not null → 建主键+auto_increment 表 → unique 重复报错 → innodb 父/子外键级联实验 → 复合主键 service 表。
十二、本章自测
- 默认库 mysql/performance_schema 各存什么?2. tinyint/int 有符号上限?3. char 与 varchar 存储差异?4. float(5,2) 能存 1111.2 吗?5. timestamp 不填值会怎样?6. 主键/唯一/外键约束各自特点?7. 复合主键适用场景?8. NOT NULL 与 DEFAULT 区别?
