- 花括号、方括号、竖线和省略号在SQL语法中都有特殊含义:
- 花括号
{} 里的选项表示必须选择一个;
- 方括号
[] 里的内容表示可选项;
- 竖线
| 表示"或";
- 省略号
... 表示前面的语法元素可以重复多次。
-- 创建数据库或模式
CREATE {DATABASE | SCHEMA}
-- 如果不存在,那么就创建新的数据库
[IF NOT EXISTS] db_name
-- 创建选项,可以定义多个
[create_option] ...
create_option:
-- 默认的字符集,用于定义存储在数据库中的数据如何进行编码和解码
[DEFAULT] {CHARACTER SET [=] charset_name
-- 数据库的排序规则,定义了字符的比较方式
| COLLATE [=] collation_name
-- 数据库的加密设置,'Y'表示启用加密,'N'表示禁用加密
| ENCRYPTION [=] {'Y' | 'N'}
}
-- 创建新的表,TEMPORARY 可选,表示这是一个临时表,会话结束后表将被删除
-- IF NOT EXISTS 可选,如果表已经存在则不会报错
-- tbl_name 是你要创建的表的名称
-- create_definition 是你要创建的表的列和约束定义
-- table_options 是表级别的选项,例如引擎类型、字符集等
-- partition_options 是关于表分区的选项
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
(create_definition,...)
[table_options]
[partition_options]
-- 该语句与上面的创建语句类似,不过它还包含了一个查询表达式(query_expression)
-- IGNORE 或 REPLACE 可选,这决定了当新表存在与查询结果列名重复的列时,是忽略错误还是替换旧列
-- AS query_expression 是一个查询表达式,新表将根据这个查询表达式的结果来创建
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
[(create_definition,...)]
[table_options]
[partition_options]
[IGNORE | REPLACE]
[AS] query_expression
-- 该语句创建一个新表,其结构与已存在的表(old_tbl_name)相同
-- LIKE old_tbl_name 表示新表的结构会复制 old_tbl_name 这个表的结构
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
create_definition: {
-- col_name 是列名,column_definition 是该列的定义,包括数据类型、是否为NULL、默认值等
col_name column_definition
-- 定义索引或键,INDEX 和 KEY 是等价的
-- index_name 是索引的名称,可选
-- index_type 是索引的类型,如 BTREE 或 HASH,可选
-- key_part 是被索引的列,可以有多个,由逗号分隔
-- index_option 是索引的选项,如索引的注释、是否可见等,可选
| {INDEX | KEY} [index_name] [index_type] (key_part,...)
[index_option] ...
-- 定义全文索引或空间索引
| {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name] (key_part,...)
[index_option] ...
-- 定义主键
-- CONSTRAINT 可选,symbol 是约束的名称,可选
-- PRIMARY KEY 后面的部分和上面的 INDEX 或 KEY 类似
| [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ...
-- 定义唯一键
-- CONSTRAINT 可选,symbol 是约束的名称,可选
-- UNIQUE [INDEX | KEY] 后面的部分和上面的 INDEX 或 KEY 类似
| [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ...
-- 定义外键
-- CONSTRAINT 可选,symbol 是约束的名称,可选
-- FOREIGN KEY 后面的部分包括索引名称(可选)、参照列名和参照定义
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (col_name,...)
reference_definition
-- 定义检查约束,检查约束是用于限制列中的值范围的一种方法
| check_constraint_definition
}
column_definition: {
-- data_type 是数据类型,如 INT、VARCHAR 等
-- NOT NULL 表示该列不能存储 NULL 值,NULL 表示该列可以存储 NULL 值
-- DEFAULT 后面跟着的是该列的默认值,可以是常量或表达式
-- VISIBLE 和 INVISIBLE 控制列是否可见,如果是 INVISIBLE,该列不会出现在 SELECT * 的结果中
-- AUTO_INCREMENT 表示该列是自增的
-- UNIQUE 和 UNIQUE KEY 表示该列的值必须是唯一的
-- PRIMARY 和 PRIMARY KEY 表示该列是主键
-- COMMENT 后面跟着的是该列的注释
-- COLLATE 后面跟着的是字符排序规则
-- COLUMN_FORMAT 控制列的存储格式,可以是 FIXED、DYNAMIC 或 DEFAULT
-- ENGINE_ATTRIBUTE 和 SECONDARY_ENGINE_ATTRIBUTE 可以为特定存储引擎指定额外的选项
-- STORAGE 控制列的存储方式,可以是 DISK 或 MEMORY
-- reference_definition 用于定义外键
-- check_constraint_definition 用于定义检查约束
data_type [NOT NULL | NULL] [DEFAULT {literal | (expr)} ]
[VISIBLE | INVISIBLE]
[AUTO_INCREMENT] [UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[COLLATE collation_name]
[COLUMN_FORMAT {FIXED | DYNAMIC | DEFAULT}]
[ENGINE_ATTRIBUTE [=] 'string']
[SECONDARY_ENGINE_ATTRIBUTE [=] 'string']
[STORAGE {DISK | MEMORY}]
[reference_definition]
[check_constraint_definition]
-- 生成列,GENERATED ALWAYS AS (expr) 用表达式生成列的值
-- VIRTUAL 和 STORED 控制生成列的存储方式,VIRTUAL 是计算出来的,不占用存储空间,而 STORED 是存储在表中的
| data_type
[COLLATE collation_name]
[GENERATED ALWAYS] AS (expr)
[VIRTUAL | STORED] [NOT NULL | NULL]
[VISIBLE | INVISIBLE]
[UNIQUE [KEY]] [[PRIMARY] KEY]
[COMMENT 'string']
[reference_definition]
[check_constraint_definition]
}