"生命永无止境"
(一)Mysql初识
(1)为什么要有数据库?
什么是数据库,顾名思义,肯定是用于存储的一项技术。
但是,保存数据 用文件不就行了?为什么非要格外弄一个数据库这样一个东西呢?
文件存储数据的缺陷:
1.存在不安全的隐患2.不利于数据查询和读取。(IO进出,读取麻烦)
3.不利于存储海量的数据。
数据存储的介质:
磁盘
内存
然而,内存中无法持久性地保存数据。通过磁盘中读取数据,又要经过多次用户态、内核态的切换,大量的IO进出,因此为了更加有效地管理数据,提出来数据库的概念!
mysql的主流数据库很多:
1.SQL Sever: 微软的产品,.Net程序员的最爱,中大型项目
2.Oracle: 甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL3.MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
.......
(2)什么是数据库
其实所谓安装数据库,本质上就是在自己的机器上安装一个软件。
①从软件角度理解:
![](https://i-blog.csdnimg.cn/blog_migrate/3d59bb45f5d578a7ee594a6ffe9f9497.png)
②从文件系统理解:
要理解数据库的使用,不得不谈到数据库、数据库表之间的关系。
每一个开发人员都需要一个库(DB),为了更好的保存实体数据,也就需要多个表(table),用于保存实体数据。
所以几乎对任何数据库的理解,就是一个基于应用层开发的 网络服务器!
数据库的存储引擎
存储引擎: 数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法
show engines; InnoDB是最常用的存储引擎。
(二)mysql基本操作
(1)如何使用库?
① 查看库 和 切换库
show databases; 显示mysql所有的数据库
use + 数据库 ; 进入数据库
show create databases; 显示数据库创建的过程
②系统默认字符校验规则 与数据库创建
create database +DB(数据库名) ;创建数据库
上面抛出来了一个问题,也就是显示创建库的过程 有一串文段,这是什么呢??
其实就是创建一个 mysql支持的字符集或校验规则
create database db3 charset=utf8 collate utf8_general_ci;
charset(字符集) collate(校验规则)
show charset; 查看字符集 以及校验规则
③修改、删除库
alter database + 数据库名 ; 这种修改主要 针对的是修改数据库的字符集,校验规则
drop database[if exist] + 数据库名 ;
修改库的 字符集
数据库删除
④数据库如何进行备份?
mysqldump -P3306 -u root -p 密码 -B 数据库名 > 数据库备份存储的文件路径
mysql> source D:/mysql-5.7.22/mytest.sql;
所以sorce 执行.sql 文件 实质上就是把sql里的命令敲一遍 也就还原了数据
⑤查看链接情况
如果有时感觉数据库突然变得很慢,但是查不出是哪一个用户进行了登录。可以用下面的指令进行查询。
show processlist;
(2)如何使用数据库表(table)
①创建表
create table table_name (
field1 datatype,
field2 datatype,
field3 datatype
) character set 字符集 collate 校验规则 engine 存储引擎;
②查看表结构
desc + 表名:
③修改表
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等
alter table + Add ....
+ drop ...
+ modify\change ....
+ rename (to) + 修改表名
注:modify 主要针对 存在的列表属性的更改
change出新的列表属性名称 + 完整的列属性描述
添加表类属性;
对新增字段不会对原表结构有什么影响。
更改属性modify\change
change:
删除属性栏(table usr drop);注意不要 删错了
修改表名(rename):
④删除表格
drop table + table_name;
(三)Mysql与约束
(1)Mysql的数据类型
在谈Mysql数据类型之前,有一个问题始终让我疑惑?
为什么需要有数据类型?没有数据类型 行不行?
我们从语言层面来看,如果此时我们存储一个整数,如果此时没有数据类型,那么大的内存空间,到底给这个整数分配多少空间呢?? 答案是不知道!
因此我们才有不同的数据类型 int\double\char\long ......。是为了提高内存空间的使用效率。
但,对于sql语句而言,插入的数据如果 和 列表属性不一样,从根本上sql就会禁止掉!而不是采用C\C++编译器那样 给你截断\隐式类型转换.....
因此对于sql而言,引入数据类型,从而实现对一种对数据的 ”约束”,达到数据管理的目的
无符号有符号范围:
①tinyint型
②bit类型
bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
bit的特性:
1.按照ASCII码 表对应显示。
2.因为M控制的是bit的 位数 因此如果默认设置1 ,可以节省空间的只存放0或1
③float\decimal
float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间4个字节
如果float(4,2) 则可以表示 -99.99~99.99 并且mysql保存值时会进行四舍五入
decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
decimal(5,2) 表示的范围是 -999.99 ~ 999.99
float vs decimal:
float表示的精度大约是7位
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
④char\varchar
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar的长度可以指定在0~65535之间,因为需要记录数据,所以会用掉1~3个字节。
(utf8情况下,一个字符占用3个字节) 当参数为n时,最大的长度为 65532 / 3= 21844
(gbk情况下,一个字符占用2字节) 同样可得 65532 / 2= 32766;
varchar vs char
char\varchar的区别在于一个是变长 和 定长
定长的磁盘空间比较浪费,但是效率高。
变长的磁盘空间比较节省,但是效率低。
定长的意义是,直接开辟好对应的空间
变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
⑤日期和时间类型
date :日期 'yyyy-mm-dd' ,占用三字节
datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
⑥enum\set
enum:枚举,“单选”类型;
set:集合,“多选”类型;
enum为选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。
set设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。
(2)表的其他属性
①空属性
两个值:null(默认的)和not null(不为空)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。
②默认值
默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值
③列描述
comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。
show create table + table_name ; 查看表的创建过程
④Zerofill
格式化数据显示
所以zerofill完全是根据 数据类型(num) 来决定的。如果没有占用的位置,为自动填补0;
⑤主键
主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。
创建表的时候直接在字段上指定主键
追加、删除主键;
复合主键:
注:复合主键只有两个冲突,才会被禁止!
⑥自增长
auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键
⑦唯一键
一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
所以唯一键实质上,是为了解决除开主键需要确定的唯一性外,其他情况下 要有的唯一性的复杂情况。
本质上 两者是不冲突 是一种补充关系。
⑧外键
外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null
foreign key (字段名) references 主表(列)
总结:
①mysql的产生在于 磁盘+内存存储数据难免繁琐,效率低。为了更好的管理数据,因此设计出了这样一款服务器软件。
②库、表的如何使用?
③表的约束:数据类型+空类型+ 默认值+Zerofill+主键、唯一键、外键 、auto_increament
本篇到此结束
感谢你的阅读
祝你好运~