实例:按部门统计员工人数,要求显示:部门号,部门名称,人数
分析:涉及到2张表,部门表(部门号,部门名称),员工表(员工表);
错误语句:
select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno = d.deptno
group by d.deptno,d.dname;
注意:d.deptno,d.dname不在组函数count(e.empno)参数中,所以要加上group by 子句
验证部门信息:
发现DEPTNO为40的部门信息没显示,因为emp员工表中deptno为40的员工不存在。
查询发现没有数据。
所以where的条件需要修改
外连接:通过外连接,把对于连接条件不成立的记录,任然包含在最后的结果中。
左外连接:当连接条件不成立的时候,等号左边的表任然被包含。
右外连接:当连接条件不成立的时候,等号右边的表任然被包含。
where e.deptno(+) = d.deptno 因为本实例需要显示的是部门deptno表中的部门号和部门名称右外连接,把+号放在等号左边。
select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno(+) = d.deptno
group by d.deptno,d.dname;这里要注意等号的左右位置。
用(+)来实现, 这个+号可以这样来理解: + 表示补充,即哪个表有加号,这个表就是匹配表。如果加号写在左表,右表就是全部显示,所以是右连接
最终结果: