MySQL-sql多表联合查询(sql99)(inner join、left join、right join、full join) 作者:马育民 • 2020-02-03 22:31 • 阅读:10128 # 概述 本文讲的是 **SQL99** 标准的 **多表联合查询**,其功能比 SQL92 更为强大 一共有7种: [![](http://65242847.gitee.io/pic/hive/sql-join.png)](http://65242847.gitee.io/pic/hive/sql-join.png) 详细参见: 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; ``` 原文出处:http://malaoshi.top/show_1EF4uy1FYBTC.html