快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

ag娱乐馆app:MySQL数据库中对子查询的限制(1)



更正的同等缺陷:假如将NULL值与应用ALL、ANY或SOME的子查询进行对照,而且子查询返回空结果,对照操作将对NULL的非标准结果进行评估,而不是TRUE或FALSE。

子查询的外部语句可所以SELECT、INSERT、UPDATE、DELETE、SET或DO中的任何一个。

仅部分支持行对照操作:

·对付expr IN (subquery),expr可所以n-tuple(经由过程行构造法度榜样语法指定),而且子查询能返回n-tuples个行。

·对付expr op {ALL|ANY|SOME} (subquery),expr必须是标度值,子查询必须是列子查询,不能返回多列行。

换句话讲,对付返回n-tuples行的子查询,支持:

(val_1, ..., val_n) IN (subquery)

但不支持:

(val_1, ..., val_n) op {ALL|ANY|SOME} (subquery)

支持针对IN的行对照,但不支持针对其他的行对照,缘故原由在于,IN实施是经由过程将其从新编写为“=”对照和AND操作的序列完成的。该措施不能用于ALL、ANY或SOME。

未优越优化行构造法度榜样。下面的两个表达式是等效的,但只有第2个表达式能被优化:

(col1, col2, ...) = (val1, val2, ...)

col1 = val1 AND col2 = val2 AND ...

对付IN的子查询优化不如对“=”的优化那样有效。

对付不良IN机能的一种范例环境是,当子查询返回少量行,但外部查询返回将与子查询结果相对照的大年夜量行。

FROM子句中的子查ag娱乐馆app询不能与子查询有关系。在评估外部查询之前,将对它们进行详细化处置惩罚(履行以天生结果集),是以,不能按照外部查询的行对它们进行评估。

一样平常而言,不能变动表,并从子查询内的相同表进行选择。例如,该限定适用于具有下述形式的语句:

DELETE FROM t WHERE ... (SELECT ... FROM t ...);

UPDATE t ... WHERE col ag娱乐馆app= (SELECT ... FROM t ...);

{INSERT|REPLACE} INTO t (SELECT ... FROM t ...);

例外:假如为FROM子句中变动的表应用子查询,前述禁令将不再适用。例如:

UPDATE t ... WHERE col =

(SELECT (SELECT .ag娱乐馆app.. FROM t...) AS _t ...);

禁令在此不适用,这是由于FROM中的子查询已被详细化为临时表,是以“t”中的相关行已在满意“t”前提的环境下、在更新时当选中。

与子查询比拟,针对联合的优化法度榜样更成熟,是以,在很多环境下,假如将其改写为join(联合),应用子查询的语句能够更有效地履行。

但下述情形例外:IN子查询可被改写为SELECT DISTINCT联合。例如:

SELECT colag娱乐馆app FROM t1 WHERE id_col IN

(SELECT id_col2 FROM t2 WHERE condition);

可将该语句改写为:

SELECT DISTINCT col FROM t1,

t2 WHERE t1.id_col = t2.id_col AND condition;

但在该环境下,联合必要额外的DISTINCT操作,而且与子查询比拟,效率并不高。

可能的未来优化:MySQL不改写针对子查询评估的联合顺序。在某些环境下,假如MySQL将其改写为联合,能够更有效地履行子查询。这样,优化法度榜样就能在更多的履行规划间进行选择。例如,它能抉择是否首先读取某一表或其他。

例如:

SELECT a FROM outer_table AS ot

WHERE a IN (SELECT a FROM inner_table AS it WHERE ot.b = it.b);

对付该查询,MySQL总会首先扫描ouag娱乐馆appter_table,如然后针对每一行在inner_table上履行子查询。假如outer_table有很多行而inner_table只有少量行,查询的履行速率或许要慢于本应有的速率。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: