MySQL数据库查询之聚合查询


关键字

distinct
 

去重,在结果中去除重复的行。

语法:

select distinct column_names from 表名;


MySQL数据库查询之聚合查询

我打开的是一个订单详情表

作用于单列:

 select distinct(order_id) from order_detail where id<30;


 MySQL数据库查询之聚合查询

我们看一下效果

作用于多列:

select distinct order_id, buy_number from order_detail where id<30;


MySQL数据库查询之聚合查询

看来只有一条是重复的

count 

统计数量!

select count(id) from order_detail;


MySQL数据库查询之聚合查询

统计表中有多少条记录


select count(distinct(order_id)) from order_detail;


 MySQL数据库查询之聚合查询

去掉重复的内容进行统计

 

concat(str1, str2, ...)

连接函数,可以联合多列,构成一个总的字符串。


select contact(order_id, '-', product_id) from order_detail where id<30;


MySQL数据库查询之聚合查询


concat_ws(separator, str1, str2, ...); 

第一个参数(separator)是其他参数的分隔符。

select concat_ws('-', order_id, product_id) from order_detail where id<30;


MySQL数据库查询之聚合查询


注:mysql 的 concat 函数在连接字符的时候,只要其中有某一个字段为 null,那么则整个返回 null.


聚合查询

group by 

分组查询,对结果进行分组。通过 group by 子句可以将数据划分到不同的组里,实现对记录的分组查询。


语法:

select column_name, aggregate_function(column_name) from table_name 

where condition group by column_name;

我们来打开员工表


MySQL数据库查询之聚合查询


看到了我们的表中存在一个 office_id

我们打开这个 office 表看一下


MySQL数据库查询之聚合查询

每个office_id代表着一个公司


select * from employee group by office_id;

这样我们就把员工按照公司分成了不同的组

单独使用 group by 时,没什么实际意义!在与 avg() , sum(), count() 聚合函数一起使用时,作用最大。


聚合函数


聚合函数的最大特点是它们根据一组数据求出一个值。

聚合函数的结果值只根据选定行中非null的值进行计算,null被忽略。

count()  

统计个数

select count(employee_id), office_id from employee group by office_id;

这样就统计出了公司的员工的数量了

select count(employee_id),gender from employee group by gender;

我们还可以统计公司男女员工的数量!


max() 

求表中某个字段最大值(数值类型)

select max(price) from order_detail;

在所有订单中单价最高的商品!

select max(price),order_id from order_detail where id>1800 group by order_id;

这句语句的意思是我们把所有的订单按照订单号进行分组

然后取每组订单中单价最大的那一条

我们来查看一下一号订单

在一号订单中 单价最大的就是这个了!

min() 

求表中某个字段最小值

select min(price) from order_detail;

单价最小的商品

select min(price),order_id from order_detail group by order_id;

MySQL数据库查询之聚合查询


sum() 

求表中某个字段的总和

select sum(total_money),order_id from order_detail where id > 1800 group by order_id;

MySQL数据库查询之聚合查询

我们就可以看到我们订单的总金额了

我们来一个复杂的

select sum(total_money) as nu, order_id from order_detail group by order_id order by nu desc limit 10;


MySQL数据库查询之聚合查询

这样我们就取出了所有订单中总价前十的订单号和他们的金额!

avg()

求表中某个字段平均值

select avg(total_money),order_id from order_detail group by order_id;

MySQL数据库查询之聚合查询

select avg(total_money) as nu, order_id from order_detail  group by order_id order by nu desc limit 10;

MySQL数据库查询之聚合查询


having 和 where 的区别?

我们都知道 having 和 where 都可以用来筛选数据

“Where” 是一个约束声明,Where 是在结果返回之前起作用的, where  子句在聚合前先筛选记录.也就是说作用在 group by 子句和 having 子句前

“Having”是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having 中可以使用聚合函数。

select count(employee_id), office_id from employee group by office_id;

select count(employee_id), office_id from employee group by office_id having count(employee_id) > 10;


MySQL数据库查询之聚合查询


我们可以利用 having 筛选员工数大于10个的公司的 ID 但是不能使用 where 来筛选

因为原表中没有 count(employee——id)这个字段