MySQL数据库中对子查询的限制
2007-10-29 11:01:38 来源:WEB开发网更正的一致缺陷:如果将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子句中的子查询不能与子查询有关系。在评估外部查询之前,将对它们进行具体化处理(执行以生成结果集),因此,不能按照外部查询的行对它们进行评估。
一般而言,不能更改表,并从子查询内的相同表进行选择。例如,该限制适用于具有下述形式的语句:
更多精彩
赞助商链接