索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读取表的每一个数据页,如果有索引指向数据值,则查询只需要读少数次的磁盘就行啦。所以合理的使用索引能加速数据的查询。但是索引并不总是提高系统的性能,带索引的表需要在数据库中占用更多的存储空间,同样用来增删数据的命令运行时间以及维护索引所需的处理时间会更长。所以我们要合理使用索引,及时更新去除次优索引

按存储结构区分:“聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引,非簇集索引)”

按数据唯一性区分:“唯一索引”,“非唯一索引”

按键列个数区分:“单列索引”,“多列索引”

使用了group by 后,要求Select出的结果字段都是可汇总的,否则就会出错。还有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面。

比如,有:{学号,姓名,性别,年龄,成绩}字段

这样写:
SELECT 学号,姓名,性别,年龄,sum(成绩)
FROM 学生表
GROUP BY 学号
就是错的,因为 “姓名、性别、年龄”未被汇总,且不一定是单一。

这样写:
SELECT MAX(学号),MAX(姓名),MAX(性别),MAX(年龄),sum(成绩)
FROM 学生表
GROUP BY 学号
是对的,汇总出每一同学号学生的总成绩。注意的是,只要学号相同,别的如果有不同,取它们值最大的一条作为显示输出。

这样写:
SELECT 学号,姓名,性别,年龄,sum(成绩)
FROM 学生表
GROUP BY 学号,姓名,性别,年龄
这样写也是对的,但注意的是,学号,姓名,性别,年龄中,只要有一个不同,就会当成另一条记录来汇总。

 

不怎么常见的聚合函数:

count_big()返回指定组中的项目数量。与count()函数区别:count_big()返回bigint值,而count()返回的是int值。

grouping()产生一个附加的列。当用cube或rollup运算符添加行时,输出值为1;当所添加的行不是由cube或rollup产生时,输出值为0.

binary_checksum() 返回对表中的行或表达式列表计算的二进制校验值,用于检测表中行的更改

checksum_agg() 返回指定数据的校验值,空值被忽略。

checksum() 返回在表的行上或在表达式列表上计算的校验值,用于生成哈希索引。

stdev()返回给定表达式中所有值的统计标准偏差。

stdevp() 返回给定表达式中的所有值的填充统计标准偏差。

 var() 返回给定表达式中所有值的统计方差。

 varp()返回给定表达式中所有值的填充的统计方差。