Oracle数据库的多表查询
笛卡尔集
多表查询:从多个表中获取数据
笛卡尔集:一种集合 是两个集合的积
表的笛卡尔集:列数相加,行数相乘
举例:
Select emno,ename,员工表.deptno,部门表.deptno,danme from 部门表,员工表,
Where 员工表.deptno = 部门表.deptno;
注意:为了避免笛卡尔集,可以再where子句中加入有效的连接条件
连接条件至少有n-1个,n代表表的个数
在表中有相同列时,在列名之前加上表名前缀。
等值与非等值连接
等值连接:指用等值比较符(=)指定连接条件的查询
举例:查询员工信息,要求显示:员工号,姓名,职位,部门,名称
Select empno,ename,job,dname from emp,dept where emp.deptno=dept.deptno;
区分不同表中重复的列名:
a.使用表名前缀在多个表中区分相同的列。
Select empno,ename,job,dname
From emp,dept where emp.deptno=dept.deptno;
b.使用表名前缀可以提高执行效率
Select emp.empno,emp.ename,emp.job,dept.dname
From emp,dept
Where emp.deptno = dept.deptno;
c.使用表的别名,可以简化连接查询并提高查询性能。
Select e.empno,e.ename,e.job,d.dname
From emp e,demp d
Where e.deptno = d.deptno;
多个连接条件时使用AND操作符
Select e.empno,e.ename,e.job,d.dname
From emp e,demp d
Where e.deptno = d.deptno and e.deptno = 10;
不等值连接:
指使用除等值比较符之外的其他比较操作符执行连接查询
举例:显示所有员工的员工号,姓名,工资及其工资的等级
Select e.empno,e.ename,e.sal,s.grade
From emp e,salgrade s
Where e.sal between losal and hisal;
外连接:
标准连接的扩展,不仅会返回满足条件的所有记录,而且还会返回不满足连接条件的部分记录。
举例:按部门统计员工的人数,要求显示:部门号,部门名称,人数
Select d.deptno,d.dname,count(e.empno)
from emp e,dept d
where e.deptno = d.deptno group by d.deptno,d.dname;
外连接的语法:外连接是使用(+)操作符来完成的
左(外)连接:用于返回左表的全部记录,右表的满足条件的记录
LEFT[OUTER]JOIN
Select e.ename,e.sal,d.dname from dept d left join emp e on e.deptno = d.deptno;
左(外)连接
Select table1column,table2column
From table1,table2
Where table1.column = table2.column(+);
//table1.column全部和 table2.column部分
//带(+)的,都是部分,不带的都是全部
右(外)连接:用于返回右表的全部记录,左表的满足条件的记录
RIGHT[OUTER]JOIN
Select e.ename,e.sal,d.dname from dept d right join emp e on e.deptno=d.deptno;
右(外)连接
Select table1column,table2column
From table1,table2
Where table1.column(+) = table2.column
//table2.column全部和table1.column部分
完全(外)连接:左表和右表的全部数据 FULL[OUTER] JOIN
Select e.ename,e.sal,d.dname from dept d full join emp e on e.deptno=d.deptno;
自连接
实质:将同一张表看成是多张表
举例:查询所有员工的姓名及其直属上级姓名
Select e.ename m.ename from emp e, emp m
Where e.mgr = m.empno