目录
4. 什么是事务, 为什么需要事务, 四大特性, 操作事务的语句 (开启、 提交、回滚)
16. count (*) count(主键id) count(1) 的区别:
19. drop, delete, truncate的区别:
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
反三范式:基于第三范式所调整的,有时为了提高运行效率,就必须降低范式标准。

整数类型有int,小数类型有float、double,日期类型有year、time、date、datetime,文本/二进制类型有char、varchar
非空约束:字段内容一定不能为空。
唯一约束:字段内容不允许重复,一个表允许有多个唯一约束。
主键约束:字段内容不允许重复,一个表只能有一个主键约束。
外键约束:预防破坏表与表之间的连接,防止非法数据插入外键列。
检测约束:控制字段的值范围。
事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,所执行的结果使数据库从一种一致性状态转换成另一种一致性状态,它还是逻辑上的一组操作,要么都执行,要么都不执行。
将多个读写操作组合成一个逻辑单位来执行,要么都成功,要么都失败。
原子性(Atomicity):事务的原子性确保动作要么全部完成,要么全部不执行。
一致性(Consistency ):多个事务对同一个数据的读取结果是相同的。
隔离性(Isolation ):并发事务之间数据库是独立的。
持久性(Durability ):事务被提交之后,对数据库中数据的改变是持久的。
开启事务:start transation
回滚:rollback
提交:commit
读取未提交(READ-UNCOMMITTED):最低的隔离级别,允许读取尚未提交的数据,可能会导致脏读、不可重复读或幻读。
读取已提交(READ-COMMITTED):允许读取并发事务已经提交的数据,可以阻止脏读,但可能会发生不可重复读或者幻读。
可重复读(REPEATABLE-READ):对同一字段的读取结果是相同的,除非事务本身自己去修改数据,可以阻止脏读和不可重复读,但可能会发生幻读。
可串行化(SERIALIZABLE):最高的隔离级别,完全服从事务的原子性,让所有的事务依次逐个执行,这样各事务之间完全不可能产生干扰,可串行化可以阻止脏读、不可重复读以及幻读。
1.索引是一种特殊文件,它包含着对数据表里所有记录的引用指针。
2.索引是一种数据结构,数据库索引是数据管理系统中一个排序的数据结构,以协助快速查询,更新数据库表中的数据。
3.索引相当于一个目录,为了方便查找书中的内容,通过内容建立索引形成目录。
4.索引是一个文件,是需要占据物理空间的。
可以加快数据的检索速度
使用索引在查询过程中,可以使用优化隐藏器,提高系统的性能。
时间方面:创建和维护索引需要耗费时间,当对表中的数据进行增、删、改时,也需要动态的维护索引,这样会降低增、删、改的执行效率。
空间方面:索引是需要占据物理空间的。
主键索引:数据列不允许重复、不允许为空,一个表只能有一个主键。
唯一索引:数据列不允许重复、允许为空,一个表允许多个列创建唯一索引。
普通索引:基本的索引类型,没有唯一性的限制,允许为空。
全文索引:是目前搜索引擎使用的一种关键技术。
索引的数据结构和存储引擎的实现有关,我们经常使用的InnoDB存储引擎的默认索引实现为B+树索引。
B树和B+树的区别:
在B树中可以将键和值存放在内部节点和叶子节点;在B+树中,内部节点都是键没有值,叶子节点同时存放键和值。
B+树的叶子节点有一条链相连,B树的叶子节点各自独立。
B+树和Hash索引的区别:
1.Hash索引进行等值查询时较快,但不稳定,并且无法进行范围查询;B+树查询效率比较稳定且支持范围查询。
2.Hash索引不支持使用索引进行排序,B+树支持。
3.Hash索引不支持模糊查询以及最左前缀匹配原则,B+树支持。
4.Hash索引避免不了回表查询,B+树在符合聚簇索引、覆盖索引等情况下可以通过索引完成查询。
将数据存储与索引放在一块,找到索引也就找到了数据。
将数据存储和索引分开,当需要访问数据时,在内存中搜索索引,然后通过索引找到磁盘中的相应数据。
先通过普通索引的值定位聚簇索引的值,再通过聚簇索引的值定位行记录数据,需要扫描两次索引B+树。
即最左优先,在检索数据时从联合索引的最左边开始匹配。
1.使用了select 查询所有列
2.索引列上有计算
3.索引列用了函数
4.字段类型不同
5.like使用了模糊查询
6.使用了or关键字
7.没有满足最左前缀匹配原则
1.like语句的前导模糊查询不能使用索引。
2.建议使用in来命中索引。
3.负向条件的查询不能使用索引。
4.联合索引最左前缀原则。
5.索引列上不要有函数,不要在索引列进行计算
6.不要使用索引中范围条件右边的列。
共享锁:当用户读取数据的时,加上共享锁,共享锁可以同时锁多个。
排他锁:当用户写入数据的时,加上排他锁,排他锁只能锁一个,排他锁和其他的排他锁、共享锁都相斥。
行级锁:是MySQL中锁定粒度最细的一种锁,只对当前操作的行进行加锁,能减少数据库操作冲突。
表级锁:是MySQL中锁定粒度最大的一种锁,只对当前操作的整张表加锁,该锁实现简单、资源消耗少,被大部分MySQL引擎支持。
页级锁:是MySQL中锁定粒度介于行级锁和表级锁之间的一种锁。
两个或及以上的事务在同一资源上相互作用,并请求锁定对方的资源,从而导致恶性循环。
1.让所有事物获取资源的顺序保持一致
2.在事务中一次性锁定所有的资源
3.使用乐观锁
比较悲观,假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就把事务锁起来,直到提交事务。
比较乐观,假定不会发生并发冲突,只在提交操作时检查是否违反数据完整性。在修改数据的时候把事务锁起来,通过version版本的方式来进行锁定。
内连接语法:inner join
外连接语法:left join/right join
内连接与外连接的区别:
内连接:连接结果仅包含符合连接条件的行,参与连接的两个表都应该符合连接条件。
外连接:连接结果包含符合连接条件的行和自身不符合条件的行。
左外连接语法:left join
右外连接语法:right join
左外连接与右外连接的区别:
左外连接:左边表数据行全部保留,右边表保留符合连接条件的行。
右外连接:右边表数据行全部保留,左边表保留符合连接条件的行。
子查询返回单行单列:结果集是一个值,父查询使用:=、<、>等运算符。
子查询返回多行单列:结果集类似于一个数组,父查询使用:in any all运算符。
子查询返回多行多列:结果集类似一张虚拟表,不能使用where条件用于select子句做子表。
group by:指定一个或多个字段对数据进行分组。
having:对分组数据进行条件过滤。
聚会函数:和group by结合使用,统计和计算每个分组的数据。
相同点:都是设定条件筛选的语句。
不同点:where是在分组前对数据进行筛选,后面不可以使用聚合函数。having是在分组后对数据进行筛选,后面可以使用聚合函数。
聚合函数:count、sum、avg、max、min
now():返回当前时间和日期
curdate():返回当前日期
curtime():返回当前时间
date():提取日期表达式中的日期部分
date_add():日期添加指定的时间间隔
date_sub():日期减去指定的时间间隔
datediff():返回两个日期之间的天数
ceiling(count(*)/5.0)取大于结果的最小整数
floor(count(*)/5.0)取小于结果的最大整数
sqrt(2)数值开平方
round(3.45645,2):取两位有效数字
abs(-5):取绝对值
concat()返回多个字符串连接后的字符串
lower()将字符串转换为小写的形式
upper()将字符串转换为大写的形式
length()返回字符串的长度
substring(str,pos,len)str表示字符串,返回从pos开始的子串,len表示返回的长度
trim([remstr from] str)返回删除str字符串两端remstr的字符后的子串
replace(str,a_str,b_str)将字符中所有的a_str替换成b_str
reverse()反转字符
count()求总数
sum()求和
avg()求平均值
max()求最大值
min()求最小值
count(*):求所有列的总数,不会忽略空值
count(主键id):求列名为id字段的总行数,会忽略空值
count(1):求所有记录的行数,不会忽略空值
create table 表名(
字段名1 类型[(宽度)约束条件],
字段名2 类型[(宽度)约束条件],
字段名3 类型[(宽度)约束条件]
);
create index 索引名 on 表名(字段名)
虽然它们都有删除表的作用,但是truncate是保留表删除所有数据,delete是删除部分数据,drop删除整张表。
增:insert into
删:delete
改:update
查:select
冷备份:读写操作均不可进行
热备份:读写操作均可执行
温备份:只能读不能写
1.使用where条件限定要查询的数据
2.使用连接语句时,优先使用Inner join
3.避免在 where 子句中使用比较运算操作符
4.使用联合索引时,遵循最左匹配原则
5.在 where 或order by 涉及的列上建立索引时,尽量避免全表扫描
6.当插入数据过多时考虑批量插入
1.将字段很多的表分解成多个表
2.增加中间表
3.增加冗余字段