关于Oracle数据库的学习记录:
十四、多表查询
1.从多张数据表里取出数据
范例:统计emp表中的数据量
SELECT COUNT(*) FROM emp; ----14行记录
范例:统计dept表中的数据量
SELECT COUNT(*) FROM dept; ----4行记录
范例:实现多表查询
SELECT * FROM emp,dept;
实现了多表查询,但是查询的结果发现有了惊喜,一共产生了56行的记录
SELECT * FROM emp,dept WHERE emp.deptno=dept.deptno;
CONN sh/sh;
SELECT COUNT(*) FROM costs;
SELECT COUNT(*) FROM sales;
SELECT COUNT(*) FROM costs,sales WHERE sales.prod_id=cost.prod_id;
以上的代码已经提供了消除积的条件,但是,执行速度依然很慢,因为总的数据量很大;一定要记住一个原则:多表查询性能一定是很差的,在开发之中应该尽可能回避。但是,在进行列访问的时候发现都使用了表名称,严格来讲,这样也不好,万一表名称很长?
所以在进行多表查询的时候建议使用别名
范例:使用别名
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;
任何情况下,如果要实现多表查询操作,永远都有一个前提:要关联的数据表一定要有关联字段条件,不存在这些要求,一定不能够使用多表查询
范例:要求显示每个雇员的编号、姓名、职位、工资、部门名称、部门位置
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc FROM emp e,dept d WHERE e.deptno=d.deptno;
范例:要求显示每个雇员的编号、姓名、职位、工资、工资等级
**确定要使用的数据表
|-emp表:雇员的编号、姓名、职位、工资
|-salgrade表:工资等级
**确定已知的关联字段
|-雇员与工资等级:
SELECT e.empno,e.ename,e.job,e.sal,s.grade FROM emp e,salgrade s WHERE e.sal BETWEEN s.losal AND s.hisal;
范例:查询每个雇员的编号、姓名、职位、工资、工资等级、部门名称
**确定要使用的数据表
|-emp表:雇员的编号、姓名、职位、工资
|-salgrade表:工资等级
|-dept表:部门名称
**确定已知的关联字段
|-雇员与工资等级:emp.sal BETWEEN salgrade.losal AND salgrade.hisal;
|-雇员与部门:emp.deptno=dept.deptno;
一般情况下如果是多个消除笛卡尔积的条件都会使用AND进行连接
SELECT e.empno,e.ename,e.job,e.sal,s.grade,d.dname FROM emp e,salgrade s,dept d WHERE e.sal BETWEEN s.losal AND s.hisal AND e.deptno=d.deptno;