MySQL数据库查询之聚合查询
关键字
distinct
去重,在结果中去除重复的行。
语法:
select distinct column_names from 表名;
我打开的是一个订单详情表
作用于单列:
select distinct(order_id) from order_detail where id<30;
我们看一下效果
作用于多列:
select distinct order_id, buy_number from order_detail where id<30;
看来只有一条是重复的
count
统计数量!
select count(id) from order_detail;
统计表中有多少条记录
select count(distinct(order_id)) from order_detail;
去掉重复的内容进行统计
concat(str1, str2, ...)
连接函数,可以联合多列,构成一个总的字符串。
select contact(order_id, '-', product_id) from order_detail where id<30;
concat_ws(separator, str1, str2, ...);
第一个参数(separator)是其他参数的分隔符。
select concat_ws('-', order_id, product_id) from order_detail where id<30;
注:mysql 的 concat 函数在连接字符的时候,只要其中有某一个字段为 null,那么则整个返回 null.
group by
分组查询,对结果进行分组。通过 group by 子句可以将数据划分到不同的组里,实现对记录的分组查询。
语法:
select column_name, aggregate_function(column_name) from table_name
where condition group by column_name;
我们来打开员工表
看到了我们的表中存在一个 office_id
我们打开这个 office 表看一下
每个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;
sum()
求表中某个字段的总和
select sum(total_money),order_id from order_detail where id > 1800 group by order_id;
我们就可以看到我们订单的总金额了
我们来一个复杂的
select sum(total_money) as nu, order_id from order_detail group by order_id order by nu desc limit 10;
这样我们就取出了所有订单中总价前十的订单号和他们的金额!
avg()
求表中某个字段平均值
select avg(total_money),order_id from order_detail group by order_id;
select avg(total_money) as nu, order_id from order_detail group by order_id order by nu desc limit 10;
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;
我们可以利用 having 筛选员工数大于10个的公司的 ID 但是不能使用 where 来筛选
因为原表中没有 count(employee——id)这个字段