根据实际应用场景划分,SQL语句可分为统计类、查询类、更新类等不同类型。在语句设计中,核心关注点是优化执行效率,旨在降低语句执行耗时,并最小化对CPU、内存、I/O以及网络带宽等资源的消耗。为提高效率,通常采用一系列手段,包括充分利用索引、缩小操作粒度、简化操作复杂度等。下面我们先来看一下统计类语句的注意事项。
一、统计类语句
- count()的不同用法:
- count(*): 对应用优化,仅进行行累加,不取全部字段值,无论是否包含null。
- count(主键id): 对InnoDB引擎而言,遍历整张表取出每行id值,由于主键不为空,按行累加。
- count(1): InnoDB引擎遍历整张表,不取值,但对于每一行返回填充数字1,实际按行累加。
- count(字段): 如果字段定义为not null,实际按行累加;如果允许为null,额外判断只累加非null的行。
- count(distinct col): 计算该列除null之外的不重复数量,例如,count(distinct col1, col2)。
- 注意:
- 统计表中记录数时,优先使用count(*),因为它是SQL92标准的统计行数语法,与具体数据库无关。
- sum()的用法:
- sum(col): 当某一列的值全为null时,count(col)返回结果为0,而sum(col)返回结果为null,需注意空指针异常(NPE)问题。
- group by的使用:
- 基本规则:
- 在select后的列中,所有未使用聚合函数的列必须出现在group by子句中。
- 例如:
select point, count(id) from t_table group by point
,point列未使用聚合函数,必须在group by子句中出现。
- 与order by的结合使用:
- group by与order by联合使用时,order by要位于group by之后。
- order by子句中的列必须包含在聚合函数或group by子句中。
- 基本规则:
二、总结
SQL语句根据应用场景可划分为统计、查询、更新等类型,着重在设计中优化执行效率,降低耗时及资源消耗。采用手段包括索引充分利用、操作粒度缩小、复杂度简化。在统计类语句中,count()有多用法,推荐优先使用count(*)。sum()需注意空指针异常。group by与order by联合使用时,遵循列出现规则。这些注意事项有助于提高SQL查询效率。