关系型数据库是以表作为实体,以主键和外键的关联关系做为联系的数据结构
数据库中不能比较浮点类型的数据
delete会记录日志,意味着删除后的数据还可以恢复,但是效率低。
truncate不会记录日志,删除后的数据不能恢复但是效率高
为什么要保证数据库的完整性?为了防止垃圾数据的产生,从而影响数据库的执行效率
数据完整性的概念:可靠性和准确性
数据完整性的分类:
1、实体完整性。保证一行数据是有效的。表中的一行数据如果与它所代表的实体完全一致,则具备实体完整性。
保证每行所代表的实体能相互区别,不能存在两条一摸一样的记录。
实现方法:--主键约束。主键不能为空,也不能重复,一个表中只能有一个主键
-- 唯一约束。指定给列的所有值必须唯一,该列在表中每一行的值必须唯一。它和主键约束的唯一区别在于该列可以为空,并且可以在一张表中给多个列设置唯一约束
2、域完整性。保证一列数据是有效的
域完整性是指定列的输入有效性
实现方法:--非空约束:NOT NULL
--默认约束:Default
--检查约束:check(MySQL不支持)
3、引用完整性。保证引用的编号是有效的
什么叫引用完整性
--参照完整性是指分布在两个表中的列所满足的具有主从性质的约束关系。
--从表中出现的数据,必须在主表的主键列中出现。某列
外键是指从表的某列与主表的某列存在依附关系
外键约束是指在外键关联主键上强制加上一个约束,如果违反该约束则不允许该条数据的修改
4、用户自定义完整性。保证自定义规则
聚合函数的分类:
count:统计行的数量
sum:获取单个列的合计值
avg:计算某个列的平均值
max:计算列的最大值
min:计算列的最小值
分组后查询列中,只能出现分组字段和聚合函数
由于分完组之后才能对分组的结果做统计,所以在where后面不能跟聚合函数
如果想要在分完组后,对分组的结果进行数据筛选。那么应该用having,having是对分组结果做数据筛选所以只能跟聚合函数
SQL执行顺序
第一步:执行from
第二步:where条件过滤
第三步:group by 分组
第四步:执行select投影列
第五步:having条件过滤
第六步:执行order by排序
having 和 where 区别:二者都是过滤条件,where运行在分组之前,因此不能执行任何聚合函数。having是运行在分组后,只能用做聚合函数的过滤。