1.分组统计
前提:至少有两个及以上的个体,这些个体具有相同的特性。
(1)分组查询
GROUP BY 分组语句
HAVING 分组筛选语句
where 是在分组前使用,不能使用统计函数
having子句必须结合group by子句使用,是分组后的过滤,可使用统计函数。
例:
1.列出至少有四个员工的所有部门编号、部门名称、部门人数
2.列出雇佣日期早于其领导的所有员工的编号,姓名,部门名称,领导名称。
4.列出最低工资大于1500的职位名称和以及此职位的人数。
1.
select d.deptno,dname,count(ename)
from emp e join dept d on
e.deptno=d.deptno
group by d.deptno
having count(ename)>=4;2.
select e.empno,e.ename,dname,m.ename
from emp e left join emp m on
e.mgr=m.empno join dept d on
e.deptno=d.deptno where e.hiredate>m.hiredate;3.
select dname,count(ename),avg(sal),max(sal),min(sal),
avg((JULIANDAY('now')-JULIANDAY(hiredate))/365)
from dept d left join emp e on d.deptno=e.deptno
group by d.deptno;4.
select job,count(ename)
from emp
group by job
having min(sal)>1500;5.
select min(sal)
from dept d join emp e on d.deptno=e.deptno where job='CLERK'
group by d.deptno;6.
select sum(sal+ifnull(comm,0)),count(ename)
from dept d left join emp e on d.deptno=e.deptno where dname like '%S%'
group by d.deptno;
(2)手动分组
当一些情况,需要表示多类平级的内容时,用并集可达到效果。
UNION
此外,单引号内字符串可以实现分类提醒作用
如下:
查询领取佣金的人数和平均工资 + 不领取佣金的人数和平均工资。
SELECT '领取佣金',COUNT(sal),AVG(sal+comm)
FROM emp WHERE comm IS NOT NULL
UNION
SELECT '不领取佣金',COUNT(sal),AVG(sal)
FROM emp WHERE comm IS NULL;
2.子查询
指在一个查询中嵌套若干个小的查询,用()包裹。
绝大多数情况下,子查询分类方式为:
- 子查询返回单行单列:HAVING、WHERE
- 子查询返回单行多列:WHERE
- 子查询返回多行多列:FROM
SELECT子句也能使用子查询,但是非常少用。
(1)where 子查询
where主要是控制数据行。
其结果:
单行单列
单行多列
多行多列
①单行单列
先进行第一步查询,查询出一个数据并把这个数据赋给下一次查询。
如:
1.查询公司平均工资
SELECT AVG(sal) FROM emp;
2.把上一步查询的结果带入原题
--查询所有高于公司平均工资(2073)的雇员信息 SELECT * FROM emp WHERE sal>2073;
3.子查询可以把上面两步结合
SELECT * FROM emp WHERE sal>(SELECT AVG(sal) FROM emp);
②单行多列
相当于是拥有多个平级的子查询子句,分别把查询的值赋给最终查询语句块。
例:
1.查询出公司雇佣最早且工资最低的雇员信息(条件特殊,刚好满足)。
SELECT *
FROM emp
WHERE hiredate=(SELECT MIN(hiredate) FROM emp) AND sal=(SELECT MIN(sal) FROM emp);
SELECT *
FROM emp
WHERE sal=(SELECT sal FROM emp WHERE ename='SCOTT')
AND job=(SELECT job FROM emp WHERE ename='SCOTT')
AND ename!='SCOTT';