文章目录
数据库
什么是数据库?
- 软件角度
用户和磁盘之间的一层软件,帮助用户程序更方便的数据管理。SQL语句就是提供要求的接口。
-
数据库还是要自己去访问文件的,也是用文件的方式进行数据保存的,数据库中直接和文件打交道,数据库的存储引擎。
-
文件角度
数据库是一个网络服务器,客户端叫msql ,客户端服务器mysqld.CS模式。启动的是mysqld服务器,启动之后会提供对应的端口,可以跨网络访问,现在在电脑上是进行本地访问。
MySQL是属于应用层的软件,提供网络服务,应用层协议。MySQL是需要我们自己安装的,底层一定是访问OS文件接口的。
主流数据库
MySQL开源免费效率高
使用
命令行客户端
建立数据库的本质就是在MySQL中,就是在Linux中建立一个目录。
创建数据库表,本质就是在特定目录下创建特定的文件。
条件编译的形式实现各个系统之间的可移植性,就是穷举出各种系统的代码,条件编译识别是哪个系统然后将其他的代码去掉就行。
为什么会有不同的SQL分类?
角色不同使用的数据库的功能是不同的,sql也有种类的不同,人不一样需求不一样。
存储引擎
InnoDB和MyISAM
MySQL核心就是插件式存储引擎(基类指针指向你想操作的引擎),支持多种存储引擎。
校验规则,不同的校验规则会给我们不同的搜索结果,比如同样查询东西但是有的会区分大小写有的不会区分。排序的问题也会影响。不要轻易的删除和修改数据库
表的操作
在修改表的时候,新添加一列时,就会造成以前的存在的信息都覆盖为空。所以表结构不要瞎改。
数据类型
类型的存在:检测SQL语句是否合法的情况做出约束。确定内存大小。
类型约束着你SQL的执行,只让你插入合法的数据类型。
插入数据时,如果数据越界不符个对应数据类型范围,此时sql直接中止。C语言会发生截断。
即便是你传的是 “12”,他依然会插入12进去。但是这中情况在C语言是不行的。数据类型本质就是一种约束。约束越严格,存储的数据越规整。否则就会被中止
bit类型
位类型,是按照ASCII码值进行展示的。
012这种ASCII码值都是不可显示的,所以不是没有内容而是不可显示。
int
float&double
float[(m,d)],整体占用四个字节,m表示长度,d表示小数的位数.
float(4,2)表示的是-99.99~99.99,保存值的时候进行四舍五入
floate(5,2),五位数字中两位小数。
-
C语言中float和double可以是无符号数吗?不可以
比如unsigned float(4,2)范围是0~99.99了
decimal
decimal(m,d)[unsigned];与float类似。整数最大位数m=65,支持小数最大位数d=30.如果d被省略默认是0,m默认是10;float表示的精度是7位。
两者表示的精度还是不一样的。decimal精度更高。
字符串类型
char(L):固定长度字符串,L是可以存储的长度,单位是字符,最大长度是255.
一个汉字肯定不是一个字节,但是在mysql中,汉字字符入下,占3个字节。
不要认为:字符==字节,一个英文单词或者汉字在MySQL中被认为是一个字符,C语言上是1:1的,MySQL上不是这么认为的。utf8给英文用,gbk是给中国汉字使用的。ASCII码表就是建立符号和含义的映射关实现二进制和符号的对应,unicode就是统一的方案。
varchar
varchar(L),可变长度字符串,L代表字符长度,最大长度是65535个**字节,**用户需要多少给多少。
加入存的是abc三个字符,varchar可变长度为3,不是固定长度6.
varchar长度是0~65535字节,如果数据类型是每3个字节代表一个字符,那么结尾肯定有一个字符记录数据大小。utf8,就可以表示(65535-3)/3=21844个字符,所以L最大值就是21844.
日期和时间类型
年月日是日期,时分秒是时间。
时间戳,不插入就会是默认的当前时间。
日期格式:没填好的他都默认给你改好了,时间没写全也给你补上。
datatime这个字段你得给全了,也能给你默认补救。
请不要依赖于默认行为,兼容性问题的出现基本都是写的时候依赖过多的默认行为。分隔符的改变不会影响数据的存储方式都是默认的-。
更新时间update,时间戳t3随着操作继续更新时间。
enum和set
enum是单选,设定若干选项的值,最终一个单元格只会存储其中的一个值。不是枚举出来的就不会让你插入成功。通过enum约束使得只能出现确定的值。
插入下标个数是可以的,说明计算机存储的就是123,所以有两种选择。
set是集合,可以存储多个其中的任意值,比如说插入你的爱好。
二进制的形式进行标记,3 ->011,游泳和打篮球都被设置了。二进制位对于某一个爱好进行标记,所以数字的大小不能超过二进制表示的范围。
查询时只包含某种爱好,就可以用where;
如果想要具有其中一个就行,find_in_set(sub,list);函数。
数据类型本质是一种约束,一旦不满足我的条件,我就直接中止。给数据表中的数据提供管理极大的确定性。
MySQL为了让自己的表结构里面的数据一致性非常强,MySQL是给我们要提供强约束的!约束MySQL里面会提供很多游戏规则。
表的约束
数据类型约束之外的额外添加一些约束更高的保证数据的合法性。MySQL是和数据打交道的,Mysql一定要尽量保证数据不要出现偏差。
1. 空属性
null和not null。
C/C++:NULL,0,\0,数字上都是一样样的。但是MySQL中,null是不存在,!=0,!=\0.
当必须添加字段不是null时,保证表里面都是有值的,设置约束是not null。
2. 默认值
还是不想让你是空,可以提供默认值,不想让你直接中止下来。
既有not null又有default,虽然仍然可以使用成功,也就是填表为默认值。但是这样用default,notnull就没意义了。下回不用这么写了,修改属性之后。
3. comment
在创建表的信息中查看列描述,comment.
show create table t16 \G
,仅仅是desc并不能看到。
3. zerofill
int(10);10就是显示宽度10位,如果设置了zerofill,就会再你前面补齐,够了,就直接显示你就行了。证明就是200,只是简单填充而已。默认长度是11位。
4. 主键
数据库存入数据不是唯一目的,也要方便存取。版而言要求数据库中表的记录有特定的唯一标识,标识唯一性。主要的键值就叫主键,学号就是我们的主键。不一样并且不为空,最多只有一个主键。
删除主键约束,alter table t11 drop primary key;
因为主键只有一个,所以不用指定哪一列。
添加主键的时候需要指明哪一列需要添加,如果本身要添加的把一列存在重复的值就无法添加主键。需要将原来的删除之后,再进行添加。
删除主键:
添加主键:
复合主键
和两个都冲突才算是冲突,和一个重复不算冲突。
5.自增长
auto_increment:被他设置的那一列就是主键。当对应的字段不给值,系统触发最大值开始进行加一。
例1:不指明主键添加内容,每一次插入主键都会自增长内容。会在值最大的地方开始自增长。
例2:必须指定是主键才能添加自增长。
添加唯一键UNI,所以必须是有唯一性的字段可以添加自增长,一般是和主键一起使用,也可以和别的具有唯一性的使用,QQ号本身就是一个自增字段。
6. 唯一键
解决表中有很多需要唯一性限制的字段的问题,主键只有一个。唯一键可以为空,主键不准不填,NULL是没有字段也就不具备任何的运算,所以几个NULL不算相等,唯一键设置了不为空就是主键。
-
主键和唯一键有什么区别?
主键和唯一键并不冲突,一张表中可以有一个主键也可同时具有唯一键。
表其实就是MySQL级别的类或者struct对象的集合,表中保存的其实就是某些场景下的属性字段。
数据库本身是对数据约束非常严格的技术。
我们身上不只有一个属性具有唯一性,电话号学号!当然也具备不是唯一性的列,男!
主键不是设置了才是主键的,而是对应的属性被选择成为主键。
那么,没有被选择但是依旧是唯一性的属性就是具备了unique的唯一键。
场景:我不认识你(被选择成为主键的),但是我通过你的电话号码(其中一个唯一键)可以找到你的主键。所以需要将唯一键也要设置唯一性。
6.外键
外键用于定义主表和从表之间的关系:外键一般定义在从表上,从表的主键。外键就是主表的主键或者其他唯一键。
逻辑上,学生表的class_id和class表的id主键,应该是有相关联系的,但是在实际上还未实现表和表之间的联系,二者都是互相独立的表,都可以随机插入。
-
那么如何实现两者之间实际上的联系和约束呢?外键约束
外键约束,建立外键foreign key(class_id) references class(id),实现两个表之间的联系,当向15号班级插入class_id!=15的学生时就会报错,不让你插入。删除班级的时候要保证其中的学生都已经被删除了,才可以将班级删除。
所以通过外键产生关系的表,除了在逻辑上要有关联,MySQL在操作上也要维护这种逻辑关系的正确性,就叫做外键约束。
准确的区分 外键vs外键约束:外键是用来实现表和表之间关系的字段,其实只有我们自己知道,但是只要是有人参与操作就有可能犯错误,瞎插入。为了强约束表之间的关系,我们需要添加外键约束,只有添加了外键约束,MySQL才会帮你维护表之间的关系。
建表:
插入值:
不让先删除,不让瞎插入
正确删除:
鸡汤来啦!
生活中,我经常会因为明天会有很多事情要完成而抱怨自己之前为什么没有未雨绸缪,抱怨老师为什么非要那么较真,抱怨这抱怨那。但是,当真的整理好状态和心情去迎接的时候,发现曾经认为要去攀爬的高山其实并没有那么难以接受,太阳还是那么暖,周围还是熟悉的笑脸和问候,当处理完成之后发现成就感是加倍的。当”我喜欢“列表里面的歌声响起,好像生活又给我上了生动的一课。希望各位老铁,能够整理起最好的自己,坦然的,认真的在生活中成长!