oracle-sql多表联合查询(sql99)

概述

本文讲的是 SQL99 标准的 多表联合查询,其功能比 SQL92 更为强大

一共有7种:

详细参见:
https://www.runoob.com/w3cnote/sql-join-image-explain.html

内连接

只返回满足 连接条件 的数据,与 SQL92 中的 等值关联查询 相同,由于 SQL92 的写法更简单,所以较少使用内连接

语法

from 左表 inner join 右表 on 关联条件

查询员工所在部门名称、员工姓名、职务

select d.dname,e.ename,e.job from emp e inner join dept d on e.deptno=d.deptno;

左外查询

返回满足 连接条件 的数据,还返回 左表 中不满足连接条件的行

语法

from 左表 left [outer] join 右表 on 关联关系

解释:

  • outer:可省略

查询各个部门下员工姓名、职务、工资

select a.dname,b.ename,b.job,b.sal  from dept a left join emp b on a.deptno=b.deptno

查询各个部门下员工姓名、工资,并且职务是MANAGER

正确写法,用 where 过滤条件:

select a.dname,b.ename,b.job,b.sal  from dept a left join emp b on a.deptno=b.deptno where b.job='MANAGER';

错误写法,用on过滤条件:

select a.dname,b.ename,b.job,b.sal  from dept a left join emp b on a.deptno=b.deptno and b.job='MANAGER'

关键字 on 、 where 后面都可以加条件,一般 on 后面是 关联关系, where 后面是 过滤条件

注意:
如果on后面是 过滤条件 ,会引起 错误

总结

  • left join 是左外查询,表示将左侧表的所有记录全部查询出来

  • 关键字 on 、 where 后面都可以加条件,一般 on 后面是 关联关系, where 后面是 过滤条件

  • on 必须有,且优先级比 where 高

例子

查询员工姓名、职务、工资、上级领导姓名(将所有人员全部列出)

select a.ename,a.job,a.sal,b.ename from emp a left join  emp b on  a.mgr=b.empno;

多个表

SELECT
    a.NAME AS 商品名称,
    b.NAME AS 商品种类,
    a.CODE AS 商品编号,
    d.NAME AS 库存类型,
    c.NAME AS 单位,
    a.price AS 定价,
    a.sort AS 排序,
    a.STATUS AS 状态

FROM
    goods AS a
    LEFT JOIN goods_type AS b ON a.type_1 = b.id
    LEFT JOIN goods_unit AS c ON a.unit = c.id
    LEFT JOIN wm_type AS d ON d.id = a.wm_type;

右外查询

返回满足 连接条件 的数据,还返回 右表 中不满足连接条件的行

from 左表 right [outer] join 右表 on 关联关系

解释:

  • outer:可省略

查询各个部门下员工姓名、职务、工资

select d.dname,e.ename,e.job,e.sal from emp e right join dept d on e.deptno=d.deptno;

查询各个部门下员工姓名、工资,并且职务是MANAGER

正确写法,用where过滤条件:

select d.dname,e.ename,e.sal from emp e right join dept d  on  e.deptno=d.deptno where job='MANAGER';

错误写法,用on过滤条件:

select d.dname,e.ename,e.sal from emp e right join dept d  on  e.deptno=d.deptno and job='MANAGER'

关键字on、where后面都可以加条件,一般on后面是 关联关系,where后面是 过滤条件

注意:
如果on后面是 过滤条件 ,会引起 错误

总结

  • right join是右外查询,表示将右侧表的所有记录全部查询出来

  • 关键字on、where后面都可以加条件,一般on后面是 关联关系,where后面是 过滤条件

  • on 必须有,且优先级比where高

全连接查询

结合的左,右外连接的结果,并使用 NULL 值 作为两侧缺失匹配结果

语法

from 左表 full [outer] join 右表 on 关联关系

解释:

  • outer:可省略

例子

select e.empno, e.ename, d.deptno from emp e full join dept d on e.deptno = d.deptno;

原文出处:/show_1EF35F3HrWrA.html