Oracle系列:(13)多表查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle系列:(13)多表查询相关的知识,希望对你有一定的参考价值。

多表查询,包括等值连接等值连接外连接自连接

内连接,包括等值连接非等值连接


员工表emp和部门表dept的笛卡尔集(笛卡尔集表=列数之和,行数之积,笛卡尔集表内中有些数据是不符合要求的)

select emp.ename,dept.dname
from emp,dept;


使用等值连接/内连接(只能使用=号),显示员工的编号,姓名,部门名,使用表别名简化

select emp.empno,emp.ename,dept.dname,dept.deptno
from emp,dept
where emp.deptno = dept.deptno;


使用非等值连接(不能使用=号,其它符号可以,例如:>=,<=,<>,betwen and等),显示员工的编号,姓名,月薪,工资级别

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

技术分享


内连接查询:只能查询出符合条件的记录

外连接查询:既能查询出符合条件的记录,也能根据一方强行将另一个方查询出来


使用外连接,按部门10,20,30,40号,统计各部门员工人数,要求显示部门号,部门名,人数

部门号 部门名        人数

10     ACCOUNTING    3 

20     RESEARCH      5

30     SALES         6

40     OPERATIONS    0


等值连接/非等值连接/内连接只会查询出多张表中,根据某个字段匹配,符合条件的记录,不符合条件的记录是不会存在的


左外连接[是oracle专用的,不是SQL99规则]:

select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数"
from dept,emp
where dept.deptno = emp.deptno(+) 
group by dept.deptno,dept.dname;

技术分享


右外连接:

select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数"
from dept,emp
where emp.deptno(+) = dept.deptno
group by dept.deptno,dept.dname;

技术分享


使用左外连接,按部门10,20,30,40号,统计各部门员工人数,要求显示部门号,部门名,人数,且按人数降序排列

select dept.deptno "部门号",dept.dname "部门名",count(emp.empno) "人数"
from dept,emp
where dept.deptno = emp.deptno(+) 
group by dept.deptno,dept.dname
order by 3 desc;

技术分享


使用自连接,显示"SMITH的上级是FORD"这种格式

select users.ename || ‘的上级是‘ ||boss.ename
from emp users,emp boss
where users.mgr = boss.empno;

只有13条记录,不含有KING

技术分享


基于上述问题,将KING的上级是“”显示出来

select users.ename || ‘的上级是‘ ||boss.ename
from emp users,emp boss
where users.mgr = boss.empno(+);

14条记录

注意:自连接也用到内连接和外连接

技术分享







以上是关于Oracle系列:(13)多表查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle(sql)文盲大扫除思维导图系列——多表连接查询子查询

oracle多表查询

oracle多表查询

Oracle 查询技巧与优化 多表查询

Oracle 第13章 当一个查询依赖另一个查询

《卸甲笔记》-多表查询之二