【数据库】数据库的分组查询、排序查询、连接查询 及 相关子查询
2023-09-11 14:20:37 时间
分组统计
-
-- 查询各部门员工的平均年收入
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;
相关文章
- oracle数据库表空间的创建与使用
- 在 linux 中连接 mysql 数据库
- 数据库原理之索引
- MS SQL 数据库状态为SUSPECT的处理方法
- 第二百八十八节,MySQL数据库-索引、limit分页、执行计划、慢日志查询
- PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)
- python DB.fetchall()--获取数据库所有记录列表
- 10分钟掌握数据库建模
- 淘宝数据库OceanBase SQL编译器部分 源码阅读--Schema模式
- 单实例数据库安装脚本
- Power Designer 连接SqlServer 数据库 导出表结构
- atitit.客户端连接oracle数据库的方式总结
- 【成为架构师课程系列】性能优化技术之“池化技术”:如何减少频繁创建数据库连接的性能损耗?
- 0x09 Python连接MySQL数据库
- 《Java程序设计》第16周周五:数据库连接 与 随机数的使用
- QML与C++交互:在qml中使用QSqlQueryModel显示数据库数据
- 数据库的水平扩展与垂直扩展
- 数据库连接用户名和密码加密
- Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
- SPSS连接mysql数据库详细操作教程