利用连接查询,速率会比子查询快良多,由于不必每次用IN操纵在子语句中的了局会合搜刮数据。特别当表中数据良多,前往的了局集也很年夜时,其差别是相称惊人的。假如在多处置器,多硬盘的服务器上运转,连接查询还能够充实使用并交运算来进步效力。1999年炎天,IBM公司的工程师们在兰州年夜学列席天下数据库手艺集会时,向我们解说了使用并交运算手艺优化连接查询所带来的功能飚升。比拟之下,子查询在这方面有点亏损。有些壮大的数据库引擎会在得当的时分将子查询转化为连接查询,或反之。但把真谛把握在我们本人手中,不是更好吗?
固然,子查询并非必定比连接慢,无机会我也会演示一些子查询快于连接查询的例子,乃至有些子查询语句,用连接是很难完成的。实际来说,连接查询会天生一个迪卡尔积,这个汇合的巨细是构成它的各个子集的乘积。这会带来空间上的伟大开支(实践我们所见的数据库体系没有一个真这么干的)。而子查询的情形对照庞大。由天生的了局集来分,有标量子查询和向量子查询,(标量子查询指前往一个复杂数据的查询,这类子查询语句在MSSQLServer中能够间接做为内部查询语句的一列);由子查询与内部查询的干系来分,有相干子查询和非相干子查询(相干子查询的了局集取决于内部查询以后的数据行,非相干子查询反之)。一般相干子查询对照让人头痛,它必要重复实行子查询语句,若内部查询操纵的数据集(不是前往的数据集)行数为n,子查询操纵的数据集行数为m,那它的庞大度最上将是m的n次方!加上子查询数据集睁开带来的伟大空间开支,会极年夜影响速率。上例中的子查询对照侥幸,是一个有关的向量子查询,但即便云云,也要在运算中保留一个子了局集并对其重复操纵,并且难以并交运算,了局是它的速率不会比连接查询快。这也就是MySQL在很长工夫里一向不撑持子查询的缘故原由。在一般情形下,年夜数据集的操纵,连接查询的功能老是优于子查询,以是我们应该充实把握这一办法。
以例2中终极的连接查询为例,我们剖析一下编写这类连接查询的思绪。后面提到,在实际上,连接数据集时,会天生一个迪卡尔积。假如有一个表T的内容以下:
Word
----
a
b
那末实行“SELECTL.Word,R.WordFROMTASLJOINTASRONL.Word=R.Word”时,会师长教师成
L.WordR.Word
aa
ab
ba
bb