一 数据库的隔离级别有几个?
1.读未提交,最低级别
2.读已提交,可以防止脏读
3.可重复读,可以防止脏读、不可重复读
4.串行话,可以避免脏读、不可重复读、幻读
什么是脏读、不可重复读、幻读????
脏读就是一个事务读取到另外一个事务未提交的数据,可能引发数据库中的数据回滚。
不可重复读就是一个事务先读取一次数据,另一个事务修改数据,第一个事务读取数据发现不一致了。
幻读就是两个事务操作数据库,第一次读取数据和第二次的数据不一样,缺少了或者增加了数据。
不可重复读重在数据被修改,幻读重在对数据进行了添加或删除。
二 数据库存储的方式有几种
1.冷备份
定期的将数据库中的数据进行转储
2.热备份
当主数据库宕机,从数据库从主数据库发生问题之前的二进制日志中备份
3.双机热备
数据库互为主从,提升数据库的高可用,当一个数据库发生问题后另一个数据库立马启动,防止发生雪崩现象。
三 Sql注入是什么,怎么防止?
Sql注入就是当我们的sql语句是拼接的方式的时候,别人可以通过添加全真操作读取数据库中的所有数据,数据库数据不安全 例如:"select * from students where id = "+id ,其中的id是一个参数,用户传入 1 or 1=1,那么就可以拿到所有数据。正确应该是"select * from students where id = ?",用?进行占位。
防止sql注入用的是占位符的方式,主要就是调用prepareStatement对象,先把sql框架提交给数据库服务器,咱把参数单独提交给数据库。
四 sql优化
1.尽量不要使用*,使用字段名
2.用in代替or
3.尽量不要使用子查询,使用联接查询的方式,小表join大表
4.尽量不要使用order by
5.索引不能超过6个
6.尽量使用中间表(两个表之间的关系表)
7.使用explain查询sql语句的性能
五 事务
事务是数据库操作的逻辑单位,它的特性是ACID。
原子性:要么全部执行,要么全部不执行
一致性:操作数据后,数据库也要发生变化,比如银行存钱,存入后,银行卡余额也要改变
隔离性:一个事务操作数据库的时候,另一个事务不能够操作
持久性:存储在数据库中的数据长期有效
六 什么时候使用where,什么时候使用having
逻辑:
1.如果某字段a在select的后边,通过a进行条件判断,可以使用where或者having
2.如果某字段a不在select的后边,通过a进行条件判断,只能使用where
3.如果a字段在selecet的后边,并且a字段使用聚合函数变成b字段了,通过b进行条件判断,只能用having
1.
select name,age from user where age >10;
select name,age from user having age >10;
2.
select name from user where age >10;
3.
select name ,count(name) as c from user group by name having c > 1
七 索引的失效的情况(模数空算最快)
先讲清楚索引的作用是提高查询速度,相当于书里面的目录,方便我们快速找到指定的东西。
索引必须是经常不变化的数据,或者放在where、order by 、group by后边。
模:模糊查询like的%在前
数:数据类型错误--定义的是varchar,按照int类型查询 select* from a where id="1"
空:索引存在null值
算:索引参与运算
最:复合索引里面没有遵循最左原则(a、b、c) where a or b where a or b or c才可以
快:全表查询比索引查询快