内连接(等值连接)
为了能够更好的描述出当前的问题,下面向emp表之中增加一行记录,此记录属于没有部门的雇员。
INSERT INTO emp(empno, ename, job) VALUES(8888, '张三', 'CLERK') ;
- 使用内连接:
SELECT e.empno, e.ename, e.job, d.deptno, d.dname, d.loc
FROM emp e, dept d
WHERE e.deptno=d.deptno ;
现在的代码是属于,只有当“e.deptno=d.deptno”这个条件满足之后,才会显示出对应的数据。
如果此时数据为空,那么,此条件无法满足,则内容不能够显示。
问题来了:(在emp表中,“张三”的部门编号为空,所以,“张三”的信息不能够显示。)
另外,在dept表中,部门编号为40的部门,暂时 没有人 在该部门工作。
问题:在 emp表,dept表 的多表查询中,如果想要显示出雇员姓名为“张三”的雇员信息,或者想要显示出部门编号为40的部门信息,该怎么办??
那么此时就需要用到外连接了
外连接
- 观察 左外连接
此时,全部的雇员信息,都可以正常显示出来了,但是,由于“张三”没有对应的部门数据,所以,此行记录的部门数据为空。
- 观察 右外连接
发现此时的程序,所有的部门信息会进行显示,但是由于部门编号为40的部门没有雇员,所以,此行记录的雇员数据为空。
自连接
查询每个雇员的姓名、职位、领导姓名领导姓名,与领导的雇员编号
每个雇员对应了一个领导编号,而每一个领导也属于雇员。
- 使用自连接
但是,发现了一个问题,此时的数据显示不完整,(“张三”、“KING”的信息没有显示出来)。如果发现查询的数据不完整,那么,建议使用外连接
这种自己关联自己的查询,也称为自身关联,但不管是不是自身关联,程序认的只是FROM子句之后存在有多少张数据表,有多张表就必须编写消除笛卡尔积的条件。