Select语句的执行顺序
1、from 子句组装来自不同数据源的数据;
2、where 子句基于指定的条件对记录行进行筛选;
3、group by 子句将数据划分为多个分组;
4、使用聚集函数进行计算;AVG() SUM() MAX() MIN() COUNT()
5、使用 having 子句筛选分组;
6、计算所有的表达式;
7、select 的字段;
8、使用 order by 对结果集进行排序。
where和having的区别
where是一个约束声明,使用where来约束来自数据库的数据;
where是在结果返回之前起作用的;
where中不能使用聚合函数。
having:
having是一个过滤声明;
在查询返回结果集以后,对查询结果进行的过滤操作;
在having中可以使用聚合函数。
where和having的执行顺序:where早于group by早于having。
count(*)和count(列名)的区别?
1、count(*)包含了所有的列,相当于行数,在统计结果的时候,不会忽略列值为空的情况;
2、count(1)在统计结果的时候也不会忽略列值为空的情况(即某个列为空时,仍进行统计);
3、count(列名)在统计的时候会忽略列名为空(null)的情况(即某个列为空时,不统计);
数据库一二三范式的作用?
第一范式就是属性不可分割,每个字段都应该是不可再拆分的。(姓名)
第二范式是在第一范式的基础上更进一步。第二范式就是要求表中要有主键,表中其他字段都依赖于主键,因此第二范式只要记住主键约束就好了。
第三范式就是确保数据表中的每一列数据都和主键直接相关,而不能间接相关。也就是要消除传递依赖,方便理解,可以看做是消除冗余,因此第三范式只要记住外键约束就好了。
范式可以避免数据冗余,减少数据库的空间,减轻维护数据完整性的麻烦。范式越高性能就会越差。一般在项目中,用得最多的也就是第三范式
InnoDB的Buffer Pool MySQL日志
redo log和undo log的区别
1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。