高级查询,分组查询

Posted 将心比心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级查询,分组查询相关的知识,希望对你有一定的参考价值。

分组查询
定义:利用内置的分组函数来查询

  所谓分组,就是看待数据的“角度”不同。
  也就是把某类值相同的看做一组。

语法:
select 列名,组函数(列名)...from 表名
where 条件
group by 列
having 字句
order by 列

分组函数:
SUM([distinct] 列|表达式|值)   求和
AVG([distinct] 列|表达式|值)   求平均值
MAX(列|表达式|值)   求最大值
MIN(列|表达式|值)    求最小值
COUNT([distinct] 列|*)  求个数(包含null)

如:

-- 找出员工的最高、最低、平均、以及工资总和
select max(salary),min(salary),avg(salary),sum(salary) from s_emp;

-- 找出各部门员工的最高、最低、平均、以及工资总和
select dept_id, max(salary),min(salary),avg(salary),sum(salary) from s_emp
group by dept_id
order by dept_id
;

-- 找出41,42,50部门员工的最高、最低、平均、以及工资总

select dept_id, max(salary),min(salary),avg(salary),sum(salary) from s_emp
group by dept_id
having dept_id in(41,42,50)
order by dept_id
;

select dept_id, max(salary),min(salary),avg(salary),sum(salary) from s_emp
where dept_id in(41,42,50)
group by dept_id
order by dept_id
;




注意1:只有出现在group by 后面的列[用来做为分组条件的列],才有资格
写在SELECT的后面,除非使用组函数进行修饰。

注意2:having 和where 都是条件
区别:
WHERE 子句中是不能使用 组函数的,因为它在GROUP BY 之前。
但是,HAVING 子句中可以使用组函数,因为它在GROUP BY 之后。


-- 统计各个职称中工资高于1100的各有多少人。
select count(*),title
from s_emp
where salary >1100
group by title;
-- 找出订单数量超过>=2个的客户
select c.name
from s_customer c join s_ord o on o.customer_id = c.id
group by c.id,c.name
having count(o.id)>=2;

-- 统计共计多少个员工
select count(e.id) from s_emp e;


-- 统计共计多少个职称[不能重复]
select count(distinct title) from s_emp;

练习:
--1.找出超过(含)4个员工的部门id及部门名称
select d.id,d.name,count(*)  from s_emp e
left join s_dept d on e.dept_id = d.id
group by d.id,d.name
having count(*)>=4;

--2.找出订单总费用超过10000元的客户
select c.name,c.id from s_customer c
left join s_ord o on c.id = o.customer_id
where o.total>=10000
group by c.name,c.id;

--3.统计各区域的客户数量,按它的降序排序
select r.id,r.name,count(*) from s_region r
join s_customer c on c.region_id = r.id
group by r.id ,r.name
order by count(*)desc;

--4.统计各经理的所管理的员工数
select e.manager_id ,count(e.id) from s_emp e
left join s_emp m on e.manager_id = m.id
group by e.manager_id;
--5.统计订单中各种支付的费用
select sum(o.total) 费用,o.payment_type 支付方式 from s_ord o group by o.payment_type;

以上是关于高级查询,分组查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 高级查询1 关联查询 分组查询

第3天SQL快速入门-高级查询(SQL 小虚竹)

第3天SQL快速入门-高级查询(SQL 小虚竹)

05: MySQL高级查询

6.5笔记-DQL高级查询

MongoDB高级查询多级分组聚合及时间计算应用实践案例