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. 数据库中用什么关键字进行排序,升降序,分组,分组后查询
Order by排序,order by 列 desc|asc降升序,group by分组,having分组后查询
4. 数据库查询缓慢的常见原因以及优化方法?
(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、总是使用索引的第一个列等
5.索引查询失效的几个情况
1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
3、组合索引,不是使用第一列索引,索引失效。
4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。
6、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
7、对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))
8、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
6.什么情况下应不建或少建索引?
1、表记录太少
2、经常插入、删除、修改的表
3、数据重复且分布平均的表字段,假如一个表有10万行记录,有一个字段A只有T和F两种值,且每个值的分布概率大约为50%,那么对这种表A字段建索引一般不会提高数据库的查询速度。
4、经常和主字段一块查询但主字段索引值比较多的表字段
7.四种隔离级别
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
Read committed (读已提交):可避免脏读的发生。
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
8.、Mysql 中 MyISAM 和 InnoDB 的区别有哪些?
区别:
InnoDB支持事务,MyISAM不支持
对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。
但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键太大,其他索引也都会很大。
而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
如何选择:
是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB
系统奔溃后,MyISAM恢复起来更困难,能否接受;
MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。