多表查询

来源:互联网 发布:qq飞车暗夜王爵数据 编辑:程序博客网 时间:2024/05/29 16:04


笛卡尔集:笛卡尔集是多表查询的理论基础。笛卡尔集的行数是两个表行数的乘机,列数等于两个表相加。在多表查询的时候尽量少使用笛卡尔全集。

笛卡尔集会在下面条件下产生:

1、省略连接条件

2、连接条件无效

3、  所有表中的所有行互相连接

注:在实际运行环境下,应避免使用全笛卡尔集,为了避免笛卡尔集,可以在 WHERE加入有效的连接条件。

连接的类型

等值连接(Equijoin):where后的条件是相等关系,如果表有N个,那个条件至少有N-1个。

例:查询员工信息; 员工号 姓名 月薪和部门名称

 select e.empno,e.ename,e.sal,d.dname from empe,dept d where e.deptno=d.deptno;

不等值查询(Non-equijoin):where后的条件是不相等关系

例:查询员工信息; 员工号 姓名 月薪并且薪水在最高与最低级别之间。

 select e.empno,e.ename,e.sal,s.grade from empe,salgrade s where e.sal between s.losal and s.hisal;

外连接(Outer join)

                   左外连接:where e.deptno=d.deptno 不成立,等号左边所代表的表信息仍然被包含

写法:where e.deptno=d.deptno(+)

右外连接: where e.deptno=d.deptno 不成立,等号右边所代表的表信息仍然被包含

   写法:where e.deptno(+)=d.deptno

 

         右外连接

例:按部门统计员工人数: 部门号 部门名称 人数(但是当部门没有人的时候就查不出数据,并且也不会显示部门,所以就要用到外连接)

select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数from emp e,dept d

where e.deptno(+)=d.deptno groupby d.deptno,d.dname;

    部门号部门名称            人数                                                                                   

---------- -------------- ----------                                                                                   

       10 ACCOUNTING              3                                                                                   

       40 OPERATIONS              0                                                                                    

       20 RESEARCH                5                                                                                   

       30 SALES                   6                                                                                   

自连接(Self join):将一张表看做是两张表,再用等值连接操作。

         注:但是自连接有弊端,看成两张表就会产生笛卡尔集,并且是成倍增长的。因此自连接不适合操作大表。为了解决这个问题可以用到层次查询

例:查询员工信息:****的老板是****

select e.ename||'的老板是'||b.ename from emp e,emp b where e.mgr=b.empno;

层次查询

         为了解决自连接不能操作大表,因此层次查询就查询一张表

SQL> select level,empno,ename,mgr       level伪列(层次)

 2  from emp

 3  connect by prior empno=mgr      connect by连接  prior前面的员工号等于后面的老板号     

 4  start with mgr is null;          start with起始点(没有老板了)

 

原创粉丝点击