数据库(four day)——莫愁千里路,自有到来风。

发布于:2025-07-17 ⋅ 阅读:(7) ⋅ 点赞:(0)

1.分组统计

前提:至少有两个及以上的个体,这些个体具有相同的特性。

(1)分组查询

GROUP BY     分组语句

HAVING     分组筛选语句

where 是在分组前使用,不能使用统计函数

having子句必须结合group by子句使用,是分组后的过滤,可使用统计函数。

例:

        1.列出至少有四个员工的所有部门编号、部门名称、部门人数

        2.列出雇佣日期早于其领导的所有员工的编号,姓名,部门名称,领导名称。

        3.列出所有部门名称和这些部门的员工信息(人数、平均工资、平均服务年限、最高最低工资),同时列出那些没有员工的部门。

        4.列出最低工资大于1500的职位名称和以及此职位的人数。

        5.列出各个部门的CLERK(柜员)的最低薪金。
        6.求出部门名称中带‘S’字符的部门员工的工资合计和部门的人数

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.子查询

指在一个查询中嵌套若干个小的查询,用()包裹。

绝大多数情况下,子查询分类方式为:

  • 子查询返回单行单列HAVINGWHERE
  • 子查询返回单行多列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); 

2.查询与SCOTT工资相同且职位相同的雇员信息。

SELECT *

FROM emp

WHERE sal=(SELECT sal FROM emp WHERE ename='SCOTT')

AND job=(SELECT job FROM emp WHERE ename='SCOTT')

AND ename!='SCOTT';


网站公告

今日签到

点亮在社区的每一天
去签到