笛卡儿积 就行两表相乘
oracle 表连接分为 等值连接 不等值连接 外连接 自连接
SQL> --等值连接
SQL> --查询员工信息: 员工号 姓名 月薪 部门名称
SQL> select empno,ename,sal,dname
2 from emp,dept
3 where emp.deptno=dept.deptno;
SQL> ed
已写入 file afiedt.buf
1 select empno,ename,sal,dname
2 from emp e,dept d
3* where e.deptno=d.deptno
SQL> /
SQL> --不等值连接
SQL> --查询员工信息: 姓名 月薪 工资级别
SQL> select ename,sal,grade
2 from emp e,salgrade s
3 where e.sal between s.losal and s.hisal;
SQL> --外连接
SQL> --按部门统计员工人数: 部门号 部门名称 人数
SQL> select d.deptno,d.dname,count(e.empno)
2 from dept d,emp e
3 where d.deptno=e.deptno
4 group by d.deptno,d.dname;
SQL>--以上结果部队
SQL> /*
SQL> 外连接解决的问题:当条件不成立时,任然希望在结果中包含不成立的记录
SQL> 左外连接: where d.deptno=e.deptno 当不成立时,等号左边代表的表的信息任然被包含
SQL> 写法: where d.deptno=e.deptno(+)
SQL> 右外连接: where d.deptno=e.deptno 当不成立时,等号右边代表的表的信息任然被包含
SQL> 写法:where d.deptno(+)=e.deptno
SQL> */
SQL> select d.deptno,d.dname,count(e.empno)
2 from dept d,emp e
3 where d.deptno=e.deptno(+)
4 group by d.deptno,d.dname;
DEPTNO DNAME COUNT(E.EMPNO)
---------- -------------- --------------
10 ACCOUNTING 3
40 OPERATIONS 0
20 RESEARCH 5
30 SALES 6
SQL> select d.deptno,d.dname,count(e.empno)
2 from dept d left join emp e ON d.deptno=e.deptno
3 group by d.deptno,d.dname;
SQL> ed
已写入 file afiedt.buf
1 select d.deptno,d.dname,count(e.empno)
2 from dept d,emp e
3 where d.deptno=e.deptno(+)
4 group by d.deptno,d.dname
5* order by 1
SQL> /
DEPTNO DNAME COUNT(E.EMPNO)
---------- -------------- --------------
10 ACCOUNTING 3
20 RESEARCH 5
30 SALES 6
40 OPERATIONS 0
SQL> --自连接
SQL> --查询员工信息:***的老板是***
SQL> select e.ename||'的老板是'||b.ename
2 from emp e,emp b
3 where e.mgr=b.empno;
SQL> --自连接:利用表的别名,将同一张表视为多张表
SQL> --层次查询
SQL> --自连接不太适合操作大表
层次查询
SQL> --层次查询: 对同一张表的前后两次操作,进行连接
SQL> select level,empno,ename,mgr
2 from emp
3 connect by prior empno=mgr
4 start with mgr is null
5 order by 1;