多表查询:表的连接

时间:2022-04-12 20:13:24

3.2表的连接

  现在既然可以连接多张数据表进行数据查询,那么在进行表连接的时候就需要设置一个数据主控方。对于这样的连接主要分为两种形式:

  ●内连接(等值连接):所有满足条件的数据都会被显示出来;

  ●外连接(左外连接、右外连接、全外连接):控制左表与右表是否全部显示

   为了能够更好的描述出当前的问题,下面向emp表之中增加一行记录,此记录属于没有部门的雇员。

INSERT INTO emp(empno,ename,job) VALUES(8888,'LINDA','CLERK');

1、内连接(等值连接)

  之前使用的都是内连接。

SELECT e.empno,e.ename,e.job,d.deptno,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno;

  现在的代码是属于只有当“e.deptno=d.deptno”这个条件满足之后才会显示出对应的数据,如果此时数据为空,那么此条件无法满足则内容不显示。

2、外连接

  让等值判断的左右两边又一边的数据可以全部显示出来,如果要想实现外连接,则需要使用"(+)"的语法完成。

  ●左外连接:字段 = 字段(+);

  ●右外连接:字段(+) = 字段;

范例:观察左外连接

SELECT e.empno,e.ename,e.job,d.deptno,d.loc 
FROM emp e,dept d
WHERE e.deptno=d.deptno(+);

  此时全部的雇员信息可以正常显示出来了,但是由于没有对应的部门数据,所以此行记录的数据为空。

范例:观察右外连接

SELECT e.empno,e.ename,e.job,d.deptno,d.loc 
FROM emp e,dept d
WHERE e.deptno(+)=d.deptno;

  此时的程序,所有的部门信息会进行显示,但是由于此部门没有雇员,所以雇员的数据为空。

  在实现外连接的过程中,强烈不建议可以区分左连接或者右连接,一切以查询的结果为主,如果发现数据的查询结果之中缺少了内容,那么就利用外连接来控制。

范例:查询每个雇员的姓名、职位、领导姓名。

SELECT e.ename,e.job,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno;

  但是现在发现一个问题,此时的数据显示不完整。如果发现查询的数据不完整,那么建议使用外连接。

SELECT e.ename,e.job,m.ename
FROM emp e,emp m
WHERE e.mgr=m.empno(+);

  这种自己关联自己的查询,也称为自身关联,但是不管是不是自身关联,程序认得只是FROM之后有多少张数据表,有多张表就必须编写消除笛卡儿积的条件。