一、约束
 1.约束:确保字段的完整性,正确性,有效性
 * not null  ,unique , primary key 非空且唯一 ,foreign key.
  * 唯一约束unique
  *      唯一约束unique限定的值可以有多个null
  * 添加约束
  *      Alter table 表名 MODIFY 字段名 约束
  * 删除约束
  *      Alter table 表名 MODIFY 字段名
  * 删除主键
  *      Alter table 表名 DROP PRIMARY KEY
  * 自动增长:auto_increment
  *          ALTER TABLE stu MODIFY num INT  -- 删除自动增长
  *          ALTER TABLE stu MODIFY num INT AUTO_INCREMENT  -- 添加增长
  * 外键约束:
  *      create table 表名(
  *          ...
  *          外键列
  *          constraint 外键名称 foreign key 外键列名称 references 主表名称(主表列名称)
  *      );
  *
  *      删除外键
  *          Alter Table 表名 drop foreign key 外键名称
  *      添加外键
  *          Alter Table 表名 add   constraint 外键名称 foreign key 外键列名称 references 主表名称(主表列名称)  2. 级联:
 *      更新:
  *       Alter Table 表名 add   constraint 外键名称 foreign key 外键列名称 references 主表名称(主表列名称)
  *       on update cascade
  *       删除:
  *       Alter Table 表名 add   constraint 外键名称 foreign key 外键列名称 references 主表名称(主表列名称)
  *       on delete cascade 
二 、多表关系
多表关系:一对一,一对多,多对多
   1.操作方式:
 *      一对一:在任意的一方建立唯一外键,指向任意的一方的主键。
  *      一对多,在多的一方建立外键,指向一的一方的主键。
  *      多对多,借助中间表,至少包含两个字段,这两个表作为第三张表的外键,分别指向两张表的主键,联合主键  2. 范式:
 *      第一范式:每一列是不可分割的 原子数据项
  *               问题:数据冗余;添加新数据不合法;数据删除将删除行所有信息。
  *      第二范式:在第一范式基础上,消除非主属性对主码的 部分函数依赖。
  *               函数依赖:(A-->唯一B,B依赖于A)
  *               完全函数依赖:(如果A是属性组,B的确定需要依赖于A属性组中所有属性值) A(a,b,c)-->B
  *               部分函数依赖:(如果A是属性组,B的确定需要依赖于A属性组中部分属性值) A(a,b,c),    A(a,c)-->B
  *               传递函数依赖: A-->B,B-->C.存在A-->C ,C传递依赖于A
  *               码:表中的属性或者属性组被其他所有属性完全依赖,则该属性或者属性值为该表的码。
  *
  *      第三范式:在第二范式的基础上,任何非主属性不依赖于其他非主属性(消除 传递依赖)
    3.数据库备份与还原:
 *    命令行:
  *           备份:mysqldump -u用户名 -p密码  数据库名称 > 保存的路径
  *           还原:
  *                  登陆,mysql -u用户名 -p密码
  *                  创建,create database 数据库名称
  *                  使用,use 数据库名称
  *                  执行,source 文件路径 
三、多表查询
 * 多表查询直接查询,组成笛卡尔积,即两个集合的所有组成情况,需要消除无用的数据
  *
  * 多表查询分类:
  *      1.内连接: 确定表 ,字段,条件
  *          隐式:
  *               select xx1,xx2,xxn from table1 t1, table2 t2 where condition
  *          显式:
  *              select 字段 from table1 (inner) join table2 on condition
  *      2.外连接:
  *          左外连接:查询左表所有数据以及其交集部分
  *                   select 字段 from table1 lift (outer) join table2 on condition
  *          右外连接: 查询左表所有数据以及其交集部分
  *                  select 字段 from table1 right (outer) join table2 on condition
  *      3.子查询:查询中嵌套查询,被嵌套的部分为子查询
  *
  *      子查询查询情况不同:
  *          单行单列:子查询作为条件,使用运算符判断
  *          多行单列:子查询作为条件,使用in判断,
  *          多行多列:子查询作为虚拟表查询 
四、事务
 Transaction
  * 基本介绍
  *      事务概念:包含多个步骤的业务处理,被事务管理,则要么同时成功,要么同时失败。异常则回滚。
  *      操作:开启事务start transaction,回滚rollback,提交commit。
  *      MySQL中DML(增删改)默认提交事务,持久化更新;如果开启事务不提交,关闭窗口将自动回滚。
  *      查看默认提交方式 :Select @@autocommit;  1自动,0手动
  *      修改默认提交方式 :Set @@autocommit=1/0;
  * 四大特征
  *      1.原子性,不可分割的最小操作单位。
  *      2.持久性,一旦提交或回滚,数据库会持久化保存数据。
  *      3.隔离性,多个事务之间相互独立。
  *      4.一致性,数据操作前后,数据总量不变。
  * 隔离级别
  *      概念:多个事务之间是隔离,相互独立的,但如果多个事务同时操作同一批数据,会引发问题,可通过设置不同隔离级别解决
  *      存在问题:
  *          1.脏数据:事务读取到另一个事务未提交的数据
  *          2.不可重复读(虚读):同一事务中,两次读取到的数据不同
  *          3.幻读:一个事务操作数据表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
  *      隔离级别:
  *          1. read uncommitted 读未提交 : 1,2,3
  *          2. read committed 读已提交: 2,3
  *          3. repeatable read 可重复读: 3
  *          4. serializable 串行化:
  *      隔离级别从小到大,安全性越来越高,但效率越来越低
  *      查询隔离级别: select @@tx_isolation
  *      设置隔离级别:set global transaction isolation level 级别字符串;