diff --git a/docs/MySQL/mysql是怎样使用的.md b/docs/MySQL/mysql是怎样使用的.md index 34c5fd2..a7f4f0b 100644 --- a/docs/MySQL/mysql是怎样使用的.md +++ b/docs/MySQL/mysql是怎样使用的.md @@ -240,6 +240,179 @@ ALERT TABLE 表名 操作1, 操作2, ...; # 第六章 列的属性 +## 6.1 简单的查询和插入语句 + +### 6.1.1 简单的查询语句 + +```sql +SELECT * FROM table; +``` + +### 6.1.2 简单的插入语句 + +```sql +-- 如果没有指明某个字段的值,即为默认值 +INSERT INTO 表名(列1, 列2, 列3) VALUES(列1值, 列2值, 列3值); +``` + +### 6.1.3 批量插入 + +```sql +INSERT INTO 表名(列1, 列2, 列3) VALUES(列1值, 列2值, 列3值), (列1值, 列2值, 列3值), (列1值, 列2值, 列3值); +``` + +## 6.2 列属性 + +### 6.2.1 默认值 + +```sql +CREATE TABLE table_name ( + first_column INT DEFAULT '0' +); +``` + +### 6.2.2 NOT NULL + +`列名 列类型 NOT NULL` + +### 6.2.3 主键 + +```sql +-- 单字段主键 +CREATE TABLE table_name ( + first_column INT PRIMARY KEY +); + +CREATE TABLE table_name ( + first_column INT PRIMARY KEY, + PRIMARY KEY (first_column) +); + +-- 多字段主键 只能这样设置 +CREATE TABLE table_name ( + first_column INT, + last_column INT, + PRIMARY KEY (first_column, last_column) +); +``` + +### 6.2.4 UNIQUE约束 + +- 希望有其他列或列组合存储值唯一 + +```sql +-- 单个字段约束 +CREATE TABLE table_name ( + first_column INT PRIMARY KEY, + next_column INT UNIQUE , + last_column INT +); +-- 多个字段约束 +CREATE TABLE table_name ( + first_column INT PRIMARY KEY, + next_column INT, + last_column INT, + UNIQUE KEY 约束名 (next_column, last_column) +); +CREATE TABLE hutao.new_table ( + product_id INT PRIMARY KEY, + product1 VARCHAR(50), + product2 VARCHAR(20), + product3 VARCHAR(50), + product4 VARCHAR(50), + product5 VARCHAR(50), + product6 VARCHAR(50), + UNIQUE KEY key1 (product1, product2), + UNIQUE KEY key2 (product5, product6) +); +``` + +注意: +- 一张表只能有一个`主键`,但是可以有多个`UNIQUE`约束 +- 主键不允许为`NULL`,但是`UNIQUE`可以存,并且允许存在多个,`NULL`代表没有填写 +- 如果未定义主键,mysql会默认将第一个出现的`NOT NULL UNIQUE`设置为主键 + +### 6.2.3 外键 + + 学生成绩表中携带了学生信息表中的学生id字段,如果学生成绩表中的学生id在学生信息表中不存在,那么此条学生成绩为无意义数据,为避免这种问题,设立外键。 + 以上学生信息表被称为主表,学生成绩表被称为子表,子表学生成绩表中的学生id为学生成绩表的外键,外键必须是主表的索引,主键和UNIQUE约束自动成索引 + +- 写法1(建议):`CONSTRAINT [外键名] FOREIGN KEY (字段1, 字段2, 字段3) REFERENCES 主表名(字段1, 字段2, 字段3)` +- 写法2(简写):`FOREIGN KEY [外键名] (字段1, 字段2, 字段3) REFERENCES 主表名(字段1, 字段2, 字段3)` + +```sql +CREATE TABLE student_score ( + score_id INT PRIMARY KEY COMMENT '学生成绩表主键', + student_id INT COMMENT '学生ID', + score_number INT COMMENT '学生成绩', + CONSTRAINT FOREIGN KEY (student_id) REFERENCES student_info(student_id) +) +``` + +### 6.2.4 自增 AUTO_INCREMENT + +- 使用整型或浮点型 +- 用法`列名 列类型 AUTO_INCREMENT` +- INSERT时将自增列设置为NULL时会自动插入自增值 +- NO_AUTO_VALUE_ZERO是默认不开启的,将0插入自增列也是自增值 +- 如果INSERT显式的插入新的自增值,下一个默认自增值是在显式自增值的基础上增长的 +- 一个表最多只能有一个自增列 +- 自增列必须为索引,主键和UNIQUE默认为索引 +- 自增列不能设置默认值DEFAULT +- 自增列一般作为主键 + +### 6.2.8 列注释 + +`列名 数据类型 COMMENT '注释'` + +### 6.2.9 ~~显示宽度和ZEROFILL~~ MYSQL8.0.17不推荐 + +- ZEROFILL作用是无符号数字补零 +- 没有显式说明UNSIGNED MYSQL会在建表的时候补上 +- 不同的整数类型默认显示宽度不同 +- 这不会影响存储 +- + +`列名 数据类型(显示宽度) UNSIGNED ZEROFILL` + +```sql +CREATE TABLE zerofille_table ( + id INT AUTO_INCREMENT , + number UNSIGNED INT(5) ZEROFILL +) +``` + +## 6.3 查看表结构时的列属性 + +| 表头 | 值 | 说明 | +|---------|---------|-----------| +| Null | No/Yes | 是否允许为Null | +| Key | PRE/UNI | 标记键的信息 | +| Default | | 默认值 | +| Extra | | 额外信息,如自增列 | + +## 6.4 标识符的命名 + +- 各种名字不能以空格结尾 +- 可以使用``将带空格的或纯数字包起来 ,但是不建议使用这两个 +- 不能用保留字如DESCRIBE +- 按照C/C++标准来,建议用下划线区分 + +# 第七章 简单查询 + + + + + + + + + + + + + +