MySQL行构造器表达式优化(Row Constructor Expression)

mysql 官方文档行构造器表达式优化(Row Constructor Expression Optimization)这一节里面,对行构造表达式及其优化进行了介绍,因为用的不多,也没太关注过。但是看了几个示例,发现有一些逻辑还是与预想的不一样,下面详细介绍。

1. 行构造表达式示例

SELECT * FROM t1 WHERE (column1,column2) = (1,1);

其中 (column1,column2) 与 (1,1)就是行构造表达式。

(column1,column2) = (1,1) 这个表达式,在逻辑上,等同于:

column1 = 1 AND column2 = 1

这个也比较好理解,但是,如果把

(column1,column2) > (1,1) 理解为 column1 > 1 AND column2 > 1,那就错了。实际上应该是

column1 > 1 OR ((column1 = 1) AND (column2 > 1))

如果不相信的话,看下面这个案例:

mysql> select * from t_test; +------+------+------+ | c1 | c2 | c3 | +------+------+------+ | 1 | 1 | 1 | | 1 | 1 | 0 | | 1 | 2 | 2 | | 1 | 2 | -1 | +------+------+------+ 4 rows in set (0.00 sec) mysql> select * from t_test where c1=1 AND (c2,c3) > (1,1); +------+------+------+ | c1 | c2 | c3 | +------+------+------+ | 1 | 2 | 2 | | 1 | 2 | -1 | +------+------+------+ 2 rows in set (0.00 sec) mysql> select * from t_test where c1 = 1 AND (c2 > 1 OR ((c2 = 1) AND (c3 > 1))); +------+------+------+ | c1 | c2 | c3 | +------+------+------+ | 1 | 2 | 2 | | 1 | 2 | -1 | +------+------+------+ 2 rows in set (0.00 sec)