数据库常见面试题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库
1.左连接,右连接,内连接,外连接的区别 10
内连接也叫连接,是最早的一种连接。
还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
外连接分为三种:左外连接,右外连接,全外连接。
其中左外连接:left join是以左表的记录为基础的,例如A可以看成左表,B可以看成右表,它的结果集是A表中的数据,再加上A表和B表匹配的数据。
其中A表的记录将会全部表示出来,而右表B只会显示符合搜索条件的记录。
B 表记录不足的地方均为NULL。
右外连接与左外连接正好相反。
全连接则是左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充
2.MySQL中in 和exsit区别 10
exists()后面的子查询被称做相关子查询,他是不返回列表的值的.只是返回一个ture或false 的结果(所以一般exists中的子查询里写成"select 1 " 当然也可以select任何东西)
其运行方式是先运行主查询一次,再去子查询里查询与其对应的结果,如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询. in()后面的子查询是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.
3.数据库查询缓慢的常见原因以及优化方法? 10
查询速度慢的原因很多,常见如下几种:(1)没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)(2)I/O吞吐量小,形成了瓶颈效应。
(3)没有创建计算列导致查询不优化。
(4)内存不足,网络速度慢(5)查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)(6)锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)(7)返回了不必要的行和列(8)查询语句不好,没有优化。
可以通过如下方法来优化查询:(1)把数据、日志、索引放到不同的I/O设备上,增加读取速度(2)纵向、横向分割表,减少表的尺寸(3)升级硬件(4)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。
(5)DB Server 和APPLication Server 分离(6)优化SQL语句:1、SELECT子句中避免使用‘* ‘:2、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(ROLLBACK SEGMENTS ) 用来存放可以被恢复的信息. 假如你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCA TE 时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (注意: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) 3、尽量多使用COMMIT:只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少4、用Where子句替换HA VING 子句5、使用表的别名(Alias):当在SQL语句中连接多个表时, 使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. 6、用EXISTS替代IN、用NOT EXISTS替代NOT IN:在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的。
7、用EXISTS替换DISTINCT:8、SQL语句用大写的因为Orale总是先解析SQL语句,把小写的字母转换成大写的再执行9、避免在索引列上使用NOT:10、用>=替代> 11、用IN来替换OR 12、避免在索引列上使用IS NULL和IS NOT NULL 13、总是使用索引的第一个列等
4.SQLServer和Oracle的区别是什么? 10
(1)数据类型不同。
sql server 的数据类型:int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima,float,bit;oracle 的数据类型:number(p,s),char,varchar2,Date,LOB(2)获得当前系统时间的函数不同。
(3)在oracle中没有默认约束的说法(4)连接变量和字符串的方式不一样(5)oracle没有identity自动增长列,而是使用序列实现增长(6)条件语句if……else……的语法不同(7)case语句的语法不同(8)触发器创建语法不同
5.Oracle数据库怎样删除重复行,怎样根据条件筛选数据 10
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 HA VING COUNT(id) > 1) AND ROWID NOT IN (SELECT MIN(ROWID) FROM 表GROUP BY id
HA VING 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.数据库中用什么关键字进行排序,升降序,分组,分组后查询 10
Order by排序,order by 列 desc|asc降升序,group by分组,having分组后查询。