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是每页显示的条数。