oracle层次查询(通过自身id和managerid查询上下级)、子查询(>、<、=、in、exists)、多表查询(inner join、outer join)、集合操作(union、intersect、minus)
employees表等的创建参考链接:https://www.cnblogs.com/muhai/p/16169598.html
一、层次查询
employees表中有员工编号employess_id和该员工上级编号manager_id两个字段,manager_id就是上级的employee_id,通过这两个字段查找某员工的上级或者下级
select employee_id,first_name,last_name,manager_id,level from employees start with employee_id=197 connect by prior employee_id=manager_id;
//寻找员工编号为employee_id=197的下级,level表示员工处于第几级,不是employees里面的字段,employee_id=manager_id就是递归查询manager_id是197的员工,start with employee_id=197表示从197号开始找下级
select employee_id,first_name,last_name,manager_id,level from employees start with employee_id=197 connect by prior manager_id=employee_id;
//寻找employee_id=197的上级,manager_id=employee_id就是递归查询employee_id=124的员工,124是197员工的上级编号
select sys_connect_by_path(first_name,'/') from employees start with employee_id=197 connect by prior manager_id=employee_id; //通过sys_connect_by_path将上级的first_name连起来,相当于递归路径
二、子查询
1、单行子查询:子查询返回结果是单行单列,>、>=、<、<=、<>。
2、多行子查询:子查询返回结果是多行单列,all是和返回结果所有值比较,any是和返回结果任意一个值比较,in是等于返回结果中的任意一个值。
(1)any、all使用,替换单行子查询。查找所有在Smith之后入职的人员
select last_name,hire_date from employees where hire_date>(select hire_date from employees where last_name='Smith');
会出现 single-row subquery returns more than one row的错误提示,子查询返回多行,如下图返回两行,可以通过添加any或all来限定
select last_name,hire_date from employees where hire_date>any(select hire_date from employees where last_name='Smith') order by hire_date;
这里>any是表示选择入职日期大于返回的入职日期最小值的人员
(2)in使用,not in后面的子查询不能包含null,否则查询没有结果,in是若干个等式的or条件组合,not in是若干个等式的and条件组合。employees表里有部分员工id号在departments表里,表示部门负责人,查询非部门负责人就要用到not in。
select * from departments;
select employee_id,last_name from employees where employee_id not in (select manager_id from departments);
这里没有返回任何结果,这是因为返回的manager_id中有空值,而where id not in(a,b)相当于id!=a and id!=b,如果a、b中有null,id!=null就返回false,null与任何数值比较都得false,与null值的比较要用 is或者is not。
可通过在子查询中将null值排除或使用not exists。
select employee_id,last_name from employees where employee_id not in (select manager_id from departments where manager_id is not null); //等价于 select employee_id,last_name from employees a where not exists (select 1 from departments b where a.employee_id=b.manager_id);
3、相关查询
查询工资大于本部门平均工资的员工
select last_name,salary from employees a where salary>(select avg(salary) from employees b where a.department_id=b.department_id);
三、多表查询
参考链接:https://www.cnblogs.com/muhai/p/15431403.html
四、集合操作
参考链接:https://www.cnblogs.com/muhai/p/15455954.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下