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;