一、数据库创建相关
1.编码集
创建数据库的时候,有两个编码集:
- 数据库编码集,数据库未来存储数据的编码格式
- 数据库校验集,数据库进行字段比较使用的编码
采用什么编码集决定存取数据时采用什么编码,操作和编码必须是一致的,比如通过大写'A'还是小写'a'进行查找,不同编码集有不同的效果。
编码集确定后,此后创建的表会默认继承数据库的编码规则。
2.备份数据库
备份的本质是把数据库上所有做过的操作都记录下来,所以要恢复备份的数据库,本质是将这些记录的操作再跑一遍。
二、表的创建相关
- 可使用不同存储引擎创建表
- 修改某一列的属性,不是定向修改,而是直接覆盖。
- 不要轻易删除表或修改表结构,因为数据库是程序员负责维护的最靠近底层的模块,一旦修改,所有上层相关操作都可能会出问题。
三、数据类型
约束用于保证插入的数据一定是合法的,这样程序员才能放心使用。数据类型本身是一种约束,比如插入数据超过其类型的界限,mysql会直接拦截(这和语言不一样,语言是运行时才会报错)。
1为什么有这么多类型
其实和语言一样,类型不同占用的空间也不同,根据场景选择合适的类型从而减少空间的浪费。
2.类型选讲
(1)char类型
MYSQL的一个字符和C不同,不是一个字节。一个汉字底层虽然占多字节,在MYSQL中也叫一个字符,utf中一个字符占用三个字节,所以建表时char(2)可以塞两个英文字母,也可以塞两个汉字
(2)enum和set
虽然看起来存储的是选项,但实际上存储的是代码,既可以插入数字也可以插入选项文本。不过集合采用位图存储,所以输入的数字会换算成对应的集合,如1011代表第1、2、4个选项被选中。
四、表的其它约束
前面提到数据类型本身是一种约束,它保证的是字段的正确性,但还需要有额外的约束从业务逻辑角度保证数据的正确性,如两个人不可能拥有同样的身份证号码。下面挑选一些约束进行介绍:
1.空属性、not null与default
在MYSQL中,NULL代表没有值,空代表内容为空。
如果通过default设置了默认值,同时设置为not null,插入时不填写值没有问题。如果没设置默认值而设置了not null就会报错,至少要插入一个空值。
2.自增长
如果用别的值来截断,他会就着新值进行自增。此外可以设定自增的起始值,一个表最多一个自增长。
3.主键
主键让数据具有唯一性。
可以建完表后再添加或删除主键,添加时数据本身不能有重复,否则无法添加。
4.复合主键
如果多列数据绑在一起设定主键,这些数据就叫复合主键,比如一个学生和一门课程形成一对信息任何表只会有一个主键(因为多个主键必然形成复合主键)
5.唯一键
唯一键同样起到使某列具有唯一性的作用。但主键不能为空,而唯一键可以为空。主键和唯一键互相补充,通常只有特定标识作为主键和复合键,比如学号,而唯一键用来标识具有业务含义的数据,如成绩等等。
6.外键存在的意义
首先逻辑上有关联的数据不一定会放在一个表里,比如班级分类(文科班、理科班),以及学生表(班级、姓名...),但假如逻辑上两张有关联的表具有约束关系,就需要用外键。比如学生表中某一位学生不应该归属于不存在的班级。此时班级表作为主表,学生表作为从表。
五、表的查询
1.插入
- value后不写要插入哪些列默认是全列插入,需要填写所有不允许为空的列。
- 在value后圆括号后带逗号,可以继续插入更多的行
- 插入和键冲突时可以选择直接替换,也就是用replace直接插入
2.筛选
这里重点讲一下查询语句的顺序,mysql不是按照书写顺序执行的,而是按下面的顺序:
- FROM:首先确定从哪张表获取数据。
- WHERE:对表中的原始行进行过滤。此时,数据库还在看原始数据,它只知道这些原始列,根本还不知道你后来打算给表达式结果或列本身叫别名。
- GROUP BY:如果有分组,在这一步进行。
- HAVING:对分组后的数据进行过滤(这里可以使用聚合函数)。
- SELECT:select本质指定最终结果显示哪些列或表达式,实际上表的内容到此已经全部出来了。
- ORDER BY:排序是在select显示出来后进行的。
- LIMIT:限制返回行数,在排序后进行。
需要注意的是:运算后要用select显示时列名可以用as替换,但where不能这个别名,因为where比select靠前。而having虽然实际比select要后,但MySQL对其进行了扩展使得having可以使用别名,在实际执行时会自动换回与原名。
如果HAVING在SELECT之后,数据库必须先计算出所有结果、起好别名,然后再去过滤掉不符合条件的行。这在性能上是极大的浪费——既然这组数据最后都要被扔掉,为什么还要费劲给它计算别名并展示出来呢?
3.删除表
使用delete清除表后,自动计数不会归0,而使用truncate就可以归零计数(这个命令也不走事物即不被记录到日志里,是危险的)
4.删除重复数据的实际操作
创建新表,插入数据后覆盖原表,以免数据删错或导致文件系统inode分布不均匀。
5.对聚合以及表的理解
分组和聚合是两个概念,先将数据分好组,然后再用聚合函数将每个组形式上变为一行统计后的数据。而这些中间过程形成的都是表,所以形式上MYSQL操作中一切皆表。
六、复合查询
复合查询看似复杂,只要牢记子查询、笛卡尔积的结果都只是一张新表,主查询只是对这张新表做查询就会很明了(当然还是得靠多练习)
from后面跟两张表,它们就会做笛卡尔积,也就是组合得到一张新表,笛卡尔积后要做无效信息过滤,此外多表联合时相同名称的列应取别名。
如果两张表是同一张表,就叫自连接,自连接前两张表分别要起别名。
子句返回的虽然是表,但如果是一行一列就可以直接在where语句中和列属性做相等判断