Oracle数据库的查询之多表查询(五)
一.多表连接的基本查询 SELECT * FROM emp; --14条记录
SELECT * FROM dept;--4条记录
SELECT * FROM emp,dept;--显示56条数据??为什么
分析:两张表在进行查询的时候产生了笛卡尔积,就是两张表数据的乘积, 例如:查询员工信息:员工号 姓名 月薪 部门名称
select e.empno,e.ename,e.sal,d.dname
from emp e,dept d
where e.deptno = d.deptno;
2.不等值连接 select * from salgrade;查询出工资的等级
GRADE LOSAL HISAL
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
例如:查询员工信息:员工号 姓名 月薪 工资级别
select e.empno 员工号,e.ename 姓名,e.sal 月薪,s.grade 工资级别
from emp e,salgrade s
where e.sal between s.losal and s.hisal;
3.外连接 例如:按部门统计员工信息:部门号 部门名称 人数
select d.deptno 部门号,d.dname 部门名称,count(e.empno) 人数 from emp e,dept d where e.deptno=d.deptno group by d.deptno,d.dname;
查询的结果为: 所以最后的语句为:
select d.deptno,d.dname,count(e.ename) from emp e,dept d where e.deptno(+) = d.deptno group by d.deptno,d.dname;
部门号 部门名称 人数 10 ACCOUNTING 3 40 OPERATIONS 0 20 RESEARCH 5 30 SALES 6 4.自连接 例如:查询员工信息: 员工姓名 老板姓名
select e.ename 员工姓名,b.ename 老板姓名 from emp e,emp b where e.mgr=b.empno;
select count(*) from emp e,emp b;这样查询出的结果为196条
结论:自连接不适合操作数据较多的表 补充:使用层次查询上面自连接查询操作. 这里level列是伪列
select level,empno,ename,mgr from emp connect by prior empno=mgr start with mgr is null order by 1;
LEVEL EMPNO ENAME MGR 1 7839 KING 2 7566 JONES 7839 2 7698 BLAKE 7839 2 7782 CLARK 7839 3 7902 FORD 7566 3 7521 WARD 7698 3 7900 JAMES 7698 3 7934 MILLER 7782 3 7499 ALLEN 7698 3 7788 SCOTT 7566 3 7654 MARTIN 7698 3 7844 TURNER 7698 4 7876 ADAMS 7788 4 7369 SMITH 7902 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |