MySQL数据操作语言:外连接查询

为什么要使用外连接

  • 如果说陈浩是一名临时人员, 没有固定的部门]编制,那么我们想查询每名员工和他的部门门名称,用内连接就会漏掉陈浩,所以要引入外连接的语法才能解决这个问题


外连接简介

  • 外连接与内连接的区别在于,除了符合条件的记录之外,结果集中还会保留不符合条件的记录。
SELECT 
    e.empno, e.ename, d.dname
FROM
    t_emp e
LEFT JOIN t_dept d ON e.deptno = d.deptno;

左连接和右连接

  • 左外连接就是保留左表所有的记录,与右表做连接。如果右表有符合条件的记录就与左表连接。如果右表没有符合条件的记录,就用NULL与左表连接。右外连接也是如此。

UNION关键字

  • UNION关键字可以将多个查询语句的结果集进行合并
    (查询语句) UNION (查询语句) UNION (查询语句)...
  • 前提是字段的个数和名称都要相同
    `

练习

  1. 查询每个部门门的名称和部门门的人数?
select d.dname,count(e.deptno)
from t_dept d left join t_emp e
on d.deptno=e.deptno
group by d.deptno;
  1. 查询每个部门的名称和部门的人数? 如果没有部门的员工,部门名称用NULL代替。
(
select d.dname,count(e.deptno)
from t_dept d left join t_emp e
on d.deptno=e.deptno
group by d.deptno
) UNION
(
select d.dname,count(*)
from t_dept d right join t_emp e
on d.deptno=e.deptno
group by d.deptno
);
  1. 查询每名员工的编号、姓名、部门、月薪、工资等级、工龄、上司编号、上司姓名、上司部门?
select 
    e.empno,e.ename,d.dname,
    e.sal+ifnull(e.comm,0) salary,s.grade,
    floor(datediff(now(),e.hiredate)/365) work_day,
    t.empno mgrno,t.ename mgrname,t.dname mgrdname
from t_emp e left join t_dept d on e.deptno=d.deptno
left join t_salgrade s on e.sal between s.losal and s.hisal
left join
(select e1.empno,e1.ename,d1.dname
from t_emp e1 join t_dept d1
on e1.deptno=d1.deptno
) t on e.mgr=t.empno;

外连接的注意事项

  • 内连接只保留符合条件的记录,所以查询条件写在ON子句和WHERE子句中的效果是相同的。但是外连接里,条件写在WHERE子句里,不合符条件的记录是会被过滤掉的,而不是保留下来。
  • 错误示范
SELECT
    e.ename, d.dname, d.deptno
FROM
    t_emp e
LEFT JOIN t_dept d ON e.deptno=d.deptno
AND e.deptno=10;
  • 正确示范
SELECT
    e.ename, d.dname, d.deptno
FROM
    t_emp e
LEFT JOIN t_dept d ON e.deptno=d.deptno
WHERE e.deptno=10;

你可能感兴趣的:(MySQL数据操作语言:外连接查询)