目录
一、创建表的语法
二、表的物理存储类型
三、数据类型
3.1 文本类型类型:
3.2 数字类型:
3.3 时间\日期类型:
常用数据类型:
四、查看表
五、删除表
六、修改表的结构
八、数据库字典
九、表的约束
9.1 五类完整性约束:
9.2 表的约束实例
9.2.1 非空约束
9.2.2 唯一约束
9.2.3 主键约束
9.2.4 外键约束
9.2.5 检查约束
9.2.6 自动增长
9.2.7 默认值约束
一、创建表的语法
标准的建表(table)语法(列定义之间以英文逗号,隔开):
数据表的每行称为一条记录(record),每一列称为一个字段(field):
主键(字段)列:唯一标识某一行的列:
CREATE TABLE 表名(列名(字段名) 类型,列名(字段名) 类型,列名(字段名) 类型,列名(字段名) 类型,列名(字段名) 类型
) ENGINE = 存储结构;二、表的物理存储类型
MyISAM   ||   InnoDB(默认)
存储列相关信息,描述表结构文件,字段长度等
如果采用共存储模式的,数据信息和索引信息都存储在ibdata1中,
如果采用分区存储,还会有一个t.par文件(用来存储分区信息)。三、数据类型
MySQL中常用数据类型有三种:1、文本类型 2、数字类型 3、日期/时间类型
3.1 文本类型类型:
| 数据类型 | 描述 | 
|---|---|
| CHAR(size) | 保存固定长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的长度。最多 255 个字符。 | 
| VARCHAR(size) | 保存可变长度的字符串(可包含字母、数字以及特殊字 符)。在括号中指定字符串的最大长度。最多 255 个字 符。如果size>255,则类型会自动转换为TEXT类型。 | 
| TEXT | 存放最大长度为 65,535 个字符的字符串。 | 
| TINYTEXT | 存放最大长度为 255 个字符的字符串。 | 
| MEDIUMTEXT | 存放最大长度为 16,777,215 个字符的字符串。 | 
| LONGTEXT | 存放最大长度为 4,294,967,295 个字符的字符串。 | 
| BLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 65,535 字节的数据。 | 
| MEDIUMBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 16,777,215 字节的数据。 | 
| LONGBLOB | 用于 BLOBs (Binary Large OBjects)。存放最多 4,294,967,295 字节的数据。 | 
| ENUM | 枚举类型 | 
3.2 数字类型:
| 数据类型 | 描述 | 
|---|---|
| TINYINT(size) | -128 到 127 常规。 0 到 255 无符号*。在括号中规定最 大位数 | 
| SMALLINT(size) | -32768 到 32767 常规。 0 到 65535 无符号*。在括号中 规定最大位数。 | 
| MEDIUMINT(size) | -8388608 到 8388607 普通。 0 到 16777215 无符号*。在 括号中规定最大位数。 | 
| INT(size) | -2147483648 到 2147483647 常规。 0 到 4294967295 无 符号*。在括号中规定最大位数。 | 
| BIGINT(size) | -9223372036854775808 到 9223372036854775807 常规。 | 
| FLOAT(size,d) | 带有浮动小数点的小数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 | 
| DOUBLE(size,d) | 带有浮动小数点的大数字。在括号中规定最大位数。在 d 参数中规定小数点右侧的最大位数。 | 
| DECIMAL(size,d) | 作为字符串存储的 DOUBLE 类型,允许固定的小数点。 | 
3.3 时间\日期类型:
| 数据类型 | 描述 | 
|---|---|
| DATE() | 日期。格式:YYYY-MM-DD 取值范围 '1000-01-01' <<<>>> '9999-12-31' | 
| DATETIME() | 日期和时间的组合。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是'1000-01-01 00:00:00' <<<>>> '9999-12- 31 23:59:59' | 
| TIMESTAMP() | 时间戳。 TIMESTAMP 值使用 Unix 纪元('1970-01-01 00:00:00' UTC) 至今的描述来存储。格式: YYYY-MM-DD HH:MM:SS 注释:支持的范围是从 '1970-01-01 00:00:01' UTC 到 '2038-01-09 03:14:07' UTC | 
| TIME() | 时间。格式: HH:MM:SS 注释:支持的范围是从 '-838:59:59' 到 '838:59:59' | 
| YEAR() | 2 位或 4 位格式的年。 注释: 4 位格式所允许的值: 1901 到 2155。 2 位格式所允许 的值: 70 到69,表示从 1970 到 2069 | 
常用数据类型:

