聚合查询也叫统计查询,通过聚合函数对表中字段值进行统计或计算;
1、聚合函数:仅返回单值的函数如计数(count)、最大值(max)、最小值(min)、平均值(avg)、求和(sum)等,除count外,其它方法的参数必须是可计算的数值型字段;序号方法说明参数1count统计数量参数是要统计的字段名(可选)
2max获取最大值参数是要统计的字段名(必须)
3min获取最小值参数是要统计的字段名(必须)
4avg获取平均值参数是要统计的字段名(必须)
5sum获取总分参数是要统计的字段名(必须)
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 控制器代码:<?php
namespace app\index\controller;
//导入数据库类
use think\Db;
class Index {
public function index(){
$result = Db::table('tp5_staff') //设置数据表
-> 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位小数)<?php
namespace app\index\controller;
//导入数据库类
use think\Db;
class Index {
public function index(){
$result = Db::table('tp5_staff') //设置数据表
-> where(['dept'=>['=','开发部']]) //设置查询条件
-> avg('salary'); //查询部门平均工资
//查看结果
dump(round($result,2));
}
}查询结果:float(6456.43) // 开发部员工的平均工资对应的SQLSELECT 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、总结单独的统计查询其实并不常用,分组查询中其实也用到了聚合函数。聚合查询比较适合用在子查询中,后面还会有实例讲解。