【原创】 Mysql数据库入门、第二部分

Mysql数据库基础知识
九、MYSQL约束
9.1 约束基本介绍
约束用于确保数据库数据满足特定的商业规则,在mysql中,约束包括not null(非空)、unique(唯一)、primary key(主键)、foreign key(外键)、check(检查)五种
9.1.1、主键使用方式:字段名 类型 primary key
primary key主键基本作用:用于唯一的表示表行的数据,当定义主键约束后,该列不能重复
应用实例一:演示主键的使用
第一步:创建表
第二步:添加数据
primary key主键使用细节讨论:
1、primary key不能重复且值不能为空
2、一张表最多只能有一个主键,但可以是复合主键,多个字段合起来是一个主键
应用实例一:复合主键使用
错误:
创建复合主键
3、主键的指定方式有两种
一是直接在字段名后面指定:字段名 primary key
二是在表定义的最后写primary key(列名,列名...)
4、可以使用desc 表名 查看primary key的情况
5、在实际的开发中,每个表往往都会设计一个主键
9.1.2、not null(非空)使用方式:字段名 类型 not null
开发中,如果在列上定义了not null,那么在插入数据时,必须为列提供数据
9.1.3、unique(唯一)使用方式:字段名 字段类型 unique
定义了唯一约束后,该列值是不能重复的
应用实例一:演示unique的使用
unique 使用细节讨论:
1、如果没有指定主键的情况下也没有指定not null,则unique字段可以有多个null值
2、如果一个列(字段) 有unique not null 约束,使用效果类似primary key
3、一张表中可以有多个unique 字段
9.1.4、foreign key(外键)使用方式:foreign key (本表(从表、外键表)的字段名)references 主表名(主键名或unique字段名)
外键基本介绍:
外键用于定义主表和从表之间的关系,外键约束要定义在“从表”上,主表则必须具有“主键约束” 或是“unique“约束,当定义外键约束后,“要求外键列数据必须在主表的主键列存在或是为null“
应用实例一:演示外键使用
第一步:创建主表,字段有班级编号、班级名称
第二步:创建从表,字段有学生编号、学生名字、学生所在班级编号(外键)
第三步:添加测试数据
从表设置了外键,主表中没有id为300的数据,所以从表的这条添加的语句不会成功,insert into my_stu values(3,'螳螂',300)[添加失败],但是外键字段的值如果允许为空 (没有设置not null 非空约束),则可以添加成功
外键使用细节讨论:
1、外键指向的表的字段,要求是primary key 或者是unique
2、表的类型必须是innodb,这样的表才支持外键;mysql从5.5版本以后,默认引擎innodb;查看mysql版本使用命令status
3、外键字段的类型要和主键字段的类型一致(长度可以不一样)
4、外键字段的值,必须在主键字段中出现过,或者为null [前提是外键字段允许为null]
5、一旦建立外键关系,数据就不能随意删除了;如果要删除,除非把设置外键的从表中的对应ID的数据都删除,才能去删除主表中的该条ID记录值
9.1.5、check 使用方式:列名 类型 check (check条件)
基本介绍:check用于强制行数据必须满足的条件,假定在之前的员工表的sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错; oracle 和 sql server均支持check,但是mysql5.7目前还不支持check,只做语法校验,但不会生效
应用实例一:演示check使用
第一步:创建表
第二步:添加数据 , 一样是能添加到数据表中,所以,只做语法校验,但不会生效
9.2 自增长
在某张表中,存在一个id列(整数),我们希望在添加记录的时候从1开始,自动增长。 使用方式:字段名 整型 primary key auto_increment
应用实例一:演示自增长的使用
第一步:创建表
第二步:添加数据
自增长使用细节讨论:
1、一般来说自增长是和peimary key配合使用的
2、自增长也可以单独使用 [需要配合一个unique]
3、自增长修饰的字段为整数类型的(虽然小数类型也可以,但是非常非常少这样用的)
4、自增长默认从1开始,也可以通过命令修改, alter table 表名 auto_increment = 10(具体整形值)
5、自如果你添加数据时,给自增长字段(列)指定有值,则以指定的值为准;以下图为例,以后再添加数据的时候,id就从667开始了
十、MYSQL索引
10.1 索引基本介绍
说起提高数据库性能,索引是最物美价廉的方案了,不用加内存,不用改程序不用调SQL,查询速度就有可能提高百倍千倍;
说索引之前先说一下mysql安装在硬盘文件目录下面data文件夹中的文件
1、表存储引擎是myisam,在data目录下面会看到3类文件:frm、myi、myd
*.frm-表定义,是描述表结构的文件
*.MYD-"D"数据信息文件,是表的数据文件
*.MYI-"I"索引信息文件,是表数据文件中的任何索引的数据树
2、表存储引擎是InnoDB,在data目录下面会看到2类文件:frm、ibd
*.frm-表定义,是描述表结构的文件
*.ibd-表数据和索引文件,该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据
3、另外db.opt文件
用来记录该库的默认字符集编码和字符集排序规则使用的。也就是说你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。
10.2 索引原理:
"没有使用索引" 的时候查询过程如下图:
全表扫描,从id最小查询到id最大,即使查询条件是id=1,它也会全表扫描,查询速度非常慢
二叉树简介:
1、二叉树的叶子节点就是没有子节点的节点,一棵树中没有子节点(即度为0),的节点称为叶子节点,简称“叶子”,又称为终端节点。
2、二叉树特点是每个节点最多只能有两颗子树,且有左右之分。
3、二叉树是n个有限元素的集合,该集合或者为空,或者由一个称为根的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树,当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称为一个节点。
建立索引的二叉树(数据结构),在1-9中间找一个位于最大编号id和最小编号id的中间的数,假设是5,比5小的摆放位置在左边,比5大的摆放位置在右边,然后继续在1和5之间中间数,假设为2,然后比2小的继续摆放在2左边,比2大的摆放在2的右边,所有数据按照此方式分析下去
使用了索引的时候查询过程如下图:
第一步:where条件id为1,假设1--9二分,中间找到5,然后5右边的数据就不再查找了,如下图所示
第二步:where条件id为1,1比5小,再往左边再二分,假设1--5中间找到2,然后2右边的数据也不再查找,假设是一个800万的数据中查找,大概是23次左右就能找到,比顺序扫描快了不知道多少多少,如下图所示
二叉树五种基本形态:
图a:空二叉树
图b:只有一个根节点的二叉树
图c:只有左子树
图d:只有右子树