四、查看表
SHOW命令
语法:
SHOW TABLES [FROM 数据库名] [LIKE wild];
查看表结构:
SHOW COLUMNS FROM 表名五、删除表
DROP TABLE [IF EXISTS] 表名让我们举一个例子理解一下:
#创建学生表
CREATE TABLE Students(studentNo INT(5),studentName VARCHAR(50),	studentBirth  DATE,	studentAddress VARCHAR(100),	studentTel VARCHAR(11),	studentEmail VARCHAR(50)	
) ENGINE = InnoDB;
#查看表结构
SHOW COLUMNS FROM Student
#删除表
DROP TABLE [IF EXISTS] Student六、修改表的结构
修改列类型
ALTER TABLE 表名 MODIFY 列名 列类型;
>>> ALTER TABLE Students MODIFY studentEmail TEXT;添加列
ALTER TABLE 表名 ADD 列名 列类型;
>>> ALTER TABLE Students ADD studentGender CHAR(2);删除列
ALTER TABLE 表名 DROP 列名;    删除时注意数据完整性
>>> ALTER TABLE Students DROP studentGender;改列名
ALTER TABLE 表名 CHANGE 旧列名 新列名 列类型;
>>> ALTER TABLE Students CHANGE studentEmail studentEma VARCHAR(50);改表名
ALTER TABLE 表名 RENAME 新表名;
RENAME TABLE 表名 TO 新表名;七、复制表的结构
复制表的结构有两种手段方式1:在 CREATE TABLE 语句的末尾加入 LIKE 源表;>>>  CREATE TABLE Students1 LIKE Students;//只有结构没有数据方式2:在 CREATE TABLE 语句末尾添加 SELECT 关键字;>>> CREATE TABLE Students2 SELECT * FROM Students;//有结构又有数据方法3:如果已经有一张表了(结构一定要和源表一样)>>> INSERT INTO 表名 SELECT * FROM 源表;//结构已经一致单纯复制数据八、数据库字典
tables-存放数据库里所有的数据表、以及每个表所在数据库
 schemata-存放数据库里所有的数据库信息
 views-存放数据库里所有的视图信息
 columns-存放数据库里所有的列信息
 triggers-存放数据库里所有的触发器
 routines-存放数据库里所有存储过程和函数
 key_column_usage-存放数据库所有的主外键
 table_constraints-存放数据库全部约束
 statistics-存放了数据表的索引
(备注:由 information_schema 数据库负责维护)
九、表的约束
表的约束是在表上强制执行的数据校验规则
约束主要用于保证数据库的完整性,当表中数据有相互依赖性时,可以保护相关的数据不被删除
9.1 五类完整性约束:
1,非空约束   NOT NULL
 2,唯一性约束 UNIQUE KEY >>>主键约束(非空+唯一)   PRIMARY KEY
 3,外键约束   FOREIGN KEY
 4,检查约束   CHECK 检查语法
 5,默认值约束  DEFAULT
加入约束的三种时机
1,建表时期加入,直接符在声明的列后。
2,建表时期加入,所有列声明完成后,单独去重新声明列的约束性。
3,建表后加入,语法参考修改列类型语法完成约束的添加。约束作为数据库对象,存放在系统表中,也有自己的名字
创建约束的时机在建表的同时创建建表后创建(修改表)
可定义列级或表级约束
有单列约束和多列约束定义约束的语法方式1:列级约束:在定义列的同时定义约束语法:列定义 约束类型,方式2:表级约束:在定义了所有列之后定义的约束语法:列定义[CONSTRAINT 约束名] 约束类型(列名)约束名的取名规则推荐采用:表名_列名_约束类型简介
方式3:约束可以在创建表时就定义,也可以在创建完后再添加语法:ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束类型(要约束的列名)9.2 表的约束实例
9.2.1 非空约束
列级约束,只能使用列级约束语法定义
可以确保字段值不允许为空,只能在字段级定义
	CREATE TABLE Students(studentNo INT PRIMARY KEY AUTO_INCREMENT,studentName VARCHAR(50) NOT NULL);9.2.2 唯一约束
唯一性约束条件确保所在的字段或者字段组合不出现重复值
 唯一性约束条件的字段允许出现多个NULL
 同一张表内可建多个唯一约束
 唯一约束可由多列组合而成
 建唯一约束时MySQL会为之建立对应的索引
 如果不给唯一约束起名,该唯一约束默认与列名相同
CREATE TABLE Students(studentNo INT PRIMARY KEY AUTO_INCREMENT,studentName VARCHAR(18) UNIQUE NOT NULL
);9.2.3 主键约束
主键从功能上看相当于非空且唯一
 一个表中只允许一个主键
 主键是表中唯一确定一行数据的字段
 主键字段可以是单字段或者是多字段的组合
 当建立主键约束时,MySQL为主键创建对应的索引
CREATE TABLE tb_student(studentNo INT PRIMARY KEY AUTO_INCREMENT,studentName VARCHAR(18)
);9.2.4 外键约束
外键是构建于一个表的两个字段或者两个表的两个字段之间的关系
 外键确保了相关的两个字段的两个关系
 从表外键列的值必须在主表参照列值的范围内,或者为空(也可以加非空约束,强制不允许为空)
 当主表的记录被子表参照时,主表记录不允许被删除
 外键参照的只能是主表主键或者唯一键,保证子表记录可以准确定位到被参照的记录
格式FOREIGN KEY (外键列名)REFERENCES 主表(参照列)
#部门
CREATE TABLE tb_dept(dept_id INT PRIMARY KEY,NAME VARCHAR(18),description VARCHAR(255)
);
#员工
CREATE TABLE tb_employee(employee_id INT PRIMARY KEY,NAME VARCHAR(18),gender VARCHAR(10),dept_id INT REFERENCES tb_dept(dept_id),address VARCHAR(255)
);9.2.5 检查约束
create table t3(id int, age int check(age > 18),gender char(1) check(gender in ('M','F'))
);需要注意的是检查约束在8.0版本之前,MySQL默认但不会强制的遵循check约束(写不报错,但是不生效,需要通触发器完成),8.0版本之后就开始正式支持这个约束了
9.2.6 自动增长
auto_increment :自动增长
 为新的行产生唯一的标识,一个表只能有一个auto_increment,且该属性必须为主键的一部分。auto_increment的属性可以是任何整数类型
9.2.7 默认值约束
default : 默认值
可以使用default关键字设置每一个字段的默认值
-- 创建一张user表
CREATE TABLE User(  id INT(11) NOT NULL AUTO_INCREMENT COMMENT 'id',name VARCHAR(225) COMMENT '姓名',sex TINYINT(1) DEFAULT 1 COMMENT '性别 1男 0女',PRIMARY KEY (id)
) ENGINE=INNODB CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;