首页 > 技术专区 > 面试题 > 面试题基础八(数据库部分) 屏幕太窄?试试伸展一下吧 >

面试题基础八(数据库部分)

1.    左连接,右连接,内连接,外连接的区别

内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。外连接分为三种:左外连接,右外连接,全外连接。其中左外连接:left join是以左表的记录为基础的,例如A可以看成左表,B可以看成右表,它的结果集是A表中的数据,再加上A表和B表匹配的数据。其中A表的记录将会全部表示出来,而右表B只会显示符合搜索条件的记录。B表记录不足的地方均为NULL。右外连接与左外连接正好相反。全连接则是左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。

2.    MySQL中in 和exsit区别

exists()后面的子查询被称做相关子查询  ,他是不返回列表的值的.只是返回一个turefalse的结果(所以一般exists中的子查询里写成"select   1 "   当然也可以select任何东西
其运行方式是先运行主查询一次 ,再去子查询里查询与其对应的结果,如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询. in()后面的子查询   是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出。

3.    数据库查询缓慢的常见原因以及优化方法?

查询速度慢的原因很多,常见如下几种:

(1)没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)

(2)I/O吞吐量小,形成了瓶颈效应。

(3)没有创建计算列导致查询不优化。

(4)内存不足,网络速度慢

(5)查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)

(6)锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)

(7)返回了不必要的行和列

(8)查询语句不好,没有优化。

可以通过如下方法来优化查询 :

(1)把数据、日志、索引放到不同的I/O设备上,增加读取速度

(2)纵向、横向分割表,减少表的尺寸

(3)升级硬件

(4)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。

(5)DB Server APPLication Server 分离

(6)优化SQL语句:

1SELECT子句中避免使用 * ‘:  

2、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(ROLLBACK SEGMENTS ) 用来存放可以被恢复的信息. 假如你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (注意: TRUNCATE只在删除全表适用,TRUNCATEDDL不是DML)  

3、尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少

4、用Where子句替换HAVING子句

5、使用表的别名(Alias)  当在SQL语句中连接多个表时, 使用表的别名并把别名前缀于每个Column.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误

6、用EXISTS替代IN、用NOT EXISTS替代NOT IN  在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的  

7、用EXISTS替换DISTINCT  

8SQL语句用大写的  因为Orale总是先解析SQL语句,把小写的字母转换成大写的再执行 

9、避免在索引列上使用NOT 

10、用>=替代>  

11、用IN来替换OR  

12、避免在索引列上使用IS NULLIS NOT NULL  

13、总是使用索引的第一个列等

4.    SQLServer和Oracle的区别是什么?

1)数据类型不同。sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,float,bitoracle 的数据类型:number(p,s),char,varchar2,Date,LOB

2)获得当前系统时间的函数不同。

3)在oracle中没有默认约束的说法

4)连接变量和字符串的方式不一样

5oracle没有identity自动增长列,而是使用序列实现增长

6)条件语句if……else……的语法不同

7case语句的语法不同

8)触发器创建语法不同

5.    Oracle数据库怎样删除重复行,怎样根据条件筛选数据

1、查找表中多余的重复记录,重复记录是根据单个字段(Id)来判断 ;

select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(Id)来判断,只留有rowid最小的记录;  

DELETE from 表 WHERE (id) IN ( SELECT id FROM 表 GROUP BY id HAVING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表 GROUP BY id HAVING COUNT(*) > 1);

3、查找表中多余的重复记录(多个字段);

select * from 表 a where (a.Id,a.seq) in(select Id,seq from 表 group by Id,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录;

delete from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录;

select * from 表 a where (a.Id,a.seq) in (select Id,seq from 表 group by Id,seq having count(*) > 1) and rowid not in (select min(rowid) from 表 group by Id,seq having count(*)>1)

6.    数据库中用什么关键字进行排序,升降序,分组,分组后查询

Order by排序,order by 列 desc|asc降升序,group by分组,having分组后查询