6.主查询和子查询不是一张表
-- 查询销售部员工
select *
from emp
where deptno=(select deptno
from dept
where dname='SALES');
-- 多表查询的方式解决同样问题,相对上面,这里数据库访问一次,效率得根据实际数据量模式
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
多表查询,与子查询,可以实现同样的结果,但是哪种效率高?
理论上,多表查询的效率高,因为只有一个from,读去一次数据库;但是,多表查询会产生笛卡尔集,如果数据量大,笛卡尔集很大,查询的效率可能比子查询要低,所以要根据实际情况选择到底是多表查询还是子查询;
主查询和子查询可以不是同一张表
1、查询部门名称是SALES的员工信息

多表查询
select e.* from emp e,dept d where e.deptno=d.deptno and d.dname='SALES'
主查询和子查询可以不是一张表
即涉及到多表操作时,有两种解决方案,方案一是子查询,方案二是多表查询
例:查询部门名称是sales的员工信息
方法一
select *
from emp
where emp_no = ( select emp_no
from dept
where dept_name = ' sales');
方法二
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES'; 等于下面的查询
select *
from emp
where deptno=(select deptno
from dept
where dname='SALES');
主查询和子查询不是同一张表 ,理论上多表查询比子查询效率高。
但因为多表查询会产生笛卡尔集,所以还要看实际情况。
select *
from emp
where deptno=(select deptno
from dept
where dname='SALES');
等价于:
select e.*
from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES';
尽量选择访问次数少的方法
多表查询和子查询,最好使用多表查询,因为子查询需要访问两次数据库,而多表查询只需访问一次
--查询销售部的员工信息
--where 子查询
select *
from emp
where deptno=(select deptno from dept t where t.dname='SALES')
--多表查询(理论上更优 只有一个from 一次操作数据库)
select * from emp e,dept d
where e.deptno=d.deptno and d.dname='SALES'