前言:
在开发中我们常常会看到where 作为join使用的,那查询出来的结果一样,我们该如何区分到底使用where还是join呢?
合并查询:
比如找出
员工姓名及其所在的部门名称。
select e.ename,d.dname from emp e , dept d where e.deptno = d.deptno;
这样写的缺点在于
在上面语句中,实际上是创建了两张表的笛卡尔积,所有可能的组合都会被创建出来。在笛卡尔连接中,在上面的例子中,如果有1000顾客和1000条销售记录,这个查询会先产生1000000个结果,然后通过正确的 ID过滤出1000条记录。 这是一种低效利用数据库资源,数据库多做100倍的工作。 在大型数据库中,笛卡尔连接是一个大问题,对两个大表的笛卡尔积会创建数10亿或万亿的记录。
那我们什么时候可以使用合并查询呢?
当两张表没有关联点,但是有需要将数据合起来查询,可以使用where
inner join
上面的sql可以写成
select e.ENAME,d.DNAME from EMP e inner join DEPT d on e.DEPTNO = d.DEPTNO
这样写的好处在于:
可以避免创建笛卡儿积,用inner join 这样数据库就只产生等于ID 的1000条目标结果,这样就增加查询效率。
总结:
能使用连接查询尽量使用连接查询,连接查询的性能也优于子查询,所以能用连接查询的地方尽量少用子查询。