数据库常用的操作
这不算是一个问题,只算是给大家的一个提醒。如果你是现场面试的话,有时候是会被要求手写SQL的,所以你对于groupBy,orderBy,子查询之类的基础肯定是要会的。。。不然写一个简单的sql你都不会,估计直接就凉了。推荐你们看一下《MySQL必知必会》,我觉得这本书算是比较基础,比较容易上手。
什么是左连接,什么是右连接,什么是全连接,什么是内连接?
左外链接的结果集中包含left outer指定的左表的所有行,不仅仅是链接列所匹配的,内链接的话查出的数据仅仅是链接匹配的行,左连接的话,如果左表中的某行在右表中没有相匹配的行,但是在结果集中可以看到左表的所有内容,右表中没有相互匹配的话就为空值。
右外连接:有链接的作用与左连接相反,右边的表总是显示所有信息,无论左表中是否有信息,表之间的顺序也影响查询结果。
内连接:取的两个表的(有能连接的字段)的交集,即字段相同的。利用内连接可获取两表的公共部分的记录。
全连接:
数据库的事务有哪些特性?
主要有四个特性,ACID,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
数据库中的隔离等级有哪些?
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable.
脏读、不可重复读、幻象读概念说明:
脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。
不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。
幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条 select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)
数据库的索引有什么作用?用什么来实现的?
索引是用来加快查找速度的。目前在数据库中一般是使用B+树来实现索引的。
B树和B+树有什么区别?为什么索引不用B树
总体上来说,B+树在非叶子结点不保存数据,只在叶子结点保存。而B树在叶子结点和非叶子结点都会保存。这种结构导致你如果用B树来进行查询,会增加磁盘IO的次数,导致性能不如B+树。
什么是乐观锁,什么是悲观锁?
乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。
当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。这种借助数据库锁机制,在修改数据之前先锁定,再修改的方式被称之为悲观并发控制.
悲观锁主要分为共享锁或排他锁
- 共享锁【Shared lock】又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
- 排他锁【Exclusive lock】又称为写锁,简称X锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据行读取和修改。
SQL编译的过程大概是什么样的?(这一点可不看,算是偏门)
这个其实是一个很有意思的问题。当时有一个面试官问我说,你直接写一堆的sql来进行数据的处理,和用一个存储过程来进行数据的处理,哪个性能更好一些。我当时没回答上来,后来面试官逐步引导我,我才回答上来的。存储过程是会在数据库中先进行编译的,所以你使用存储过程直接调用就可以了。而你如果直接写一堆的SQL语句的话,比存储过程多了一个编译的过程,所以存储过程性能好一点。然后由这个问题延伸出来一个有意思的问题。如果你了解过一些网络安全方面的知识,那你应该就听过SQL注入攻击。防止SQL注入,在jdbc中一种有效的方法就是使用prepareStatement,prepareStatement其实就是使用了预编译的方式来防止SQL注入的。
