1. 左连接,右连接,内连接,外连接的区别
内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。外连接分为三种:左外连接,右外连接,全外连接。其中左外连接:left join是以左表的记录为基础的,例如A可以看成左表,B可以看成右表,它的结果集是A表中的数据,再加上A表和B表匹配的数据。其中A表的记录将会全部表示出来,而右表B只会显示符合搜索条件的记录。B表记录不足的地方均为NULL。右外连接与左外连接正好相反。全连接则是左表和右表都不做限制,所有的记录都显示,两表不足的地方用null 填充。
2. MySQL中in 和exsit区别
exists()后面的子查询被称做相关子查询 ,他是不返回列表的值的.只是返回一个ture或false的结果(所以一般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语句:
1、SELECT子句中避免使用 ‘ * ‘:
2、用TRUNCATE替代DELETE:当删除表中的记录时,在通常情况下, 回滚段(ROLLBACK SEGMENTS ) 用来存放可以被恢复的信息. 假如你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. (注意: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是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:
8、SQL语句用大写的 因为Orale总是先解析SQL语句,把小写的字母转换成大写的再执行
9、避免在索引列上使用NOT:
10、用>=替代>
11、用IN来替换OR
12、避免在索引列上使用IS NULL和IS NOT NULL
13、总是使用索引的第一个列等
4. SQLServer和Oracle的区别是什么?
(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数据库怎样删除重复行,怎样根据条件筛选数据
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分组后查询