SQL的多表查询和子查询

--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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值