一、语句相关
1.1 truncate和delete命令异同?
- 相同点是两者都可以用来删除一个表中的数据;
- 不同点如下:
- truncate只能用来删除整张表的数据,不能选择性地删除;delete既可以删除整张表的数据,也可以选择性地删除部分数据;
- truncate是DDL语句,一旦执行就会被隐式地提交,存储空间会被立即释放,无法回滚,数据无法恢复;delete是DML语句,其执行过程是逐行地删除数据,在没有提交之前,被删除的数据的存储空间还没有被释放,并且记录的操作日志,可以通过回滚来恢复数据;
- truncate的执行速度比delete快;
1.2 内连接和外连接的区别?
- 内连接的结果是,只有两个表同时匹配的行才会被筛选出来;
- 外连接,分为左、右、全外连接,自己举例子予以说明;
1.3 数据库的事务是什么?
事务是一组操作的集合,这个集合中的操作要么全部执行成功,要么全部执行不成功;
- 原子性,一系列的操作是不可分割的整体;
- 一致性,事务执行之前和之后,数据都是完整的、一致的;
- 隔离性,在事务提交之前,其部分或全部操作的执行结果对其它数据库操作不可见;这个需要视具体的隔离级别而定:
- READ UMCOMMITED可以读未提交的;容易造成脏读、幻读、不可重复读;
- READ COMMITED可以读已经提交的;可以避免脏读,但是无法避免幻读并且不可重复读;
- REPEATABLE READ可重复读,可以避免脏读、不可重复读,但是无法避免幻读;
- SERIALIZABLE串行化,所有的事务都是串行执行的,解决了幻读的问题,但是没有了并发,数据库效率会大大下降;
- 持久性,事务完成以后,对数据库的修改是永久性的,即使系统或者存储介质异常,只要事务完成了,会由数据库备份和恢复机制来保证数据修改的永久性;
需要额外指出的是,事务的一致性并不能保证并发的一致性。如果有多个线程同时调用同一个事务,还是会造成数据库数据的不一致性;主要带来的影响有:
- 更新丢失,主要包含覆盖丢失、回滚丢失;
- 脏读,如果隔离级别设置READ UMCOMMITED,就可能会读到别的事务还未提交的脏数据;
- 幻读,
- 不可重复读,事务中前后两次读取的数据不一致,可能这其中数据被其它操作修改了;
关于数据库的隔离级别以及脏幻读的详解可以参考:脏读、幻读、不可重复读
1.4 存储过程是什么?
存储过程是一段SQL代码,在其中可以使用流程控制语句来完成复杂的判断和运算,和函数相比有如下的区别:
- 存储过程是作为一个独立的部分执行的,而函数是需要作为SQL语句的一部分来执行的;
- 存储过程一般是用来实现逻辑比较多的复杂流程,而函数则是针对某一具体的功能的;
- 存储过程可以返回多个参数,函数一般只返回几个结果或者一个对象;
- 存储过程在创建时就在服务器上编译好了,每次执行的速度比较快;
1.5 数据库的范式是什么,都有哪些?
范式是研究如何将数据合理地存放在数据库中的一种参考,遵照范式设计数据库,能提高数据查找效率、减少数据冗余、增强数据一致性。
- 第一范式,每一列都是不可再分割的基本数据项;
- 第二范式,每一行数据可以被唯一地区分;
- 第三范式,每一张表中不能包含已在其它表中存在的非关键列;消除传递依赖,消除冗余;
- BCNF,在第三范式的基础上,消除主属性对码的部分与传递函数依赖;
- 第四范式,在第三范式的基础上,消除表中的多值依赖;
1.6 什么是触发器,都有哪些?
触发器是一种特殊的存储过程,它是由事件触发的,而不是程序调用或者手工调用;与存储过程不同的是,触发器不能提交和回滚,也没有参数输入和输出。
- DML触发器、DDL触发器;
- Before触发器、After触发器;
- 语句级触发器、行级触发器;
1.7 什么是游标?
游标是一种能从包含多条记录的数据集中每次提取一条进行处理的机制。游标必须与一条查询SQL相关联,它是由数据集和其中指向特定记录的游标位置组成的。
DECLARE my_cursor CURSOR FROM SELECT * FROM PERSON;
如上示例中,my_cursor就是一个指向查询结果集的游标,用来循环处理每一行数据,但是不能对整个数据集统一进行操作。
未完待续...
网友评论