多表查询: 数据来源是多个表,这时注意一定要书写连接条件。当n个表连接,至少需要n-1个连接条件。
注意:
(1)如何判断两个表之间有公共列? 类型一致、宽度一致。(列名不能作为判断标准,列名不同也能是公共列 如:emp的empno和emp的mgr)
(2)如何避免二义性问题?给每个属性加归属。
(3)注意使用表别名。表别名一经定义,在该查询中只能使用该别名,原名不可再用。
列别名 vs 表别名: (列别名只能用在select和排序中)
(1)等值连接: 连接条件用=号,满足连接条件的记录输出,不满足的不输出。
查询每个员工的姓名和其所在部门名称。
select emp.deptno,emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno;
from emp inner join dept on emp.deptno=dept.deptno
(2) 自连接: 数据来源于自身,这时要使用表别名。
查询每个员工的姓名和其经理的姓名。
select e.ename,m.ename from emp e,emp m where e.mgr=m.empno;
(3)外连接:满足连接条件的记录输出,不满足的也输出。在oracle中,外连接运算符:(+),当其出现在等号的左边,为右外连接,反之为左外连接。
select e.ename,m.ename from emp e,emp m where e.mgr=m.empno(+); //左外连接
select e.ename,m.ename from emp e,emp m where m.empno(+)=e.mgr; //右外连接
(4) 不等连接:连接条件用除等号以外的运算符。这时,表与表之间通常没有公共列。
查询每个员工的工资等级。 salgrade
select emp.ename,emp.sal,r.grade from emp,salgrade r where emp.sal between r.losal and r.hisal;
如何提升连接查询的效率?
SQL99连接方法。