010、多表查询 ( join on 查询 )

 

连接查询:也可以叫跨表查询,需要关联多个表进行查询。

主要用到 join on
# ---------------------------- 010、多表查询 ( 连接查询 ) -----------------------
# 显示每个员工信息,并显示所属的部门名称
select e.*,d.dname from emp e join dept d on e.deptno=d.deptno;

# (内连接)显示薪水大于 2000 的员工信息,并显示所属的部门名称
select e.*,d.dname from emp e join dept d on e.deptno=d.deptno where e.sal>2000;

# (外连接)显示员工信息,并显示所属的部门名称,如果某一个部门没有员工,那么该部门也必须显示出来
#  右连接
select e.*,d.dname from emp e right join dept d on e.deptno=d.deptno;
#  左连接:
select e.*,d.dname from dept d right join  emp e on e.deptno=d.deptno;
# 以上左、右连接两个查询效果相同

# 查询所有员工的信息,显示员工名,领导名。
select e.ename, l.ename from emp e left join emp l on e.mgr=l.empno;

 

连接分类:
内链接
  * 表 1 inner join 表 2 on 关联条件
  * 做连接查询的时候一定要写上关联条件
  * inner 可以省略
外连接
  *左外连接
    * 表 1 left outer join 表 2 on 关联条件
    * 做连接查询的时候一定要写上关联条件
    * outer 可以省略
  *右外连接
    * 表 1 right outer join 表 2 on 关联条件
    * 做连接查询的时候一定要写上关联条件
    * outer 可以省略
*左外连接(左连接)和右外连接(右连接)的区别:
*左连接以左面的表为准和右边的表比较,和左表相等的不相等都会显示出来,右表符合条件的显示,不符合条件的不显 示
*右连接恰恰相反,以上左连接和右连接也可以加入 outer 关键字,但一般不建议这种写法,如:
 
一般在写查询语句时,建议先按以下这样写, 这样思路比较清晰。
# (内连接)显示薪水大于 2000 的员工信息,并显示所属的部门名称
select
     e.*,d.dname 
from 
    emp e 
join 
    dept d 
on 
    e.deptno=d.deptno 
where 
    e.sal>2000;

 

等值连接 与 非等值连接
等值连接:e.deptno=d.deptno
# (内连接,等值连接)显示薪水大于 2000 的员工信息,并显示所属的部门名称
select e.*,d.dname from emp e join dept d on e.deptno=d.deptno where e.sal>2000;
# 

非等值连接:e.sal between s.losal and s.bisal ,条件不是一个等量关系,称为非等值连接。

# 非等值连接 ,找出每个员工的薪资等级,要求显示员工名、薪资、薪资等级
select
    e.ename, e.sal, s.grade
from
    emp e
join
    salgrade s
on
    e.sal between s.losal and s.hisal;

 

三张表连接

语法格式:
# 3、三张表连接
# 语法格式:
select
    ...
from
    表a
join
    表b
on
    表a和表b的连接条件
join
    表c
on
    表a和表c的连接条件
right join
    表d
on
    表d和表a的连接条件
表a和表b连接完,再和表c连接,再和表d连接。
一条sql语句中内连接和外连接可以混合使用。
use bjpowernode;
select * from salgrade;

# 找出每个员工的部门名称及工资等级,要求显示员工名、部门名、薪资、薪资等级
select
    e.ename, d.dname, e.sal, s.grade
from
    emp e
join
    dept d
on 
    e.deptno=d.deptno
join
    salgrade s
on
    e.sal between losal and hisal;
 

 

# 找出每个员工的部门名称及工资等级,上级领导,要求显示员工名、领导名,部门名、薪资、薪资等级
# 带上左连接,会显示king,如果不带left不会显示king,因为king的领导为null
select
    e.ename, l.ename, d.dname, e.sal, s.grade
from
    emp e
join
    dept d
on
    e.deptno=d.deptno
join
    salgrade s
on
    e.sal between s.losal and s.hisal
left join
    emp l
on
    e.mgr=l.empno;

 

posted @ 2021-10-11 17:28  空-山-新-雨  阅读(525)  评论(0编辑  收藏  举报