笛卡尔集:笛卡尔集是多表查询的理论基础。笛卡尔集的行数是两个表行数的乘机,列数等于两个表相加。在多表查询的时候尽量少使用笛卡尔全集。
笛卡尔集会在下面条件下产生:
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起始点(没有老板了)