概述
本文讲的是 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;
