【数据库】数据库的分组查询、排序查询、连接查询 及 相关子查询

分组统计

  • -- 查询各部门员工的平均年收入

select deptno , avg((sal + COALESCE(comm,0)) * 12) 平均年收入 from emp group by deptno;

 

 -- 查询不同职务的员工的总年收入

select job , sum((sal + COALESCE(comm,0)) * 12) 平均年收入 from emp group by job;

 

 -- 查询各部门下各职务员工的平均年收入

select deptno,job,avg((sal + COALESCE(comm,0)) * 12) 平均年收入 from emp group by deptno,job;


-- 查询10,20部门下各职务员工的平均年收入

select deptno,job,avg((sal + COALESCE(comm,0)) * 12) 平均年收入 from emp group by deptno,job having deptno in 
(10,20) ;
-- 不推荐

select deptno,job,avg((sal + COALESCE(comm,0)) * 12) 平均年收入 from emp where deptno in (10,20) group by deptno,job ;
-- 推荐

 

 

 

 

  • 排序

 --按工资由多到少排列

select * from emp order by sal +  COALESCE(comm,0) desc;

 

 

--按工资由少到多排列

select * from emp order by sal +  COALESCE(comm,0),hiredate ;
​

 

 

 

多表查询(笛卡尔机原理)

https://www.cnblogs.com/leibao/p/8471630.html 

 

连接查询

 

自然连接

select * from emp,dept;

 

 

 

等值连接 86标准


查询员工基本信息及其所在部门的信息

--查询员工基本信息及其所在部门的信息
select * from emp,dept where emp.deptno = dept.deptno;


select empno,ename,job,sal,comm,hiredate,deptno,dname,loc from emp,dept where emp.deptno = dept.deptno; 
-- 这个查询是错误的,因为连接后投影列必须加上表名做前缀,表示列属于哪个表


select emp.empno,emp.ename,emp.job,emp.sal,emp.comm,emp.hiredate,emp.deptno,dept.dname,dept.loc from emp,dept where emp.deptno = dept.deptno;  
-- 这个是正确的


select e.empno,e.ename,e.job,e.sal,e.comm,e.hiredate,e.deptno,d.dname,d.loc from emp e,dept d where e.deptno = d.deptno;
-- 一般表名使用别名

 



等值连接 | 92标准 | 报表查询

select e.ename,e.job,e.sal,e.comm,d.dname,d.loc from emp e join dept d on e.deptno = d.deptno;

 

内连接

查询员工工资等级

select e.ename,e.sal,s.grade,s.losal,s.hisal from emp e join salgrade s;



非等值接连


 查询员工姓名,收入信息及其工资的等级

select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;

 

 查询员工姓名,收入信息及其工资的等级

select e.ename,e.sal,s.grade from emp e inner join salgrade s on e.sal between s.losal and s.hisal;


查询员工姓名,收入信息及其工资的等级及员工的经理的姓名

select e.ename,e.sal,e1.ename,s.grade from emp e join salgrade s join emp e1 on (e.sal between s.losal and s.hisal) and e.mgr = e1.empno 
-- 了解


select e.ename,e.sal,e1.ename,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal join emp e1 on e.mgr = e1.empno;
-- 推荐

 

 

右外连接:无限制左表


 查询员工姓名,收入信息及其工资的所有等级(即便工资等级没有员工也要列出)

select e.ename,e.sal,s.grade from emp e right outer join salgrade s on e.sal between s.losal and s.hisal;

 


左外连接:无限制右表

select e.ename,e.sal,s.grade from salgrade s left join emp e on e.sal between s.losal and s.hisal;

 


全外连接
select e.ename,e.sal,s.grade from salgrade s full outer join emp e on e.sal between s.losal and s.hisal;

-- 这个会报错,因为mysql不支持全外连接

 

自连接

查询员工的姓名及1其经理的姓名

select e.ename,e.empno 员工编号,e1.ename,e.mgr 经理编号 from emp e join emp e1 on e.mgr = e1.empno;

 

 

【先分等级再连接】

查询员工姓名、收入信息及其工资的等级及员工的经理的姓名

select e.ename,e.sal,e1.ename,s.grade from emp e join salgrade s join emp e1 on (e.sal between s.losal and s.hisal) and e.mgr = e1.empno;

【先连接再分等级】

select e.ename,e.sal,e1.ename,s.grade from emp e join salgrade s on e.sal between s.losal and s.hisal join emp e1 on e.mgr = e1.empno;

 

 


​相关子查询


 查找至少有一个员工的经理 相关子查询

select * from emp e where exists(select * from emp e1 where e1.mgr = e.empno);


查找至少有三个员工的经理 相关子查询

select * from emp e where 3 <= (select count(*) from emp e1 where e1.mgr = e.empno);


查找至少有三个员工的经理的员工 相关子查询

select t.empno 员工编号,t.ename 员工姓名,e3.ename 经理姓名 from emp e3 join
(select * 
from emp e2 
where e2.mgr in (
   select e.empno 
   from emp e 
   where 3 <= (
       select count(*) 
       from emp e1 
       where e1.mgr = e.empno)
    ))t 
on t.mgr = e3.empno;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_浮舍_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值