当前位置:Gxlcms > 数据库问题 > oracle中的连接查询总结

oracle中的连接查询总结

时间:2021-07-01 10:21:17 帮助过:14人阅读

连接查询是指基于多张表或视图的查询。使用连接查询时,应指定有效的查询条件,不然可能会导致生成笛卡尔积。如现有部门表dept,员工表emp,以下查询因查询条件无效,而产生笛卡尔积:   (各语句中字段不做解释,主要显示逻辑关系)

select dept.dname,emp.ename from dept,emp where dept.name = ‘sales‘;

 有效查询条件应该指定dept表与emp表之间的连接关系。表之间连接关系多如下:

1.相等连接(=)

相等连接主要用于查询主从表之间的相关数据,如下:

select table1.col1,table2.col2 from table1,table2 where table1.col1 = table2.col2  ;

 同时可以用and指定其他查询条件,如修改第一句:

select dept.dname,emp.ename from dept,emp where dept.deptno = emp.deptno and dept.name = ‘sales‘;

 2.不等连接

不等连接指连接条件中使用除相等比较的其他比较操作,多用于在不同表之间显示特定范围信息。如下:

select a.enma, a.sal .b.grade from emp a, salgrade b where a.sal between b.losal and b.hisal;

 3.自连接

指在同一张表中的连接查询,主要用在自参照表上显示上下级关系或者层次关系。自参照表是指在不同列之间具有参照关系或者主从关系的表。如下,emp表中包含具有主从关系的两个字段,empno(雇员号),mgr(管理者号),为显示雇员与管理者之间的对应关系,可以用自连接:

技术分享

select manager.ename  from emp manager, emp worker where manager.empno = worker.mgr and worker.ename = ‘KING‘;

4.内连接与外连接

select table1.column, table2.column from table1 [inner | left | right | full] join table2 on table1.column1 = table2.column2;

 以上分别为内连接、左连接,有链接,完全连接,on子句用于指定连接条件。

内连接:用于返回满足查询条件的所有记录,默认情况下,在指定连接查询时如果没有指定任何连接操作,那其就为内连接,目前以上查询语句皆为内连接,举例,以下两句相同:

select dept.dname,emp.ename from dept,emp where dept.deptno = emp.deptno and dept.name = ‘sales‘;

select dept.dname,emp.ename from dept inner join emp on dept.deptno = emp.deptno and dept.name = ‘sales‘;

 左外链接:返回满足连接条件的所有记录,同时返回不满足连接条件的连接操作符左边表的其他行,即左边返回所有记录,右表只返回满足查询条件的记录。为方便,引用他人的例子说明查询效果(参考:http://www.blogjava.net/hello-yun/archive/2011/04/08/347890.html),如下:

SELECT * FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A;

查询效果如下:

技术分享

多表左外连接:

SELECT * FROM TESTA  LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTA.A=TESTC.A

 右外连接:如左外连接,即右表返回所有记录,坐标只返回满足查询条件的记录,如:

SELECT * FROM TESTA RIGHT JOIN TESTB ON TESTA.A=TESTB.A;

 查询效果如下: 

技术分享

完全外连接:即返回满足查询条件的记录,也返回不满足查询条件的其他记录,举例如下:

SELECT * FROM TESTA FULL JOIN TESTB ON TESTA.A=TESTB.A;

查询效果如下: 

技术分享

(+)操作:(+)执行外连接,将其放在显示较少行(完全满足连接条件行)的一端,需要注意的是(+)操作只能用于列,而不能用在表达式上,不能与or和in操作同时使用。

  用(+)实现左外连接:将上面左连接语句改为用(+)实现。

SELECT * FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A;
==
SELECT * FROM TESTA ,TESTB WHERE TESTA.A=TESTB.A(+);

SELECT * FROM TESTA  LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTA.A=TESTC.A
==
SELECT * FROM TESTA, TESTB,TESTC where TESTA.A=TESTB.A(+) and TESTA.A=TESTC.A(+);

SELECT * FROM TESTA  LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A LEFT OUTER JOIN TESTC ON TESTB.A=TESTC.A
==
SELECT * FROM TESTA, TESTB,TESTC where TESTA.A=TESTB.A(+) and TESTB.A=TESTC.A(+);

select a.dname, b.ename from dept a left join emp b on a.deptno = b.deptno and a.deptno =10;
==
select a.dname, b.ename from dept a, emp b where a.deptno = b.deptno(+) and a.deptno(+) =10;

 用(+)实现右外连接方式同左连接。

用(+)实现完全连接:

SELECT * FROM TESTA FULL JOIN TESTB ON TESTA.A=TESTB.A;
==
SELECT  TESTA.*,TESTB.* FROM TESTA LEFT OUTER JOIN TESTB ON TESTA.A=TESTB.A
UNION
SELECT TESTA.*,TESTB.* FROM TESTB LEFT OUTER JOIN TESTA ON TESTA.A=TESTB.A

 

oracle中的连接查询总结

标签:

人气教程排行