1。存在的
执行流程
从存在的T1中选择*(从T2中选择NULL,在这里,y = x)
它可以理解为:
复制代码代码如下所示:
对于x在(选择*从T1)
环
如果(存在(选择空从T2在y = x.x)
然后
输出记录
最后如果
结束循环
存在与存在的
性能差异:
如果子
查询的子集导致更少的记录,则主查询中的表更大,索引更大。在应该使用。否则,如果外层的主要查询记录较少,子查询中的表是大的,并且在索引时存在。
事实上,我们区分和存在主要是由
驱动程序的变化引起的(这是关键性的变化),如果它是存在的,那么在外部表驱动表,访问前,如果是,那么先执行子查询,所以我们要开车快速返回的
目标,那么关系考虑的指标和结果集。
此外,在不
处理null的
情况下,例如:
选择1双,空(0,1,2,null)
结果是空的。
2。不在而且不存在:
不存在的执行流
复制代码代码如下所示:
选择…
从汇总R
在不存在(select'found'from标题T)
在r.source_id = t.title_id);
它可以理解为:
复制代码代码如下所示:
为x(SELECT * FROM汇总)
环
如果(不存在(那个查询))
输出
最后如果;
结束;
注:不存在,不在不能完全替代对方,以查看具体要求。如果选定的列可以是空的,它是不能取代的。
例如,下面的语句,它们之间的
区别:
从T中选择x,y;
X Y
—
十三
三十一
十二
十一
三十一
五
从T中选择x,不在(从T T2中选择y)
没有行
从T不存在的地方选择*(从T T2中选择NULL)
在T2 y = t.x)。
X Y
—
5空
所以具体的要求就决定了。
不存在与不存在的性能差异:
不是只有当查询字段,选择关键词后非空约束或不曾建议,如果在主查询的大桌子,在子查询,但记录的一张小桌子,你应该使用反不在,和哈希联接。
如果主查询表中的记录,表中查询记录,并且有一个指标,你可以使用不存在,不在,也可与最好的是空hash_aj * / / * +
不在更好的成本为基础的应用
例如:
复制代码代码如下所示:
选择…
从汇总R
在不存在(select'found'from标题T)
在r.source_id = t.title_id);
变为(好)
选择…
从标题、汇总R
在r.source_id = t.title_id(+)
和t.title_id是空的;
或(好)
SQL >选择hash_aj / * +…
从汇总R
在ource_id没有(选择ource_id)
从标题T
在ource_id不为空)
注:以上只是一些理论上的建议。最好的原则是,我们可以使用执行计划,分析最好的句子,在此基础上。
/ / =============================
存在,不存在摘要
1存在
SELECT * FROM anken_m存在(
选择my_list_temp_m.sales_code
从my_list_temp_m
在my_list_temp_m。sales_code = anken_m sales_code)。
解释uff1a
1)查询两anken_m表和my_list_temp_m表存在的sales_code。
2)sales_code是anken_m的关键,对my_list_temp_m外键。
小心 uff1a
1)外anken_m查询表是查询对象。
2)内查询表my_list_temp_m是一个有
条件的对象。
3)内部和外部层的查询表不能相同。
4)的anken_m表,作为协会的条件,不需要内部查询后加入。
5)左、右的my_list_temp_m秩序。sales_code = anken_m.sales_code状况不
影响查询结果。
2不存在
SELECT * FROM anken_m哪里不存在(
选择my_list_temp_m.sales_code
从my_list_temp_m
在my_list_temp_m。sales_code = anken_m sales_code)。
解释uff1a
1)查询中存在的anken_m表,但sales_code不在my_list_temp_m表存在。
2)sales_code是anken_m的关键,对my_list_temp_m外键。
小心 uff1a
1)外anken_m查询表是查询对象。
2)内查询表my_list_temp_m是一个有条件的对象。
3)内部和外部层的查询表不能相同。
4)的anken_m表,作为协会的条件,不需要内部查询后加入。
5)左、右的my_list_temp_m秩序。sales_code = anken_m.sales_code状况不影响查询结果。
3综合应用
更新anken_m
集(plan_type_code,branch_name,business_type_code)
=(选择anken.plan_type_code,anken.branch_name,安肯。business_type_code)
从安肯
在安肯。sales_code = anken_m sales_code)。
(存在的地方
选择anken.sales_code
从安肯,my_list_temp_m
在my_list_temp_m sales_code = anken.sales_code。
和sales_code = anken_m.sales_code安肯。
)
解释uff1a
1)用一张表的记录数据更新另一张表的记录数据。
2)用SQL语句进行批处理更新。
2)sales_code是安肯,anken_m的关键,和my_list_temp_m外键。
小心 uff1a
1)更新的字段集合中的语句必须对应于数据源的领域之一,并且在数据源的查询条件必须限制记录。也就是说,根据sales_code,一个记录和一个记录anken_m安肯可以唯一确定,以确保关键最新的记录和数据源的记录是一样的。
2)根据存在的说法,你可以确定数据源的记录,即范围,记录在安肯表可以用来更新anken_m表。所以anken_m不需要后,在那里存在的声明说。