-- 查询部门编号>10的员工信息 select deptno from dept where deptno>10; --多行单列 select*from emp where deptno in (select deptno from dept where deptno>10)
-- 多条件查询,大多数可以使用开窗代替 -- 例子:查看每个部门工资最高的员工姓名和他的工资 -- 开窗的做法 select*from ( select ename,sal,deptno,rank()over(partitionby deptno orderby sal desc) r from emp ) where r=1;
-- 多条件多行操作 select ename,sal,deptno from emp where (deptno,sal) in ( select deptno,max(sal) from emp groupby deptno )
-- 多行多列 单行多列 一个表 select ename,sal,rank()over(orderby sal desc) from emp select*from ( select ename,sal,rank()over(orderby sal desc) paiming from emp ) where paiming<=3
-- 等值连接:只返回两个表中连接字段相等的行。 -- 连接emp表和dept表,匹配deptno select*from emp,dept where emp.deptno=dept.deptno select*from emp innerjoin dept on emp.deptno=dept.deptno
-- 不等值连接:过滤条件的符号不是等号 -- 查询员工的工资级别:连接emp表和salgrade表,根据emp表的sal和salgrade表的losal和hisal匹配其他内容 select ename,sal,grade from emp innerjoin salgrade on emp.sal between losal and hisal
自连接
1 2
-- 查询出每个员工的上级领导(查询内容:员工编号、员工姓名、领导编号、领导姓名) select yg.empno,yg.ename,ld.empno,ld.ename from emp yg innerjoin emp ld on yg.mgr=ld.empno
多表连接
1
select yg.empno,yg.ename,ld.empno,ld.ename,dname from emp yg innerjoin emp ld on yg.mgr=ld.empno innerjoin dept on ld.deptno=dept.deptno
leftjoin(左连接,左外连接):返回包括左表中的所有记录和右表中连接字段相等的记录,如果没有匹配上,以null值代表右边表的列。 -- 左表(from的表)为主表,全显示,右表(join的表)为子表,显示满足on匹配条件的数据 select*from emp leftouterjoin dept on emp.deptno=dept.deptno select*from dept leftouterjoin emp on emp.deptno=dept.deptno
rightjoin(右连接,右外连接):返回包括右表中的所有记录和左表中连接字段相等的记录,如果没有匹配,以null值代表左边表的列 -- 右表(join的表)为主表,全显示,左表(from的表)为子表,显示满足on匹配条件的数据 select*from dept rightouterjoin emp on emp.deptno=dept.deptno select*from emp rightouterjoin dept on emp.deptno=dept.deptno fulljoin(全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录,没有匹配上,以null值代表左右边表的列。 -- 左右表都显示,满足条件的显示,不满足条件的留空 select*from emp fullouterjoin dept on emp.deptno=dept.deptno
-- 筛选出来emp表中不满足条件的数据 select*from emp e leftjoin dept d on e.deptno=d.deptno where d.deptno isnull -- 筛选出dept表中不满足条件数据 select*from emp e rightjoin dept d on e.deptno=d.deptno where e.deptno isnull -- 筛选出emp和dept表中不满足条件的数据 select*from emp e fulljoin dept d on e.deptno=d.deptno where d.deptno isnullor e.deptno isnull
--1.查询工资比20号部门工资都大的员工信息 select*from emp where sal>(selectmax(sal) from emp where deptno=20)
--2.查询工资比20号部门工资任意一个大的员工信息 select*from emp where sal>(selectmin(sal) from emp where deptno=20)
--3.求最高工资员工的姓名 select ename from emp where sal=(selectmax(sal) from emp)
--4.查询员工工资和工作都和20号部门同时一样的员工信息 select*from emp where (sal,job) in(select sal,job from emp where deptno=20)
--5.查询部门平均工资大于整个公司平均工资的部门 select deptno from emp groupby deptno havingavg(sal)>(selectavg(sal) from emp)
--6.求工资前五名的员工信息 select*from ( select emp.*,dense_rank()over(orderby sal desc) rnk from emp ) where rnk<=5
--7.查询emp表中所有数据的第2条到第5条 select*from( select emp.*,row_number()over(orderby rownum desc) rnk from emp ) where rnk between2and5
--8.求每个部门工资最高的员工信息 select*from emp where (deptno,sal) in( select deptno,max(sal) from emp groupby deptno )
--1.查询所有员工的名字和部门名称 select ename,dname from emp,dept where emp.deptno=dept.deptno select ename,dname from emp innerjoin dept on emp.deptno=dept.deptno
--2.查询所有部门名称及部门的所有员工列表 select d.deptno,wm_concat(ename) from dept d leftjoin emp e on d.deptno = e.deptno groupby d.deptno,d.dname orderby d.deptno
--3.求所有员工姓名,工资和其领导的姓名,工资 select yg.ename,yg.sal,ld.ename,ld.sal from emp yg innerjoin emp ld on yg.mgr=ld.empno
--4.求所有员工工资大于其领导工资的员工姓名和其上级领导姓名,上级领导工资及员工工资 select yg.ename,yg.sal,ld.ename,ld.sal from emp yg innerjoin emp ld on yg.mgr=ld.empno where yg.sal>ld.sal
--5.在上题的基础上查询员工所对应的部门 select yg.deptno,dname,yg.ename,yg.sal,ld.ename,ld.sal from emp yg innerjoin emp ld on yg.mgr=ld.empno innerjoin dept on yg.deptno=dept.deptno where yg.sal>ld.sal
--6.查询出不是领导的员工 select*from emp where empno notin (select mgr from emp where mgr isnot null)
--7.查询出每个员工编号,姓名,部门名称,工资等级和他的上级领导的姓名,工资等级 select yg.empno,yg.ename,dname,yg_sg.grade,ld.ename,ld_sg.grade from emp yg innerjoin dept d on yg.deptno=d.deptno leftjoin emp ld on yg.mgr=ld.empno leftjoin salgrade yg_sg on yg.sal between yg_sg.losal and yg_sg.hisal leftjoin salgrade ld_sg on ld.sal between ld_sg.losal and ld_sg.hisal
--1.10号部门的部门名称和7369的员工姓名进行行拼显示,使用union all实现 select dname from dept where deptno=10 unionall select ename from emp where empno=7369
--2.查看不是领导的员工编号和员工姓名,使用minus和子查询实现 select empno,ename from emp minus select empno,ename from emp where empno in (select mgr from emp where mgr isnot null)
--1.查询比三个部门平均工资都高的员工编号,员工姓名,工种和收入 select empno,ename,job,sal from emp where sal>all( selectavg(sal) from emp groupby deptno )
--2.显示部门名称为RESEARCH的员工姓名,工资 select ename,sal from emp e join dept d on e.deptno=d.deptno where dname='RESEARCH'
--3.如果部门名称中含有字母T,则查询该部门所有员工信息,两种方法实现 --join select*from emp e join dept d on e.deptno=d.deptno where dname like'%T%' --子查询 select*from emp where deptno in( select deptno from dept where dname like'%T%' )
--4.如果有平均工资不小于1500的部门信息则查询相应的部门信息 select*from dept where deptno in( select deptno from emp groupby deptno havingavg(sal)>=1500 )
--5.查询出Emp表中比所有销售员(“SALESMAN”)工资低的员工姓名、工作、工资 select ename,job,sal from emp where sal<( selectmin(sal) from emp where job='SALESMAN' )
--6.显示比工资最高的员工参加工作时间晚的员工姓名,参加工作时间 select ename,hiredate from emp where hiredate>all( select hiredate from emp where sal=( selectmax(sal) from emp ) )
--7.查询emp表中有2个以上直接下属的领导人员信息 select*from emp e whereexists( select1from emp where mgr=e.empno groupby mgr havingcount(*)=2 )
--8.使用开窗函数求出emp表中每一个部门工资第一高的人员姓名ename和人员工资sal,以及他所在部门的最高工资 with rnk_emp as( select ename,sal,deptno, row_number()over(partitionby deptno orderby sal desc) row_num, max(sal)over(partitionby deptno) dept_max_sal from emp ) select*from rnk_emp where row_num=1
--9.emp表中每个部门员工入职日期最早的员工信息,多条件子查询 select e.*from emp e join( select deptno,min(hiredate) min_date from emp groupby deptno ) d on e.deptno=d.deptno and e.hiredate = d.min_date
--10.实现下表功能 --小计 select e.deptno "部门", d.dname "部门名称", e.job "工作", count(*) "小计", null "合计" from emp e join dept d on e.deptno = d.deptno groupby e.deptno, d.dname, e.job unionall --合计 select e.deptno "部门", d.dname "部门名称", null "工作", null "小计", count(*) "合计" from emp e join dept d on e.deptno = d.deptno groupby e.deptno, d.dname orderby "部门","工作" nulls first