内容概述
安装完MySQL数据库后,存储数据之前,就需要创建逻辑库和数据表,“数据库表的相关操作”部分主要就是管理逻辑库和数据表的内容。这也是本部分的主要内容:
部分内容简单阐述如下:
● 可以用数据类型限定字段的内容:(1)mysql中数字的解锁速度远远超过字符串;所以通常我们会用整数类型,作为数据表的主键字段;(2)mysql中保存精确的数字,就应该使用decimal这种精确数据类型,而不是浮点类型;(3)想约束婚姻状况这个字段的值,只能是已婚或者未婚两种状态,就可以使用枚举数据类型;
除了可以用数据类型来限定字段的内容,还可以用约束更进一步限定字段的内容;如:(1)定义年龄字段是整数类型,但是没有规定这个字段的值不能为空,为此可以给年龄字段添加非空约束;(2)为了让某个字段不能重复,可以给这个字段添加唯一性约束;
● 索引:数据库中提高数据检索速度的重要技术!!!类似于常用的字典,索引技术就是对数据排序,来加速查找的;
创建逻辑库
数据库给我们提供了操作的接口,只要编写好SQL语句,数据库就能帮我们完成数据的增删改查等一系列操作。
一:SQL简介:
二:创建逻辑库(或称逻辑空间);创建数据表;数据表的其他操作;
1.创建逻辑库(这个算DDL语句)
在mysql中如果想要保存数据,就必须先要有逻辑空间,也就是先要在数据目录中创建一个文件夹;
2.创建数据表(这个算DDL语句)
………………………………………………………………………………………………………………………………………………………………………………………………………………………………
创建表前的一个说明,已经知道目前是以root账户登录的mysql,或者说,以root账号连接的mysql,目前root这个账号有权限可以操作的逻辑库有下图所示的6个;(PS:自然mysql自带的四个逻辑库强烈建议不要碰);
接下来的事情,就是要创建数据表,那么将要创建的数据表要存放在哪个逻辑库中呐???换句话说,你已经使用root账号建立连接了,建立连接后,你本次新建的这个查询是针对哪个逻辑库的,这个要首先制指定;(可以认为,mysql不同的逻辑库是相对分割的不同区块,目前看来尽量不要相互干扰和混淆,要做不同区分)
所以,在创建了一个新的查询,开始建表之前(或者说,开始在本次查询中,书写SQL语句,执行进增删改查等等一系列SQL语句之前,需要先制定逻辑空间):
USE 逻辑空间名; 制定逻辑空间
经过实测,如果当前不想操作test1这个逻辑库了,而是想去操作demo这个空间,只需要【USE demo;】就可以了,或者新建一个查询框,然后指定这个新建的查询框是针对demo的就好了。
………………………………………………………………………………………………………………………………………………………………………………………………………………………………
再次说明:
但是如果此时:
………………………………………………………………………………………………………………………………………………………………………………………………………………………………
指定好逻辑空间之后就是一个建表的案例:
CREATE TABLE student( id INT UNSIGNED PRIMARY KEY, name VARCHAR(20) NOT NULL, sex CHAR(1) NOT NULL, tel CHAR(11) NOT NULL, remark VARCHAR(200) );
通过SQL语句方式,想student表中插入一条数据:
INSERT INTO student VALUES(1,“张三”,“男”,“1995-5-7”,“15312345678”,NULL);
3.数据表的其他操作:
数据类型
数字类型
数据表的主键字段要使用整数类型!!!
浮点数丢失精度的问题:
注:十进制的浮点数,在转成二进制的浮点数的时候,会丢数据,所以,单精度浮点数和双精度浮点数都是有误差的;;;
那么DECIMAL如何保证数据不丢失:因为DECIMAl在保存数据的时候,无论整数还是浮点数,都是按照字符串的方式来保存的;
在使用DECIMAL的时候,需要固定一下类型,DECIMAL(10,2):2代表保存数字,精确到小数点后两位;10代表整数位加上整数位一共是10个字符;
演示案例:
字符串类型
日期类型:
修改数据表的结构
数据表在创建出来以后(活称定义出来以后),是可以向里面添加新的字段,或者给已有的字段改名,或者删除已有字段;
本篇博客的语句都是DDL语句,因为其没有操作数据表中数据,而是定义数据表的结构,所以属于DDL语句的;
1.向表中添加字段
如:
ALTER TABLE temp ADD address VARCHAR(20) NOT NULL, ADD description VARCHAR(10) NOT NULL;
2.对已有字段的修改
(1)修改某个字段的数据类型和约束
如:
ALTER TABLE temp MODIFY description CHAR(10) NOT NULL;
(2)修改某个字段的名字
如:原来的数据类型要写上,约束和注释可写可不写
ALTER TABLE temp CHANGE description dess CHAR(10) NOT NULL;
3.删除字段
如:
ALTER TABLE temp DROP dess, DROP address;
数据库范式
定义数据表的时候,一般都需要主键约束,非空约束等字段约束。了解字段约束之前,需要先了解数据库的范式,然后才能更好的理解数据库的约束。
0.数据库的范式:
……………………………………………………
……………………………………………………
阐述上面的图,并解释为什么需要第三范式???:
(1)设想我们用箱子存放东西的时候,只有摆放整齐、规矩,才能存放的更多,也存放的调理更清晰,当翻开箱子找东西的时候也更加快;数据表同理,如果数据表字段之间的关系都非常的松散,那么这个数据表保存的数据就会存在一些问题,特别是检索的时候,速度就会非常慢;
(2)主键字段的查找速度是非常快的,如第一张表,像查找【女儿陈婷婷的玩具和衣服】,那么按照“爸爸”这个主键去查找,并不能找到【女儿陈婷婷的玩具和衣服】,因为条件并不符合,这样只能以非主键字段“女儿”字段去查找,这个速度是非常慢的;
(3)如果把表给拆开,如下面两张表,查找【女儿陈婷婷的玩具和衣服】,直接在第三张表中,以“女儿”这个主键去查找就行了,速度也很快;
(4)即按照第三范式去创建数据表、保存数据的时候,将来在检索、提取数据的时候,会非常的方便;;;如果违反第三范式,虽然表也能创建出来,但是将来在检索、提取数据的时候,都会非常的慢。
1.字段约束:主键约束、非空约束、唯一约束
(1.1)主键约束
……………………………………………………
(1.2)非空约束
……………………………………………………
(1.3)唯一约束
……………………………………………………
(1.附加)主键约束、非空约束、唯一约束的一个小范例
首先,创建t_teacher表:
CREATE TABLE t_teacher( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) NOT NULL, tel CHAR(11) NOT NULL UNIQUE, married BOOLEAN NOT NULL DEFAULT FALSE );
注: 在创建数据表的时候,强烈建议在表的名字前面加一个前缀,如上的前缀,如这儿的前缀就是“t_”!!! ;;;这是因为,在数据库中,有些表示真实存在的,有些表并不存在是虚拟表(这些数据表在数据库中叫做View视图的意思);所以,给这个表加一个如“t_”的前缀,就表示这是一个真实的数据表,如果前缀是“v_”或者“vw_”就代表这个表是个虚拟的表,也就是视图。
2.字段约束:外键约束
(2.1)外键约束
……………………………………………………
(2.2)外键约束的一个小范例
首先,创建d_dept表:
CREATE TABLE t_dept( deptno INT PRIMARY KEY NOT NULL, dname VARCHAR(20) NOT NULL UNIQUE, tel CHAR(4) NOT NULL UNIQUE );
向t_dept中,添加几条数据:
然后,创建t_emp表;并设置外键约束:
CREATE TABLE t_emp( empno INT PRIMARY KEY, name VARCHAR(20) NOT NULL, sex ENUM(“男”,“女”) NOT NULL, deptnoo INT NOT NULL, hairedate DATE NOT NULL, FOREIGN KEY (deptnoo) REFERENCES t_dept(deptno) );
向t_emp中添加几条数据:
此时,如果想删掉t_dept表中的,deptno=10的那个部分,会报错的:违反了外键约束;
正确的做法是,先把t_emp表中,所有deptno=10的记录,然后再删除t_dept表中deptno=10的那条记录。
……………………………………………………
注解:说明的第一个问题
注解:说明的第二个问题 ;这个问题,那个太关心啦,因为实际中基本不会使用外键约束的。。。
……………………………………………………
(2.3)为什么不建议使用外键约束
索引
一:索引简介
● 向数据表里保存数据,记录越来越多,一旦达到上千万条,怎么提高检索速度就需要考虑了;
● 当我们打开一个应用,希望能快点加载出内容,影响加载速度的因素有很多,但如何减少数据查找的时间是其中非常重要的一环;
● 索引机制是提高数据检索速度的;索引机制的原理很简单,就是对数据进行排序:
给表的某个字段创建索引后,设置好索引以后,数据库就会对这个字段进行排序,生成二叉树。MySQL利用二叉树结构,对数据表的记录排序,从而加速数据的检索速度:
即,只有引入索引机制,才能在数据表有超大量数据的情况下,还能保持查找的高速;
二:如何创建索引:
1.创建数据表的时候创建索引
注:(1)如果指定了索引的名称,这个索引的名字就是我们指定的这个;;;如果没有指定索引的名字,索引也是有名字的,数据库就会用创建索引的那个字段的字段名作为索引的名称。
(2)一张表,可以给多个字段设置索引;
示例:创建t_message表,并给其type字段设置索引,索引名字叫”idx_type”;
CREATE TABLE t_message( id INT UNSIGNED PRIMARY KEY, content VARCHAR(200) NOT NULL, type ENUM(“公告”,“通报”,“个人通知”) NOT NULL, create_time TIMESTAMP NOT NULL, INDEX idx_type (type) );
……………………………………………………
2.在已有的表上创建索引;查看索引;删除索引;
给一个已经存在的数据表创建索引;查看索引,删除索引;
示例1:给t_meaaget的content字段添加索引,并查看t_message表的索引:::: 这些语句好像不能一起执行,只能执行完一条,再去执行下一条。
CREATE INDEX inx_content ON t_message(content);
SHOW INDEX FROM t_message;
示例2:删除在content字段上的“idx_content”索引,在type字段上创建“idx_type”索引,并查看t_message表的索引::: 这些语句好像不能一起执行,只能执行完一条,再去执行下一条。
DROP INDEX inx_content ON t_message;
ALTER TABLE t_message ADD INDEX t_type(type);
SHOW INDEX FROM t_message;
只有引入索引机制,才能在数据表有超大量数据的情况下,还能保持查找的高速;主键字段自带索引,所以,利用主键作为查询条件也可以保持高速;但是那些非主键字段如果不设置索引,当表中数据非常多,并以这些非索引字段为查询条件的时候,查询的会非常慢,所以,我们应该给那些经常作为检索条件的字段,设置上索引。
三:索引使用原则
索引机制是非常重要的,大多数软件系统,数据的读取远远超过了数据的写入,比如常见的购物网站,用户多是看的多,买的少,即购物网站系统上,查询的数量远远多于写入速度;