mysql知识总结

本博客包括mysql易错点,mysql 引擎

mysql 索引

两种索引: InnoDB (聚簇索引)和MyISAM(非聚簇索引)
InnoDB 聚簇索引:与数据存放的位置一致,一张表只能存在一个聚簇索引。InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形.
主键索引:

mysql知识总结_第1张图片
** 辅助索引(二级索引,非聚簇索引):**
mysql知识总结_第2张图片
辅助索引(Secondary Index, 也就是非主键索引):
在叶子节点中会存储辅助索引列值+主键,并指向对应的行。好处:innodb在移动行时无须更新行指针。 缺点:使用主键值会让辅助索引占据更多的空间。
所以,如果主键定义的比较大,其他索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。同时InnoDB 不会压缩索引。
MyISAM:
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
mysql知识总结_第3张图片

辅助索引
在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
mysql知识总结_第4张图片

讲解的很不错的博客:
mysql 聚簇索引原理
innodb 与MyISAM索引实现原理
回看:https://www.cnblogs.com/shijingxiang/articles/4743324.html

mysql易错点

when 与group by,having
1 when,group by ,having 可以一起使用,when作用于group by 之前,having作用group by 之后,且必须和group by 同时出现。此时group by 会对when 中经过限制条件选择之后结果进行分组,而having 则是对分组之后的结果添加限制条件,从分组之后的结果中选择出满足条件的记录。
2 having其后所接一般为聚集函数,除having后聚集函数中出现的属性字段外,select语句后的属性字段必须全部出现在group by 子句中。而when后面不能跟 聚集函数作为条件。
**case when **

update empc set sal=case when sal>2000 and  sal<=4600 then sal*1.15
                         when sal>4600 then sal*0.9
                         else sal end; 

  此种用法类似 if ...else 当第一个条件满足时便不会执行 第二个,如果前面条件都不满足时执行else条件
   select cname,case when cource='数学'  then score else 0 end 数学,
        case when cource='语文'  then score else 0 end 语文,
        case when cource='英语'  then score else 0 end 英语
       from tb ;

行变列

select cname,case when cource='数学'  then score else 0 end 数学,
      case when cource='语文'  then score else 0 end 语文,
      case when cource='英语'  then score else 0 end 英语
     from tb ;
``
对每个记录都进行判断,满足任何一个casewhen的条件的都会作为结果放在名为该casewhen 属性字段下。

**top n**

关键词 limit,limit 开始位,选取个数。最好用于无并列情况。当选取最大者(最小者)时,limit 0,1。可以放在子查询中,主查询中。

select deptno,dname from dept where deptno =(select deptno from emp group by deptno order by count(deptno) desc limit 0,1);

子查询几乎可以出现在查询语句的任何位置,但是,当子查询作为查询源和属性字段出现时必须起别名。

你可能感兴趣的:(mysql)