聚合查询

聚合查询

也叫统计查询,通过聚合函数对表中字段值进行统计或计算;

1、聚合函数:仅返回单值的函数

如计数(count)、最大值(max)、最小值(min)、平均值(avg)、求和(sum)等,除count外,其它方法的参数必须是可计算的数值型字段;

序号 方法 说明 参数
1 count 统计数量 参数是要统计的字段名(可选)
2 max 获取最大值 参数是要统计的字段名(必须)
3 min 获取最小值 参数是要统计的字段名(必须)
4 avg 获取平均值 参数是要统计的字段名(必须)
5 sum 获取总分 参数是要统计的字段名(必须)

2、 源码分析:

这几个方法,其内部的实现机制是一样的,都用调用之前学过的value方法实现
,每个方法源码很简单,在此一并贴出:

1. count方法源码:

/** * COUNT查询 * @access public * @param string $field 字段名 * @return integer */ public function count($field = '*') { return (int) $this->value('COUNT(' . $field . ') AS tp_count', 0); }

2. sum方法源码:

/** * SUM查询 * @access public * @param string $field 字段名 * @return float|int */ public function sum($field = '*') { return $this->value('SUM(' . $field . ') AS tp_sum', 0) + 0; }

3. min方法源码:

/** * MIN查询 * @access public * @param string $field 字段名 * @return float|int */ public function min($field = '*') { return $this->value('MIN(' . $field . ') AS tp_min', 0) + 0; }

4. max方法源码:

/** * MAX查询 * @access public * @param string $field 字段名 * @return float|int */ public function max($field = '*') { return $this->value('MAX(' . $field . ') AS tp_max', 0) + 0; }

5. avg方法源码:

/** * AVG查询 * @access public * @param string $field 字段名 * @return float|int */ public function avg($field = '*') { return $this->value('AVG(' . $field . ') AS tp_avg', 0) + 0; }

源码分析:

  • 聚合方法( '字段名' ) 等价于 value( ' 聚合函数( 字段名 ) ') ;
  • 例如: sum( 'salary' ) <===> value( 'sum( salary ) ' ) 。

3、实例演示

任务1 :统计tp5_staff表中工资大于8000的员工人数

  • Index.php 控制器代码:
 where(['salary'=>['>',8000]]) //设置查询条件 -> count(); //统计满足条件的记录数量 //查看结果 dump($result); } }
  • 查结结果:
int( 6 ) //表示满足条件的有6条记录
  • count方法默认参数为'*',所以此处可以省略;
  • 其中的的count方法可以用value方法替代
Db::table('tp5_staff') -> where(['salary'=>['>',8000]]) -> value( 'count( '*' )' );
  • 对应的SQL语句:
SELECT COUNT(*) AS tp_count FROM `tp5_staff` WHERE `salary` > 8000 LIMIT 1;

任务2 :统计tp5_staff表中开发部平均工资(结果取2位小数)

 where(['dept'=>['=','开发部']]) //设置查询条件 -> avg('salary'); //查询部门平均工资 //查看结果 dump(round($result,2)); } }
  • 查询结果:
float(6456.43) // 开发部员工的平均工资
  • 对应的SQL
SELECT AVG(salary) AS tp_avg FROM `tp5_staff` WHERE `dept` = '开发部' LIMIT 1
  • 同理,也可以用value方法进行改写:
Db::table('tp5_staff') -> where('dept','开发部') -> value( 'avg( salary )' );
  • max方法,min方法,sum方法使用方式与前面二例完全相同,此处不再举例。

4、总结

单独的统计查询其实并不常用,分组查询中其实也用到了聚合函数。聚合查询比较适合用在子查询中,后面还会有实例讲解。