MySQL知识点总结
1.分组函数
1.1
分组函数一般都会和group by 联合使用,并且任何一个分组函数(count sum avg max min)都是在group by语句执行结束之后才会执行的
eg: select max(sal) from emp group by job (找出每个工作岗位的最高薪资)
1.2
分组函数不可直接使用在where 子句当中 因为分组函数必须分组后才能使用,而group by 是在where 之后运行,那时还没分组
分组函数 计算过程中会自动忽视null;但是其他函数计算中只要出现null 最终结果就是 null
1.3
例题:找出每个部门的最高薪资。要求显示薪资大于2900 的数据
select max(sal), deptno from emp group by deptno having max(sal) >2900(这样写 先分组找最高 再筛选掉低于2900的 效率低 不如先筛选干净再找最高)
answer: SELECT MAX(sal),deptno FROM emp WHERE sal>2900 GROUP BY deptno
2.执行顺序(优先级 )
select … (5) from …(1) where … (2) group by …(3) having … (4) order by …(6) limit …(7)

3.内连接和外连接 区别
3.1
内连接:假设a和b表进行连接,使用内连接时,凡是a表和b表能够匹配上的记录查询出来。这就是内连接。两张表是平等的,没有主副之分。
3.2
外连接:假设a和b表进行连接,使用外连接时,其中一张是主表,另一张 是副表。主要查询主表中的数据,捎带查询副表,当副表中的数据和主表没有匹配上,副表自动模拟出null与之匹配。
分为左连接(左边是 主表 )和右连接
4.MySQL中的数据类型
int 整数型
bigint 长整型(java中的long)
float 浮点型
char 定长字符串(string)数据长度确定时使用
varchar 不定长字符串 (stringbuffer string builder) 255
date 日期类型
BLOB 二进制大对象(存储图片、视频等流媒体信息)
CLOB 字符大对象(存储较大的文本,比如 可以存储4G的字符串)
5.表的创建赋值修改
创建表

赋值:insert into 表名 (字段1,字段2,。。)values(值1,值2.。。。) 值1,值2.。。。)
表的复制:create table 表2 as select语句 (将查询结果当作表创建出来)
查询结果插入到其他表中:insert into 表名 select 语句
修改数据:update 表名 set 字段1 = 值1 ,字段2 = 值2 .。。where 条件;(如果没有条件整张表全部更新)
删除数据:delete from 表名 where 条件; ((如果没有条件整张表全部删除))
6.索引
6.1
索引类似书的目录,通过目录可以快速找到对应的资源。 数据库中,查询一张表的时候有两种检索方式:全表扫描 根据索引检索
索引最根本的原理是缩小了扫描的范围,从而提高了检索的效率。
索引也需要不断维护,如果表经常被读,而且不经常改动,那么就适合按照where后的字段添加索引。如果表中数据经常被修改,那么不适合添加索引,因为需要经常维护索引。
6.2
什么时候考虑给字段添加索引?
数据量庞大(根据客户的需求,根据线上的环境)
该字段很少DML操作
该字段经常出现在where子句中
注:主键和具有unique约束的字段会自动添加索引。
创建索引: create index 索引名 on 表名(字段名)
删除索引: drop index 索引名 on 表名
底层数据结构是:B+树
6.3
索引的原理:
通过B+Tree 缩小扫描范围。底层索引进行了排序,分区,索引会携带数据在表中的“物理地址”,最终通过索引检索到数据后,获取到关联的物理地址,通过物理地址定位表中的数据,效率是最高的。

6.4
索引的分类
单一索引:给单个字段添加索引
复合索引:给多个字段联合起来添加索引
主键索引:主键上会自动添加索引
唯一索引:有unique约束的字段会自动添加索引
6.5
索引什么时候失效?
模糊查询的时候,第一个通配符使用的是%,这个时候索引是失效的
…
7.视图
站在不同的角度去看数据。(同一张表,通过不同的 角度去看)
创建以及删除试图
create view 视图名 as select 语句 只能以DQL语句创建视图
drop view 视图名
对视图进行增删改查,会影响到原表数据。
视图的作用 ? 视图可以隐藏表的实现细节。保密级别较高的系统,数据库只对外提供相关的视图,程序员只对视图 对象进行CRUD
8.数据库设计三范式(重点)
8.1
什么是设计范式? 设计表的依据。按照这个三范式设计的表不会出现数据冗余。
8.2
第一范式:任何一张表都应该有主键,并且每一个字段原子性不可再分。
第二范式 :所有非主键字段必须完全依赖主键,不能产生部分依赖。
eg (学号pk,老师编号pk,学生姓名,老师姓名)此表有主键且不可再分,满足第一范式。但是学生姓名与主键(学号,老师编号)不是完全依赖,是部分依赖。不满足第二范式
处理方式: 口诀:多对多? 三张表 ,关系表和两个外键 学生表(学号pk,学生姓名) 老师表(老师编号pk,老师姓名) 老师学生关系表(id_pk,学号fk,老师编号fk)
第三范式:所有非主键字段直接依赖主键,不能产生传递依赖 。
eg (学号pk,姓名,班级号,班级名 )班级和学生一对多关系 班级名依赖班级号依赖学号 不满足第三范式
处理方式:口诀:一对多,两张表,多的加外键 班级表(班级号pk,班级名) 学生表(学号pk,学生名,班级号fk)
8.3
实际开发中,以满足客户的需求为主,有时候会拿冗余来换执行速度。
8.4
一对一怎么设计?
方案一:主键共享 用户登录表(id pk ,用户名,密码) 用户详细信息表(id pk+fk ,真实名 ,电话)
方案二:外键唯一 用户登录表(id pk ,用户名,密码) 用户详细信息表(id pk,真实名 ,电话,userid fk+unique 外键唯一)