多表查询

关键词:join

left join以左为尊,完整写法 (left outer join) 但是一般会把outer省略不写 ,右外连接也是一样
语法:
select 列
from A
left join B
on 条件
where
group by
having
order by
注:以A为尊 (A表的全部行都会显示,如B表没有匹配到会以null值填充)
select empno, ename, e.deptno, dname
from emp e
left join dept d
on e.deptno = d.deptno;
select *
from (select * from emp where sal<2000 ) a
left join (select * from emp where deptno = 20) b
on a.empno = b.empno ;

right join 以右为尊
语法:
select 列
from A
right join B
on 条件
注:以B为尊 (B表的全部行都会显示,如A表没有匹配到会以null值填充)
select *
from emp
right join dept
on emp.deptno=dept.deptno
select *
from ( select * from emp where deptno = 20) a
right join (select * from emp where sal<2000) b
on a.empno = b.empno ;

3 .
inner join 内连接 (只显示都有的)

select * from
emp
inner join
dept
on emp.deptno=dept.deptno;
select *
from ( select * from emp where deptno = 20) a
inner join (select * from emp where sal<2000) b
on a.empno = b.empno ;

full join 全连接
A full join B
注:A,B表的全部数据都会展示
select * from emp a full join dept d on a.deptno = d.deptno;
select *
from ( select * from emp where deptno = 20) a
full join (select * from emp where sal<2000) b
on a.empno = b.empno ;

cross join 等同于笛卡尔积
elect * from
emp e
cross join
dept d
注:以emp表为主表 用(+) 简化语法 以 (+) 等号 对面的表为主表
select * from emp e,dept d
where e.deptno=d.deptno(+)

natural join 自然连接
A natural joib B
注:(自动寻找所有相同字段进行关联,去除重复列)
select * from emp natural join dept;

自连接
自己和自己连接
select * from emp a left join emp b on a.mgr = b.empno;

不等值连接
–查询员工的名字,工资,工资等级
select ename, sal, grade
from emp e
left join salgrade s
on e.sal between s.losal and s.hisal;
select * from salgrade;

练习:

查询员工工资比改员工经理工资高的员工的信息
select *
from emp a --员工的薪水
left join emp b --经理的工资
on a.mgr = b.empno
where a.sal > b.sal;

查询员工信息以及其领导的名字
select a.*, b.ename from emp a left join emp b on a.mgr = b.empno;

3)查询 员工的名字,工资, 比该员工工资高的人数

select ename, sal, (select count(*) from emp b where b.sal > a.sal)
from emp a;

4)查询各部门工资的前两名

select a.empno, a.ename, a.deptno,a.sal
from emp a
left join emp b
on a.sal < b.sal
and a.deptno = b.deptno
group by a.deptno,a.empno, a.ename,a.sal
having count(*) <2;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值