--92 连表查询
--等值查询
--查询员工信息和部门信息
select * from emp e, dept d where e.deptno = d.deptno;
--查询员工名称和部门名称
select e.ename,d.dname from emp e,dept d where e.deptno=d.deptno;
--查询员工所有信息和部门名称
select e.*,d.dname from emp e,dept d where e.deptno=d.deptno;
--查询工资大于3000的员工的姓名,工资和部门名称
select e.ename, e.sal, d.dname
from emp e, dept d
where e.deptno = d.deptno
and e.sal > 3000;
--非等值查询
--查询员工的工资等级
select *
from emp e, salgrade s
where e.sal <= s.hisal
and e.sal >= s.losal;
--查询SCOTT的工资等级
select e.ename, s.grade
from emp e, salgrade s
where e.sal <= s.hisal
and e.sal >= s.losal
and e.ename = 'SCOTT';
--外连接
--左外连接
select * from emp e,dept d where e.deptno=d.deptno(+);
--右外连接
select * from emp e,dept d where e.deptno(+)=d.deptno;
--自连接,自己连接自己
--查询员工姓名和员工的经理的姓名
select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr=e2.empno;
--查询员工姓名和员工经理姓名和其经理姓名
select e1.ename, e2.ename, e3.ename
from emp e1, emp e2, emp e3
where e1.mgr = e2.empno
and e2.mgr = e3.empno;
--99 连表查询
--cross join 交叉连接(笛卡尔积)
--查询员工表和部门表信息
select * from emp e cross join dept d;
--natural join 自然连接
--查询员工表和部门表信息
select * from emp natural join dept;
--using
--查询员工姓名和部门编号
select e.ename,deptno from emp e join dept d using(deptno);
--on 自定义连接条件
--查询员工表和部门表的信息
select * from emp e join dept d on e.deptno = d.deptno;
--查询员工姓名和经理姓名
select e1.ename, e2.ename from emp e1 join emp e2 on e1.mgr = e2.empno;
--查询员工姓名和经理姓名和其经理姓名
select e1.ename, e2.ename, e3.ename
from emp e1
join emp e2
on e1.mgr = e2.empno
join emp e3
on e2.mgr = e3.empno;
--inner join 内连接
select * from emp e inner join dept d on e.deptno=d.deptno;
--left join 左外连接,以左表为主
select * from emp e left join dept d on e.deptno=d.deptno;
--right join 右外连接,以右表为主
select * from emp e right join dept d on e.deptno=d.deptno;
--full join 全连接,取两个表的所有数据
select *from emp e full join dept d on e.deptno=d.deptno;
--查询员工姓名和部门姓名和其经理姓名和经理的部门名称
select e1.ename, d1.dname, e2.ename, d2.dname
from emp e1
left join dept d1
on e1.deptno = d1.deptno
left join emp e2
on e1.mgr = e2.empno
left join dept d2
on e2.deptno = d2.deptno;
--单行子查询
--查询工资高于CLARK的员工的信息
select * from emp where sal>(select sal from emp where ename='CLARK');
--查询工资高于平均工资的员工的名字和工资
select ename,sal from emp where sal >(select avg(sal) from emp );
--查询和SCOTT同一部门且比他工资低的员工名字和工资
select ename, sal
from emp
where sal < (select sal from emp where ename = 'SCOTT')
and deptno = (select deptno from emp where ename = 'SCOTT');
--查询工资最高的员工名字和工资。
select ename,sal from emp where sal =(select max(sal) from emp );
--查询职务和SCOTT相同,比SCOTT雇佣时间早的员工信息
select *
from emp
where job = (select job from emp where ename = 'SCOTT')
and hiredate < (select hiredate from emp where ename = 'SCOTT');
--查询工资比SCOTT高或者雇佣时间比SCOTT早的员工的编号和名字
select empno, ename
from emp
where sal > (select sal from emp where ename = 'SCOTT')
or hiredate < (select hiredate from emp where ename = 'SCOTT');
-- 多行子查询
--查询和SCOTT,SWITH,CLARK在同一个部门的员工信息并不包含SCOTT,SWITH,CLARK;
select *
from emp
where deptno in
(select distinct deptno from emp where ename in ('SCOTT', 'SWITH', 'CLARK'))
and ename not in ('SCOTT', 'SWITH', 'CLARK');
--查询工资低于任何一个“CLERK”的工资的员工信息。
select * from emp where sal <any(select sal from emp where job='CLERK');
--查询工资比所有的“SALESMAN”都高的员工的编号、名字和工资。
select empno, ename, sal
from emp
where sal < all (select sal from emp where job = 'SALESMAN');
--查询部门20中职务同部门10的雇员一样的员工信息。
select * from emp where job in(select job from emp where deptno=10) and deptno=20;
--查询在员工中有哪些人是经理人
select *
from emp
where empno in (select distinct mgr
from emp
where mgr is not null
or mgr != '');
--找出部门编号为20的所有员工中收入最高的职员
select * from emp where sal =(select max(sal) from emp where deptno=20) and deptno =20;
--查询每个部门平均薪水的等级
select b.deptno, grade
from salgrade s, (select deptno, avg(sal) a from emp group by deptno) b
where s.losal <= b.a
and s.hisal >= b.a
SQL的多表查询和子查询
最新推荐文章于 2024-07-25 18:23:42 发布