1、什么是事务?数据库事务的四大特性?
事务是对数据库中一系列操作进行统一的回滚或提交的操作,主要用来保证数据的完整性和一致性。
原子性:要么全执行,要么全不执行
一致性:操作执行前后,数据保持一致
隔离性:一个操作在执行结束前,其他人是看不到执行过程的
持久性:一旦操作提交成功后,对数据的改变就是永久的
2、数据库的隔离级别?
脏读:事务B读取了事务A还没有提交的数据
不可重复读:两次事务读取的数据不一致
幻读:一个读事务按照一定条件查询出结果,一个写事务插入了该条件的一条数据,读事务再次查询,结果不一样
3、索引的作用?什么时候不能用索引?
提高查询效率
频繁的更新数据时,不建议用索引,因为同时要更新索引
4、数据库三范式
1NF:属性不可再分,比如,一个字段不能再被分成多个字段
2NF:非主键属性,完全依赖主键属性
3NF:非主键属性不可有传递依赖
5、左连接、右连接
inner join:返回两个表中所有的数据
left join on:返回左表中的全部,右表中符合条件的数据,没有的以null代替
right join on:返回右表中的全部,左表中符合条件的数据,没有的以null代替
cross join:两个表中的每一条记录都再生成一条记录,比如:A有4条,B有4条,生成16条记录
6、数据库锁的分类?
锁的定义:锁是一种同步机制,用来强行限制资源访问。
悲观锁:在一个事务执行过程中,认为都有可能会对数据进行改变,所以都会加锁。(共享锁、排他锁两种机制)
乐观锁:在一个事务执行过程中,不认为会对数据进行改变,所以不会加锁。但是有更新操作时,会判断数据是否进行了改变,通常使用版本号机制
共享锁:即读锁,在使用select时使用的锁机制。一个事务在读数据时,其他事务也能读数据
排他锁:即写锁,在使用update、delete时使用的锁机制。一个事务在操作数据时,其他事务看不到,更不能对其进行修改
7、为什么要对数据库实行锁机制?
背景:因为数据库并发操作会导致数据不一致
解决目的:多个用户并发操作时,保持数据的一致性
8、什么是死锁?产生的原因?产生的条件?怎么解决?
定义:死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种状态,若无外力作用,它们都无法再继续进行。
原因:因竞争资源(可剥夺和不可剥夺资源)、进程推进顺序非法
条件:
互斥条件(一个资源一次只能被一个进程使用)
请求与保持条件(一个进程因请求资源而阻塞时,对已获得的资源保持不放)
不可剥夺条件(进程已获得的资源,在没有使用完之前不可剥夺,只有进程自己释放)
循环等待条件(多个进程之间形成一种首尾相接的循环关系)
解决:找到进程号,直接kill掉;设置锁的超时时间;指定获取锁的顺序
9、什么是存储过程?如何创建?怎么调用?
存储过程是为了完成特定功能的一组sql语句集,经过编译后存储在数据库中,用户通过名字和给定的参数调用相关的面目存储过程
创建存储过程的语法:
CREATE PROCEDURE 存储过程名称([存储过程的参数列表]) 存储过程特性 过程体
存储过程参数列表的格式:([[IN|OUT|INOUT]参数名 参数类型])
IN:输入参数,该参数必须在调用存储过程时指定,在存储过程内部被改变时不能被返回,为默认值
OUT:输出参数,该参数可在存储过程内部被改变并返回
INOUT:输入输出参数,调用时被指定,并且可被改变并返回
调用:
可以用命令CALL调用——call 过程名(过程参数);查看存储过程用SHOW PROCEDURE STATUS LIKE xx%
可以用java程序;
10、什么是视图?
是一种虚拟表,具有和物理表一样的功能,可以对其进行增、删、改、查,视图表一般是一个基本表或多个基本表的列或行的子集,视图表影响基本表,相当于多表查询,但是查询速度更快
11、drop、truncate、delete的区别?
drop直接删除表
truncate删除全部数据,速度快,不可回滚
delete逐行删除数据,可回滚
12、varchar、char的区别?
varchar是变长的,一个英文字符占2个字节,汉字占2个字节
char是固长,一个英文字符占1个字节,汉字占2个字节
13、SQL语言分类
DQL数据查询语言(select)
DML数据操纵语言(insert、update、delete)
DDL数据定义语言(create)
DCL数据控制语言
14、select查询语句中用到的关键词
语法顺序:select--from--where--group by--having--order by
执行顺序:from--where--group by--having--select--order by
from 需要从哪个数据表检索数据
where 过滤表中数据的条件
group by 如何将过滤出的数据分组
having 对上面已经分组的数据进行过滤的条件
select 查看结果集中的哪个列或者列的计算结果
order by 按照什么顺序进行排序
15、having和where的区别?
having只能用在group by之后,对分组后的结果进行筛选。可使用聚合函数
where在group by之前,肯定也在having之前。where条件后的表达式里不可使用聚合函数
16、select语句的关键字
1)别名
select field1 n1 ,field2 n2 from table /select field1 as n1,field2 as n2 from table
2)去重
select distinct name from table
select distinct id , name from table,作用于多列时,需要同时满足两个条件都相同才去重
3)连接
左连接:select a.*,b.* from a left join b on(a.id = b.id),查询出a表中所有数据,和b表中与a表id相同的数据,不符合的以null代替
右连接:select a.*,b.* from a right join b on(a.id = b.id),查询出b表所有数据,和a表与b表id相同的数据,不符合的以null代替
内连接:select a.*,b.* from a inner join b on(a.id = b.id),只查询出a表和b表中相同的数据,不符合的不显示
4)分页 limit
limit i,n
i为查询结果的索引值;n为查询结果返回的数量。从i开始查询数据,返回n条,左闭右开
5)分组函数
avg()、sum()、max()、min()、count()
17、增删改查基本语法
1)插入
单行
insert into tablename (field1,field2,field3……) values(value1,value2,value3……)
insert into tablename set field1 = value1,field2 = value2……
多行
insert into tablename (field1,field2,……) values (value1)(value2),(value3)……
一般情况下都是分开多个单行语句进行插入
2)修改
update tablename set field = value where……
3)删除
delete from tablename where ……