91.如何提升数据查询的效率?

1.首先检查表的结构是否合理,
因为采用多表查询的时候,
看主外键的引用关系是否适当.
如果不适当则重新设置表结构.
如果是应用中的系统,
则不需要更改表的字段,
只更改主外键关系.
如果数据库中有较多的数据,
还应采用索引提高查询效率.

2.利用索引(index)
对查询进行优化,
index可以避免对表数据的全面扫描,
当你以某个字段建立一个索引的时候,
数据库就会生成一个索引页,
索引页不单单保存索引的数据,
还保存了索引在数据库的
具体的物理地址,
能够很快的定位查找到要找的记录

3. 如果表的列很少,
不适合建索引.
表数据很少查询,
而经常做insert、delete、update动作,
不适合建所以。
因为Oracle需要对索引额外维护。
建立索引后,select会快, 
当执行过多次的insert,delete,update后,
会出现索引碎片,
影响查询速度,我
们应该对索引进行重组
(即drop掉索引重新create)

4.索引的类型分为:

B-树索引:
适合于大量的增、删、改,
大多数数据的索引默认类型。

位图索引:
适合于决策支持系统

HASH索引、分区索引等。

92.什么是数据库事务?

事务是作为一个逻辑单元
执行的一系列操作,
要么一起成功,要么一起失败。

一个逻辑工作单元必须有四个属性,
称为 ACID:
原子性、
一致性、
隔离性
持久性
属性,
只有这样才能成为一个事务。

原子性 :
事务必须是原子工作单元;
对于其数据修改,
要么全都执行
,要么全都不执行。

一致性 :
事务在完成时,
必须使所有的数据都保持一致状态。
在相关数据库中,
所有规则都必须应用于事务的修改,
保持所有数据的完整性。
事务结束时,
所有的内部数据结构
(如 B 树索引或双向链表)
都必须是正确的。

隔离性 :
由并发事务所作的修改
必须与任何其它并发事务
所作的修改隔离。
事务查看数据时数据所处的状态,
要么另一并发事务修改它之前的状态,
要么是另一事务修改它之后的状态,
事务不会查看中间状态的数据。
这为可串行性,
因为它能够重新装载起始数据,
并且重播一系列事务,
以使数据结束时的状态
与原始事务执的状态相同。

持久性 :
事务完成之后,
它对于系统的影响是永久性的。
该修改即使出现系统故障也将一直保持。

93.什么是数据库事务的隔离级别?

多个线程开启各自事务操作数据库中数据时,数
据库系统要负责隔离操作,
以保证各个线程在获取数据时的准确性。

数据库共定义了四种隔离级别:
Serializable:(串行化)
可避免脏读、
不可重复读、
虚读情况的发生

Repeatable read:(可重复读)

可避免脏读、
不可重复读情况的发生。

Read committed:(读已提交)
可避免脏读情况发生。

Read uncommitted:(读未提交)
最低级别,
以上情况均无法保证。

94.如何删除表中的重复数据,只保留一条记录?

1、查找表中多余的重复记录,
重复记录是根据单个字段(peopleId)来判断 
select * from people 
where peopleId in (
select peopleId from people 
group by peopleId 
having count(peopleId) > 1
) 

2、删除表中多余的重复记录,
重复记录是根据单个字段(peopleId)来判断,
只留有rowid最小的记录 
delete from people 
where   peopleName in (
select peopleName  from people 
group by peopleName    
having count(peopleName) > 1
) and  peopleId not in (
select min(peopleId) from people 
group by peopleName     
having count(peopleName)>1
) 

3、查找表中多余的重复记录(多个字段) 
select * from vitae a 
where (a.peopleId,a.seq) in (
select peopleId,seq from vitae 
group by peopleId,seq 
having count(*) > 1
) 

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录 
delete from vitae a 
where (a.peopleId,a.seq) in (
select peopleId,seq from vitae
 group by peopleId,seq 
having count(*) > 1
) and rowid not in (
 select min(rowid) from vitae
 group by peopleId,seq
 having count(*)>1
) 

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录 
select * from vitae a 
where (a.peopleId,a.seq) in (
select peopleId,seq from vitae
group by peopleId,
seq having count(*) > 1
) 
and rowid not in (
select min(rowid) from vitae 
group by peopleId,
seq having count(*)>1
)   

6.消除一个字段的左边的第一位:

update tableName set 
[Title]=Right([Title],(len([Title])-1)) 
where Title like '村%'

7.消除一个字段的右边的第一位:

update tableName set 
[Title]=left([Title],(len([Title])-1)) 
where Title like '%村'

8.假删除表中多余的重复记录(多个字段),
不包含rowid最小的记录 
update vitae set ispass=-1
where peopleId in (
select peopleId from vitae 
group by peopleId
)

95.如何通过sql语句完成分页?

客户端通过传递start(页码),
PageSize(每页显示的条数)两个参数
去分页查询数据库表中的数据,
那我们知道MySql数据库提供了
分页的函数limit m,n,
但是该函数的用法和我们的需求不一样,
所以就需要我们根据实际情况
去改写适合我们自己的分页语句,
具体的分析如下:

比如:
查询第1条到第10条的数据的sql是:
select * from table limit 0,10;   
对应我们的需求就是查询第一页的数据:
select * from table limit (1-1)*10,10;

查询第10条到第20条的数据的sql是:
select * from table limit 10,20;  
对应我们的需求就是查询第二页的数据:
select * from table limit (2-1)*10,10;

查询第20条到第30条的数据的sql是:
select * from table limit 20,30;  
对应我们的需求就是查询第三页的数据:
select * from table limit (3-1)*10,10;

二:通过上面的分析,
可以得出符合我们自己需求的分页
sql格式是:
select * from table limit (start-1)*PageSize,PageSize; 
其中start是页码,
PageSize是每页显示的条数。