Part 02 MySQL数据定义语句(DDL)
约 1738 字大约 6 分钟
2024-11-25
DDL完成库和表的管理。
DDL不涉及数据操作,而是关注数据库的结构和元数据。
1 关键字
CREATE
:用于创建数据库、表、索引、视图等。ALTER
:修改数据库对象的结构,如修改表的结构、添加或删除列等。DROP
:用于删除数据库对象,如删除表、删除索引等。
2 SQL命名规定和规范
2.1 SQL命名规定
- 数据库名、表名不得超过30个字符,变量名限制为29个。
- 必须只包含A-Z,a-z,0-9和下划线(_)共63个字符,而且不能以数字开头。
- 数据库名、表名、字段名等对象名中间不能包含空格。
- 同一个MySQL软件中,数据库不能同名;同一个库中,表不能同名;同一个表中,字段不能同名。
- 字段名不能和保留字、数据库系统或常用方法冲突。
2.2 SQL命名规范
- 注释应该清晰、简洁地解释SQL语句的意图、功能和影响。
- 库、表、字段名应使用小写字母,并使用下划线(_)分隔单词。
- 库、表、字段名应该简洁明了,具有描述性,反映其所存储数据的含义。
- 库名应与程序名一致。如程序
EcommercePlatform
对应库名“ecommerce_platform”。 - 表名应遵循“业务名称_表的作用”。如“alipay_task”“force_project”等。
- 字段名应遵循“表实体_属性”。如“produce_name”。
3 库管理DDL
3.1 创建库
- 创建数据库,并使用默认的字符集和排序方式。
CREATE DATABASE <数据库名>;
- (推荐) 在创建之前判断数据库是否存在。
CREATE DATABASE IF NOT EXISTS <数据库名>;
- 创建数据库,并指定字符集或指定排序方式。
-- 指定字符集
CREATE DATABASE <数据库名> CHARACTER SET <字符集>;
-- 指定排序规则
CREATE DATABASE <数据库名> COLLATE <排序规则>;
-- 指定字符集和排序规则
CREATE DATABASE <数据库名> CHARACTER SET <字符集> COLLATE <排序规则>;
常见字符集:
- utf8
- utfmb4(MySQL 8+ 默认值)
常见排序规则:
- utf8mb4_0900_ai_ci(MySQL 8+ 默认值):不区分大小写的排序规则
- utf8mb4_0900_as_cs(MySQL 8+ 默认值):区分大小写的排序规则
查询字符集和排序规则:
SHOW VARIABLES LIKE 'character_set_database'; SHOW VARIABLES LIKE 'collection_database';
3.2 管理库
- 查看所有库
SHOW DATABASES;
- 查看当前使用的库
SHOW DATABASE();
- 查看指定库下所有表
SHOW TABLES FROM <数据库名>;
- 查看创建库的信息
SHOW CREATE DATABASE <数据库名>;
- 切换(选中)库
USE <数据库名>;
3.3 修改库
- 修改库字符集和排序方式
-- 修改字符集
ALTER DATABASE <数据库名> CHARACTER SET <字符集>;
-- 修改排序方式
ALTER DATABASE <数据库名> COLLATE <排序方式>;
-- 修改字符集和排序方式
ALTER DATABASE <数据库名> CHARACTER SET <字符集> COLLATE <排序方式>;
注意,数据库不能修改名字。一些可视化工具提供改名的功能,实际上是新建一个库,再将旧库中的所有表复制到新库中完成的。
3.4 删除库
- 直接删除数据库。
DROP DATABASE <数据库名>;
- (推荐) 在删除之前判断数据库是否存在。
DROP DATABASE IF EXISTS <数据库名>;
4 表管理DDL
4.1 创建表
创建表的同时,我们必须指定表名、字段名、字段类型。此外还可以指定注释和约束。
CREATE TABLE [IF NOT EXISTS] <表名> (
<字段名> <字段类型> [字段约束],
<字段名> <字段类型> [字段约束] [COMMENT 字段注释],
<字段名> <字段类型> [字段约束] [COMMENT 字段注释],
<字段名> <字段类型> [字段约束] [COMMENT 字段注释],
<字段名> <字段类型> [字段约束] [COMMENT 字段注释]
) [表约束] [COMMENT 表注释]
4.2 数据类型
4.2.1 整数
类型 | 占用字节 | 有符号范围 | 无符号范围 | 是否标准SQL |
---|---|---|---|---|
TINYINT | 1 | -128~127 | 0~255 | ❌ |
SMALLINT | 2 | -32768~32767 | 0~65535 | ✅ |
MEDIUMINT | 3 | -8388608~8388607 | 0~16777215 | ❌ |
INT | 4 | -2147483648~2147483647 | 0~4294967295 | ✅ |
BIGINT | 8 | -263~263-1 | 0~2^64-1 | ❌ |
在类型后添加修饰符 unsigned
即变成无类型,如 INT unsigned
。
4.2.2 浮点数
与整数类型不同,浮点数类型在声明时还需要附加声明位数。此处用D表示浮点数的小数位数,而M表示小数位数和整数位数之和。超过指定位数的小数将会被四舍五入至指定位数。
类型 | 占用字节 | M | D | 是否标准SQL |
---|---|---|---|---|
FLOAT(M,D) | 4 | 最大为24 | 最大为8 | ❌ |
DOUBLE(M,D) | 8 | 最大为53 | 最大位30 | ❌ |
浮点数类型同样可以在类型后添加修饰符 unsigned
变成无类型浮点数,但是只保留正值范围,负值将被舍弃。
4.2.3 定点数
定点数类型能够精确存储小数数值。
类型 | 占用字节 | M | D | 是否标准SQL |
---|---|---|---|---|
DECIMAL(M,D) | 动态计算 | 最大为65 | 最大为30 | ✅ |
4.2.4 字符串
字符串类型可以存储比较段的字符串。在声明字符串类型时,需要同时声明字符串的最大长度M。
类型 | 占用字节 | 最大长度 | 特点 | 是否标准SQL |
---|---|---|---|---|
CHAR(M) | 4M | 255 | 长度固定 | ✅ |
VARCHAR(M) | 最大为4M+1 | 65535(MySQL限制) | 长度可变 | ✅ |
4.2.5 时间
类型 | 占用字节 | 时间格式 | 范围 | 是否标准SQL |
---|---|---|---|---|
YEAR | 1 | YYYY | 1901~2155 | ✅ |
TIME | 3 | HH:mm:SS | -838:59:59~838:59:59 | ✅ |
DATE | 3 | YYYY-MM-DD | 1000-01-01~9999-12-03 | ✅ |
DATETIME | 8 | YYYY-MM-DD HH:mm:SS | 1000-01-01 00:00:00~9999:12:31 23:59:59 | ✅ |
TIMESTAMP | 4 | YYYY-MM-DD HH:mm:SS | 1970-01-01 00:00:00~2038-01-19 03:14:07 | ✅ |
4.3 修改表
- 修改表名
ALTER TABLE <表名> RENAME <新表名>;
- 向表中添加一列
-- 在指定字段前添加一列
ALTER TABLE <表名> ADD <字段名> <字段类型> FIRST <新字段名>;
-- 在指定字段后添加一列
ALTER TABLE <表名> ADD <字段名> <字段类型> AFTER <新字段名>;
- 修改字段名
ALTER TABLE <表名> CHANGE <字段名> <新字段名> <新字段类型>;
- 修改字段类型
ALTER TABLE <表名> MODIFY <字段名> <新字段类型>;
- 删除字段
ALTER TABLE <表名> DROP <字段名>;
4.4 删除表
- 删除表
DROP TABLE [IF NOT EXISTS] <表名[,表B,表C,...]>
- 清空表
TRUNCATE TABLE <表名>
4.5 查询表结构
在没有可视化工具的情况下可以使用 DESCRIBE
或 DESC
来查询表结构。
DESCRIBE <表名>;
DESC <表名>;
将返回若干字段:
字段名 | 含义 |
---|---|
Field | 字段名 |
Type | 字段类型 |
Null | 该字段是否可以存储NULL值 |
Key | 该字段是否已经编制索引。 PRI:该字段是表的主键的一部分。 UNI:该字段是UNIQUE索引的一部分。 MUL:字段中某个给定值可以出现多次。 |
Default | 该字段的默认值 |
Extra | 可以获取的与给定字段有关的附加信息 |