我们用数据库进行一些查询时,可能需要对结果进行去重复,一般我们都是想到distinct,但是为了提高效率我们应该尽量用exists,下
面我将举例分析。
我们假设有一张公司员工表staffs和一张部分表depts,其中员工表中包含字段dp_id,也就是部分编号,depts表中包含dp_id和dp_name,
分别表示部门和部分名字。我们现在要做的就是,找到这张员工表中涉及到的部门id和部门名字。
用distinct实现如下:
select d.dp_id,d.dp_name from depts d,staffs s where d.dp_id=s.dp_id;
这样写的sql语句执行过程是:先遍历执行部门表中的每一行,因为每一行对应一个dp_id,然后在固定dp_id的情况下表里staffs表中的每一行,直到运行到staffs表的最后一行。然后在换下一个dp_id进行查找,又要遍历staffs表中的每一行,以此类推,直到所有的dp_id都比较过。
用exists实现如下:
select d.dp_id,d.dp_name from depts d where exists(select null from staffs s where s.dp_id=d.dp_id)
首先说明一下exists的工作原理,exists语句用来判断()内的表达式是否存在返回值,如果存在就返回true,如果不存在就返回false,所以在上面语句中我们使用select null,因为返回什么数据不重要,重要有值返回就行。
另外exists的有点是,它只要括号中的表达式有一个值存在,就立刻返回true,而不用遍历表中所有的数据。
所以在dp_id同样多的情况下,用distinct需要每次都遍历staffs表进行比对,而使用exists只需要比对staffs表的一部分,在staffs表数据十分庞大时,这种性能差别就能更好的体现出来。